Контекстные меню HTML5

Firefox Context Menu

Обновление: контекстные меню отображаются даже если отключен JavaScript; так что лучше всего создавать их разметку с его помощью. Либо с помощью innerHTML в сложных случаях, либо с помощью DOM API в простых.

Один из брильянтов в пыли спецификации HTML5 это контекстные меню. Они позволяют разработчикам создавать свои собственные контекстные меню для определенных блоков с помощью элементов menu и menuitems. Так как информация о меню находится прямо на странице, то нет необходимости создавать плагины. Давайте я покажу как это делается!

Пример того, что у нас получится в итоге.

HTML

Для начала напишем HTML и определим ID меню:

<section contextmenu="mymenu">
    <!--
        Из соображений чистоты кода 
        я помещу меню в блок, в котором оно будет использоваться
    -->
</section>

Теперь давайте создадим пользовательские пункты контекстного меню для этого блока:

<menu type="context" id="mymenu">
    <menuitem label="Обновить пост" onclick="window.location.reload();" icon="/images/refresh-icon.png"></menuitem>
    <menuitem label="Перейти к комментариям" onclick="window.location='#comments';" icon="/images/comment_icon.gif"></menuitem>
    <menu label="Поделиться в ..." icon="/images/share_icon.gif">
        <menuitem label="Twitter" icon="/images/twitter_icon.gif" onclick="goTo('//twitter.com/intent/tweet?text=' + document.title + ':  ' + window.location.href);"></menuitem>
        <menuitem label="Facebook" icon="/images/facebook_icon16x16.gif" onclick="goTo('//facebook.com/sharer/sharer.php?u=' + window.location.href);"></menuitem>
    </menu>
</menu>

Теперь, когда у нас есть тег menu для которого задан атрибут type="context" и id, значение которого соответствует значению атрибута contextmenu блока, для которого меню предназначено, контекстное меню будет создано.

У элементов меню могут быть атрибуты label, icon, и onclick, которые будут определять его представление и поведение. Атрибут onclick может вызывать предопределенные функции или содержать инлайн-код. Множество элементов могут использовать одно и тоже меню, так что дублировать их не понадобится.

Это то самое место, где мне бы стоило написать обо всем более детально, но это так просто, что я не хочу быть нудным… Посмотрите пример.

Единственный браузер, который поддерживает это API на данный момент Mozilla Firefox. Я бы не сказал, что контекстное меню — критически необходимая фича, но это мило и я планирую в ближайшее время добавить её в свой блог. Это API прекрасная демонстрация принципа «ненавязчиво делает жизнь лучше и совершенно не вредит». Мой пример с публикацией в социальных сетях крайне примитивен и вторичен; есть идеи как можно использовать API контекстного меню с большей пользой? Расскажите об этом в комментариях!