Неактивное контекстное меню в браузере. Подробный разбор вариантов контекстного меню Windows. Что есть контекстное меню

  • Перевод
  • Tutorial

Веб-приложения на сегодняшний день становятся новым шагом на пути развития веба. Это уже далеко не обычные информационные сайты. В качестве примера передовых веб-приложений можно привести Gmail и Dropbox. С ростом функциональности, доступности и полезности веб-приложений растет и потребность в увеличении эффективности их использования. В данном руководстве будет рассмотрено создание такой полезной штуки, как собственное контекстное меню, и в частности:

  • Разберемся, что такое контекстное меню и зачем оно нужно.
  • Реализуем свое контекстное меню, используя JS и CSS.
  • Затронем недостатки и ограничения используемого подхода, чтобы знать, какие проблемы могут нас предостерегать при выкатывании всего этого в продакшн.
  • Что есть контекстное меню? Если верить Википедии , контекстное меню - меню, появляющееся при взаимодействии пользователя с графическим интерфейсом (при нажатии правой кнопки мыши). Контекстное меню содержит ограниченный набор возможных действий, который обычно связаны с выбранным объектом.

    На вашем компьютере клик правой кнопкой мыши на рабочем столе вызовет контекстное меню операционной системы. Отсюда вы, вероятно, можете создать новую папку, получить какую-то информацию и сделать что-нибудь еще. Контекстное меню в браузере позволяет, например, получить информацию о странице, посмотреть ее исходники, сохранить изображение, открыть ссылку в новой вкладке, поработать с буфером обмена и всякое такое. Причем набор доступных действий зависит от того, куда именно вы кликнули, то есть от контекста. Это стандартное поведение, закладываемое разработчиками браузера [И расширений к нему ].

    Веб-приложения постепенно начинают заменять стандартные контекстные меню своими собственными. Отличными примерами являются все те же Gmail и Dropbox. Вопрос лишь в том, как сделать свое контекстное меню? В браузере при клике правой кнопкой мыши срабатывает событие contextmenu. Нам придется отменить поведение по умолчанию и сделать так, чтобы вместо стандартного меню выводилось наше собственное. Это не так уж сложно, но разбираться будем пошагово, так что выйдет довольно объемно. Для начала создадим базовую структуру приложения, чтоб разрабатываемый пример не был совсем уж оторван от реальности.

    Список задач Представим, что мы создаем приложение, позволяющее вести список задач. Я понимаю, вы уже наверняка неимоверно устали от всех этих списков задач, но пусть будет. Страница приложения содержит список незавершенных задач. Для каждой задачи доступен типичный набор действий CRUD: получить информацию о задаче, добавить новую, редактировать, удалить.

    Пример результата есть на CodePen . Можете заглянуть туда сразу, если лень читать или хотите убедиться, что действительно заинтересованы в дальнейшем чтении. Ну а пока приступим к пошаговой разработке задуманного. Я буду использовать некоторые современные фишки CSS и создам простейший список задач на data-атрибутах. Также воспользуюсь сбросом стилей от Эрика Мейера и сброшу свойство box-sizing для всех элементов в border-box:
    *, *::before, *::after { box-sizing: border-box; }
    Я не буду использовать префиксы в CSS, но в демо на CodePen включен автопрефиксер.

    Создание базовой структуры Откроем наш HTML-документ, накидаем шапку, контентную часть с некоторым списком задач и подвал. Я также подтяну Font Awesome и шрифт Roboto, чтобы сделать оформление немного лучше. Каждая задача должна содержать атрибут data-id, который в реальности брался бы из БД. Также каждая задача будет содержать список действий. Вот важные части разметки:
    • Go To Grocery

    Если вы используете CodePen, можете в настройках включить автопрефиксер и подключение CSS-сброса. В противном случае придется делать все руками, если еще не автоматизировали этот процесс. Не забывайте, что наша цель - создание контекстного меню, так что обработка действий не будет реализована. А теперь давайте добавим еще немного CSS:
    /* tasks */ .tasks { list-style: none; margin: 0; padding: 0; } .task { display: flex; justify-content: space-between; padding: 12px 0; border-bottom: solid 1px #dfdfdf; } .task:last-child { border-bottom: none; }
    Полный набор стилей (да и всего остального) представлен на CodePen. А здесь будут самые важные части кода, разметки и оформления. Но давайте уже наконец приблизимся к нашему контекстному меню.Набросаем наше контекстное меню - разметка Основа нашего меню такая же, как и у любого другого меню - неупорядоченный список, вложенный в тег nav. Каждое действие будет представлено в виде элемента списка со ссылкой. Каждая ссылка отвечает за определенное действие. Как я упоминал ранее, нам нужно три действия в контекстном меню:
  • Просмотр задачи.
  • Редактирование задачи.
  • Удаление задачи.
  • Накидаем разметку:
    • View Task
    • Edit Task
    • Delete Task

    Если не представляете, куда поместить эту разметку, помещайте перед закрывающим тегом body. Прежде чем перейти к CSS, уточним пару моментов:
  • Мы хотим, чтобы контекстное меню появлялось там, где был выполнен правый клик, то есть ему нужно абсолютное позиционирование. Поэтому не стоит его разметку помещать в контейнер с относительным позиционированием.
  • Нам потребуются какие-нибудь переменные или атрибуты, чтобы можно было определить, к какой задаче относится выбранное действие.
  • А теперь стили.Приводим наше меню в порядок - CSS Уже была упомянута необходимость абсолютного позиционирования разрабатываемого меню. Кроме того, установим свойство z-index в 10. Не забывайте, что в вашем приложении может потребоваться другое значение. Это не все возможные стили, в демке наведены прочие красивости, но они уже зависят от ваших потребностей и не являются обязательными. Прежде чем переходить к JS, сделаем меню невидимым по умолчанию и добавим дополнительный класс для его отображения.
    .context-menu { display: none; position: absolute; z-index: 10; } .context-menu--active { display: block; } Разворачиваем наше контекстное меню - JavaScript Начнем с того, что посмотрим, как зарегистрировать событие contextmenu. Откроем самовыполняющуюся функцию и отловим событие на всем документе. Также будем логировать событие в консоль, чтобы получить какую-то информацию:
    (function() { "use strict"; document.addEventListener("contextmenu", function(e) { console.log(e); }); })();
    Если откроете консоль и кликнете где-нибудь правой кнопкой мыши, то увидите, что событие действительно там отображается. Тут много разной информации, которую мы можем использовать. Особенно нас интересуют координаты. Прежде чем отменять поведение по умолчанию, давайте учитывать, что делать это надо не на всем документе, а лишь для элементов списка задач. С учетом этого, потребуется выполнить следующие шаги:
  • Потребуется цикл по всем элементам списка задач и добавление обработчика события contextmenu к каждому из них.
  • Для каждого обработчика отменим стандартное поведение.
  • Будем логировать в консоли событие и элемент, к которому оно относится.
  • В общем, делаем что-то такое:
    (function() { "use strict"; var taskItems = document.querySelectorAll(".task"); for (var i = 0, len = taskItems.length; i < len; i++) { var taskItem = taskItems[i]; contextMenuListener(taskItem); } function contextMenuListener(el) { el.addEventListener("contextmenu", function(e) { console.log(e, el); }); } })();
    Если заглянуть в консоль, можно увидеть, что уникальное событие срабатывает при каждом нажатии на элемент из списка задач. Теперь помимо отмены поведения по умолчанию реализуем отображение контекстного меню, добавляя к нему вспомогательный класс.

    Но для начала давайте добавим к меню ID, чтобы его проще было получать посредством JS. Также добавим переменную состояния меню menuState и и переменную с активным классом. Получились три переменных:
    var menu = document.querySelector("#context-menu"); var menuState = 0; var active = "context-menu--active";
    Едем дальше. Пересмотрим функцию contextMenuListener и добавим toggleMenuOn, отображающую меню:
    function contextMenuListener(el) { el.addEventListener("contextmenu", function(e) { e.preventDefault(); toggleMenuOn(); }); } function toggleMenuOn() { if (menuState !== 1) { menuState = 1; menu.classList.add(active); } }
    На данный момент правой кнопкой мыши уже можно вызвать наше контекстное меню. Но нельзя сказать, что оно работает правильно. Во-первых, оно находится совсем не там, где хотелось бы. Для устранения проблемы понадобится немного математики. Во-вторых, закрыть это меню пока невозможно. С учетом того, как работают обычные контекстные меню, хотелось бы, чтоб наша его реализация закрывалась при клике не меню и при нажатии Escape. Помимо этого при правом клике вне нашего меню оно должно закрыться, а вместо него требуется открытие меню по умолчанию. Давайте попробуем все это решить.

    Рефакторинг нашего кода Очевидно, что за все действия будут отвечать три основных события:
  • contextmenu - Проверка состояния и раскрытие контекстного меню.
  • click - Скрытие меню.
  • keyup - Обработка нажатий клавиш. В данном руководстве интересна только ESC.
  • Нам также потребуется несколько вспомогательных функций, так что добавим в код раздел для них. Таким образом имеем:

    Много кода

    (function() { "use strict"; /////////////////////////////////////// /////////////////////////////////////// // // H E L P E R F U N C T I O N S // ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ // /////////////////////////////////////// /////////////////////////////////////// /** * Some helper functions here. * Здесь сами вспомогательные функции. */ /////////////////////////////////////// /////////////////////////////////////// // // C O R E F U N C T I O N S // ФУНКЦИИ ЯДРА // /////////////////////////////////////// /////////////////////////////////////// /** * Variables. * Переменные. */ var taskItemClassName = "task"; var menu = document.querySelector("#context-menu"); var menuState = 0; var activeClassName = "context-menu--active"; /** * Initialise our application"s code. * Инициализация кода нашего приложения. */ function init() { contextListener(); clickListener(); keyupListener(); } /** * Listens for contextmenu events. * Обработка события contextmenu. */ function contextListener() { } /** * Listens for click events. * Обработка события click. */ function clickListener() { } /** * Listens for keyup events. * Обработка события keyup. */ function keyupListener() { } /** * Turns the custom context menu on. * Отображение контекстного меню. */ function toggleMenuOn() { if (menuState !== 1) { menuState = 1; menu.classList.add(activeClassName); } } /** * Run the app. * Запуск приложения. */ init(); })();


    Теперь мы не перебираем элементы списка. Вместо этого будем обрабатывать событие contextmenu по всему документу, проверяя, относится ли оно к одной из задач. Поэтому введена переменная taskItemClassName. Делать это мы будем, используя вспомогательную функцию clickInsideElement, принимающую два параметра:
  • Само проверяемое событие.
  • Имя класса для сравнения. Если событие произошло внутри элемента, имеющего указанный класс, или родитель этого элемента имеет такой класс, то нужно вернуть этот элемент.
  • Вот и первая вспомогательная функция:
    function clickInsideElement(e, className) { var el = e.srcElement || e.target; if (el.classList.contains(className)) { return el; } else { while (el = el.parentNode) { if (el.classList && el.classList.contains(className)) { return el; } } } return false; }
    Вернемся и отредактируем contextListener:
    function contextListener() { document.addEventListener("contextmenu", function(e) { if (clickInsideElement(e, taskItemClassName)) { e.preventDefault(); toggleMenuOn(); } }); }
    Имея вспомогательную функцию, делающую за нас часть грязной работы, и отлавливая событие contextmenu на всем документе, мы можем теперь закрывать меню при клике вне его. Для этого добавим функцию toggleMenuOff и отредактируем contextListener:
    function contextListener() { document.addEventListener("contextmenu", function(e) { if (clickInsideElement(e, taskItemClassName)) { e.preventDefault(); toggleMenuOn(); } else { toggleMenuOff(); } }); } function toggleMenuOff() { if (menuState !== 0) { menuState = 0; menu.classList.remove(activeClassName); } }
    Теперь нажмите правой кнопкой по элементу списка. А после - где-нибудь в другом месте документа. Вуаля! Наше меню закрылось и открылось стандартное. Затем сделаем нечто похожее самое для события click, чтобы не от одной правой кнопки оно закрывалось:
    function clickListener() { document.addEventListener("click", function(e) { var button = e.which || e.button; if (button === 1) { toggleMenuOff(); } }); }
    Этот кусок кода несколько отличается от предыдущего, потому что Firefox. После того, как правая кнопка мыши отжата, в Firefox срабатывает событие click, так что здесь нам приходится дополнительно убеждаться, что произошел действительно клик левой кнопкой. Теперь меню не моргает при правом клике. Давайте добавим похожий обработчик и на нажатие клавиши ESC:
    function keyupListener() { window.onkeyup = function(e) { if (e.keyCode === 27) { toggleMenuOff(); } } }
    Мы получили меню, которое открывается и закрывается как задумано, взаимодействующее с пользователем естественным образом. Давайте наконец отпозиционируем меню и попробуем обрабатывать события внутри него. Позиционирование нашего контекстного меню С учетом текущих HTML и CSS, наше меню отображается в нижней части экрана. Но нам-то хотелось бы, чтоб оно появлялось там, где произошел клик. Давайте исправим сие досадное упущение. Во-первых, добавим еще одну вспомогательную функцию, получающую точные координаты клика. Назовем ее getPosition и попробуем заставить обрабатывать разные причуды браузеров:
    function getPosition(e) { var posx = 0; var posy = 0; if (!e) var e = window.event; if (e.pageX || e.pageY) { posx = e.pageX; posy = e.pageY; } else if (e.clientX || e.clientY) { posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; } return { x: posx, y: posy } }
    Наш первый шаг в позиционировании меню - подготовка трех переменных. Добавим их в соответствующий блок кода:
    var menuPosition; var menuPositionX; var menuPositionY;
    Создадим функцию positionMenu, принимающую единственный аргумент - событие. Пока что пусть она выводит координаты меню в консоль:
    function positionMenu(e) { menuPosition = getPosition(e); console.log(menuPosition); }
    Отредактируем contextListener, чтобы начать процесс позиционирования:
    function contextListener() { document.addEventListener("contextmenu", function(e) { if (clickInsideElement(e, taskItemClassName)) { e.preventDefault(); toggleMenuOn(); positionMenu(e); } else { toggleMenuOff(); } }); }
    Снова повтыкайте в контекстное меню и загляните в консоль. Убедитесь, что позиция действительно доступна и логируется. Мы можем использовать встроенные стили для задания свойств top и left посредством JS. Вот и новая версия positionMenu:
    function positionMenu(e) { menuPosition = getPosition(e); menuPositionX = menuPosition.x + "px"; menuPositionY = menuPosition.y + "px"; menu.style.left = menuPositionX; menu.style.top = menuPositionY; }
    Покликайте теперь везде. Меню появляется везде! Это потрясающе, но есть пара моментов, которые надо бы решить:
  • Что будет, если пользователь кликнет близко к правому краю окна? Контекстное меню выйдет за его пределы.
  • Что делать, если пользователя меняет размеры окна при открытом контекстном меню? Возникает та же проблема. Dropbox решает эту проблему скрытием переполнения по оси x (x-overflow: hidden).
  • Давайте решать первую проблему. Воспользуемся JS, чтобы определить ширину и высоту нашего меню, и проверим, что меню полностью влезает. В противном случае немного сместим его. Это потребует небольшого количества математики и размышлений, но мы сделаем это просто и по шагам. Для начала проверим ширину и высоту окна. Затем найдем ширину и высоту меню. А после убедимся, что разница между координатами клика и шириной окна с отступом больше, чем ширина меню. И то же самое сделаем для высоты. Если меню не умещается на экране, скорректируем его координаты. Начнем с добавления двух переменных:
    var menuWidth; var menuHeight;
    Как вы помните, по умолчанию наше меню скрыто, так что нельзя просто взять и посчитать его размеры. В нашем случае меню статическое, но при реальном применении его содержимое может меняться в зависимости от контекста, так что рассчитывать ширину и высоту лучше в момент открытия. Получим нужные величины внутри функции positionMenu:
    menuWidth = menu.offsetWidth; menuHeight = menu.offsetHeight;
    Введем еще две переменных, но на этот раз для размеров окна:
    var windowWidth; var windowHeight;
    Посчитаем их значения похожим образом:
    windowWidth = window.innerWidth; windowHeight = window.innerHeight;
    В конечном счете давайте предположим, что хотим показывать меню не ближе, чем в 4 пикселях от края окна. Можно сравнить значения, как я говорил выше, и скорректировать позицию как-то так:
    var clickCoords; var clickCoordsX; var clickCoordsY; // updated positionMenu function function positionMenu(e) { clickCoords = getPosition(e); clickCoordsX = clickCoords.x; clickCoordsY = clickCoords.y; menuWidth = menu.offsetWidth + 4; menuHeight = menu.offsetHeight + 4; windowWidth = window.innerWidth; windowHeight = window.innerHeight; if ((windowWidth - clickCoordsX) < menuWidth) { menu.style.left = windowWidth - menuWidth + "px"; } else { menu.style.left = clickCoordsX + "px"; } if ((windowHeight - clickCoordsY) < menuHeight) { menu.style.top = windowHeight - menuHeight + "px"; } else { menu.style.top = clickCoordsY + "px"; } }
    Сейчас наше меню ведет себя совсем хорошо. Осталось что-то сделать с ресайзом окна. Я уже говорил, как поступает Dropbox, но вместо этого мы будем закрывать контекстное меню. [Такое поведение куда ближе к стандартному ] Добавим в функцию init следующую строку:
    resizeListener();
    И напишем саму функцию:
    function resizeListener() { window.onresize = function(e) { toggleMenuOff(); }; }
    Великолепно.Цепляем события к пунктам контекстного меню Если ваше приложение сложнее данного примера, и у вас планируется динамическое содержимое контекстного меню, придется подробнее вникнуть в происходящее далее, чтобы самому додумать недостающие детали. В нашем приложении все проще, и есть всего одно меню с постоянным набором действий. Таким образом, можно быстро проверить, какой именно элемент был выбран, и обработать этот выбор. В нашем примере просто сохраним выбранный элемент в переменную и запишем в консоль его data-id и выбранное действие. Для этого отредактируем разметку меню:
    • View Task
    • Edit Task
    • Delete Task

    Далее давайте закэшируем все нужные объекты:
    var contextMenuClassName = "context-menu"; var contextMenuItemClassName = "context-menu__item"; var contextMenuLinkClassName = "context-menu__link"; var contextMenuActive = "context-menu--active"; var taskItemClassName = "task"; var taskItemInContext; var clickCoords; var clickCoordsX; var clickCoordsY; var menu = document.querySelector("#context-menu"); var menuItems = menu.querySelectorAll(".context-menu__item"); var menuState = 0; var menuWidth; var menuHeight; var menuPosition; var menuPositionX; var menuPositionY; var windowWidth; var windowHeight;
    Появилась переменная taskItemInContext, которой присваивается значение при правом клике по элементу списка. Она нам потребуется для логирования ID элементов. Также появились новые имена классов. Теперь пройдемся по функциональности.

    Функция инициализации остается такой же. Первое изменение затрагивает contextListener, ведь мы хотим сохранять в taskItemInContext элемент, на который кликнул пользователь, а функция clickInsideElement как раз его и возвращает:
    function contextListener() { document.addEventListener("contextmenu", function(e) { taskItemInContext = clickInsideElement(e, taskItemClassName); if (taskItemInContext) { e.preventDefault(); toggleMenuOn(); positionMenu(e); } else { taskItemInContext = null; toggleMenuOff(); } }); }
    Мы сбрасываем ее в null, если правый клик произошел не по элементу списка. Ну и возьмемся за clickListener. Как я упоминал ранее, для простоты мы просто будем выводить информацию в консоль. Сейчас при отлавливании события click производится несколько проверок и меню закрывается. Внесем коррективы и начнем обрабатывать клик внутри контекстного меню, выполняя некоторое действие и лишь после этого закрывая меню:
    function clickListener() { document.addEventListener("click", function(e) { var clickeElIsLink = clickInsideElement(e, contextMenuLinkClassName); if (clickeElIsLink) { e.preventDefault(); menuItemListener(clickeElIsLink); } else { var button = e.which || e.button; if (button === 1) { toggleMenuOff(); } } }); }
    Вы могли заметить, что вызывается функция menuItemListener. Ее мы определим чуть позже. Функции keyupListener, resizeListener и positionMenu оставляем без изменений. Функции toggleMenuOn и toggleMenuOff отредактируем незначительно, изменив имена переменных для лучшей читаемости кода:
    function toggleMenuOn() { if (menuState !== 1) { menuState = 1; menu.classList.add(contextMenuActive); } } function toggleMenuOff() { if (menuState !== 0) { menuState = 0; menu.classList.remove(contextMenuActive); } }
    Наконец реализуем menuItemListener:
    function menuItemListener(link) { console.log("Task ID - " + taskItemInContext.getAttribute("data-id") + ", Task action - " + link.getAttribute("data-action")); toggleMenuOff(); }
    На этом разработка функциональности заканчивается.

    Некоторые замечания Прежде чем закончить, давайте учтем некоторые моменты:
  • На протяжении всей статьи я упоминал правый клик как событие для открытия контекстного меню. Не все являются правшами и не у всех выставлены стандартные настройки мыши. Но вне зависимости от этого, событие contextmenu действует именно в соответствии с настройками мыши, а не привязано жестко к именно правой кнопке.
  • Еще один важный момент заключается в том, что мы рассмотрели только полноценные настольные веб-приложения с мышью в качестве устройства ввода. Пользователи могут пользоваться клавиатурой или мобильными устройствами, поэтому не забудьте предусмотреть альтернативные способы взаимодействия для сохранения дружественного интерфейса.
  • Большой вопрос Я выделил эту проблему в отдельный пункт, потому что это действительно важно после всего, что мы проделали. Задайтесь вопросом: действительно ли вам нужно собственное контекстное меню? Такие штуки - это круто, но прежде чем их использовать, вы должны убедиться, что это действительно полезно в вашем случае. Обычно пользователи ожидают привычного поведения приложения. Например, после правого клика по фотографии они ожидают получения возможности сохранить ее, скопировать ссылку и т. д. Отсутствие нужных пунктов в кастомном меню может их огорчить. Совместимость с браузерами В руководстве использовались некоторые современные штуки из CSS и JS, а именно display: flex в стилях и classList для переключения классов в JS. Также стоит упомянуть, что используются теги HTML5. Если требуется обратная совместимость с более старыми браузерами, вам придется реализовать ее самостоятельно. Примеры из данного руководства протестированы в следующих браузерах:
    • Chrome 39
    • Safari 7
    • Firefox 33
    Заключение и демо Если вы тщательно все обдумали и уверены, что такая функциональность нужна вашему приложению, вы можете использовать разработанное меню. Конечно, оно может потребовать каких-либо изменений, но данное руководство подробно описывает процесс разработки, так что реализовывать свои поправки должно быть не так сложно.

    Кодовая база этого руководства

    Собственное контекстное меню довольно редко применяется в интерфейсе веб-страницы. Ведь пользователю совершенно не очевидно, что на каком-то элементе надо щёлкнуть не левой, а правой кнопкой мыши и выбрать пункт из списка. К тому же не все посетители сайтов любят использовать правую кнопку мыши, а на смартфонах её вообще нет, только имитация. Несмотря на эти особенности в HTML5 есть возможность создавать собственные контекстные меню, реализовано это пока только в Firefox, и то весьма своеобразно.

    Для начала давайте посмотрим, как вообще создаются разные меню. Для этого используется комбинация тегов и (пример 1).

    Пример 1. Контекстное меню

    HTML5 IE Cr Op Sa Fx

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

    Атрибут contextmenu сообщает, что наше меню является контекстным и одновременно указывает на тег с заданным идентификатором (в данном случае edit ). Пока ни один браузер не понимает приведённый пример, включая Firefox. Для него вместо тега следует вставить нестандартный тег (пример 2).

    Пример 2. Меню в Firefox

    HTML5 IE Cr Op Sa Fx

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

    Код получился невалидным, зато при щелчке по картинке в Firefox появляется красивое меню (рис. 1).

    Рис. 1. Контекстное меню

    Пока это меню не работает нужным образом, так что переделаем его. Для начала добавим возле пункта меню иконку с помощью атрибута icon , так меню получится симпатичнее. В качестве значения указывается относительный или абсолютный путь к графическому файлу. Затем надо сделать, чтобы при нажатии на пункт меню происходило какое-то действие. Для этого воспользуемся событием onclick и с его помощью будем вызывать нужную функцию. В примере 3 показано создание контекстного меню для текста, если в нём выбрать «Править», то текст можно редактировать. На деле же применяется скрытое текстовое поле, которое становится видимым при вызове функции edit(), сам же текст на время редактирования скрывается. После нажатия на Enter текст из формы вставляется на место текстового абзаца, создавая впечатление, что именно его мы и правили. Форма же после завершения редактирования прячется вновь.

    Пример 3. Редактирование текста

    HTML5 IE Cr Op Sa Fx

    Контекстно меню #edit { width: 200px; border: 1px solid #ccc; display: none; } function edit() { document.getElementById("text").style.display = "none"; document.getElementById("edit").style.display = "block"; document.getElementById("edit").value = document.getElementById("text").innerHTML; document.getElementById("edit").focus(); } function text() { document.getElementById("text").innerHTML = document.getElementById("edit").value; document.getElementById("edit").style.display = "none"; document.getElementById("text").style.display = "block"; }

    Пример текста

    Вид нового меню показан на рис. 2.

    Рис. 2. Меню с иконкой

    Как видно из примера, создание контекстного меню ничем не отличается от создания других интерактивных элементов. При нажатии на пункт меню вызывается наша функция с помощью обработчика onclick , а дальше эта функция будет делать то, что мы пожелаем. Firefox 8 стал первым браузером, который начал поддерживать контекстные меню HTML5, но вызывает удивление, почему разработчики Firefox ввели для меню свой собственный нестандартный тег . Здесь возможны несколько вариантов развития событий:

    • тег будет добавлен в спецификацию HTML5;
    • этот тег себя изживёт и не будет поддерживаться в будущих версиях Firefox;

    Остаётся только ждать ответа других браузеров, в которых тег наконец-то будет реализован, а также разные меню на его основе.

    Инструкция

    Если в браузере не отображается меню , и вы видите на экране только выбранную интернет-страницу, значит, ваш браузер работает в полноэкранном режиме. Выйти из него можно несколькими способами.

    Если в выпадающем меню нет данной команды, воспользуйтесь сочетанием клавиш Alt и Enter, которое позволяет переходить в и обратно во многих программах. Также в различных браузерах смена режима осуществляется с помощью клавиши F11.

    Когда панель перестанет скрываться за верхним краем экрана, подведите к ней курсор и кликните правой кнопкой мыши. Установите в контекстном меню маркер напротив пункта «Панель меню » или «Строка меню » (формулировка зависит от того, какой браузер установлен).

    После данного действия в окне браузера должны отобразиться стандартные для меню пункты. Пункт «Файл» позволяет управлять окном программы, открывать и закрывать новые окна и вкладки, отправлять интернет-страницы на печать.

    Пункт «Правка» содержит стандартные команды «Копировать», «Вырезать», «Вставить», «Найти» и мало чем отличается от аналогичного пункта в любой другой программе. За внешний вид окна браузера отвечает пункт «Вид».

    Доступ к сохраненным пользователем ресурсам осуществляется с помощью пункта «Избранное» или «Закладки», меню «Сервис» или «Инструменты» позволяет настроить работу браузера в соответствии с вашими нуждами.

    Также на панели меню могут находиться и другие инструменты, например, строка состояния, панель «Избранное», панель навигации. Чтобы настроить их отображение, также подведите курсор к панели, кликните по ней правой кнопкой мыши и выберите в контекстном меню нужные пункты, отметив их маркером.

    Источники:

    • где находится браузер

    О количестве групп, играющих музыку всех направлений от джаза до рэп-кора, можно рассудить по посещению одного клуба. За вечер на сцену выходят до двух десятков. Чтобы выделиться на фоне этого множества, мало играть хорошую музыку – нужно вкладывать деньги в свое продвижение. Если коллектив не готов расстаться с крупной суммой, приходится искать помощи на стороне.

    Инструкция

    Спонсоры, как правило, сотрудничают с группами, которые уже добились успеха. Поэтому прежде чем , завоюйте достаточно многочисленную и стабильную аудиторию. Для этого, кроме музыки, позаботьтесь и о сценографии, спецэффектах, взаимодействии музыкантов на сцене, делайте каждое выступление и немного новым.

    Составьте расположенных в вашем или районе организаций, деятельность которых прямо или косвенно связана с музыкой. В другом списке перечислите остальные организации, не имеющих связи с вами. Помощь может прийти с любой стороны, но начните с первого списка.

    Изучайте возможные варианты. Прежде чем обращаться в какую-либо организацию, уточните, ли она спонсированием и в какой области; обращались ли в нее другие музыканты и получали ли отказ. Даже если сам вас , изучите его бизнес, прежде чем высказывать какие-то решения.

    На какое-то время вы станете лицом организации. Поэтому, рассматривая вашу кандидатуру, спонсор будет очень придирчив к вашей внешности. Если вы не готовы изменить свой образ ради соответствия, на согласие не рассчитывайте. Как правило, потенциальный спонсор и не настаивает на такой перемене, а просто отказывает. Если вы не учтете критерий внешности, то потеряете время и, возможно, шанс встречи с настоящим спонсором.

    Ни о чем не договаривайтесь на . Все условия должны быть прописаны в контракте. Каждый его пункт обговорите с юристом. Если вас что-то не устраивает, не стесняйтесь об этом. Лучше сейчас выяснить все спорные моменты, чем потом кусать локти из-за собственной невнимательности.

    Видео по теме

    Журнал «Избранное» необходим для того, чтобы не искать те ресурсы, к которым пользователь часто обращается в повседневной работе. Он обеспечивает быстрый доступ к нужным материалам. Чтобы найти «Избранное», необходимо выполнить несколько действий.

    Инструкция

    «Избранное» существует не только в браузерах, но и предусмотрено в меню любой папки, хранящейся на компьютере. Так как строка меню в папках присутствует всегда, вам не придется ничего настраивать дополнительно. Откройте папку, выберите в меню пункт «Избранное», кликнув по нему левой кнопкой мыши, развернется контекстное меню. Чтобы поместить какую-либо папку в список, выберите команду «Добавить в избранное», кликнув по ней левой кнопкой мыши. Выбранная папка появится в меню.

    При работе с интернет-обозревателями вам, возможно, потребуется настроить отображение строки меню или специальной кнопки, с помощью которой вы будете получать доступ к журналу «Избранное». Для этого в обозревателе Internet Explorer кликните правой кнопкой мыши по панели, в контекстном меню выберите один из доступных вариантов. Установите маркер напротив пункта «Строка меню» - так вы сможете открыть «Избранное» тем же способом, который описан в первом шаге.

    Если вы хотите, чтобы закладки отображались на панели браузера, выберите в контекстном меню пункт «Панель избранного», так же отметив его маркером. В окне браузера добавится еще одна панель инструментов. Если вам кажется, что она занимает слишком много места, вы можете получать быстрый доступ к нужным ресурсам и другим способом. Нажмите на значок в виде звездочки на панели инструментов, развернется журнал. Выделите в нем вкладку «Избранное», чтобы просмотреть список хранящихся в журнале адресов сайтов.

    В браузере Mozilla Firefox журнал со списком ресурсов называется «Закладки». Вызвать его можно через одноименный пункт в верхней строке меню, настроив отображение «Избранного» на панели инструментов или открыв журнал «Библиотека». Данный журнал вызывается несколькими способами: выберите в строке меню пункт «Закладки» и команду «Показать все закладки» или нажмите сочетание клавиш Ctrl, Shift и B. Журнал будет открыт в отдельном окне.

    Окно браузера - это форма графического интерфейса, применяемого при работе пользователя в интернете. При этом окно браузера получило такое название благодаря тому, что оно, как и обыкновенное окно, имеет прямоугольную форму.

    БраузерСамо слово «браузер» пришло в русский язык из английского, в котором глагол «browse» означает «просматривать». Таким образом, сегодня в сфере интернет-технологий слово «браузер» применяется для обозначения специальной программы, которая предназначена для просмотра информации в интернете.

    На сегодняшний день этот сегмент рынка постоянно расширяется, поэтому пользователи имеют возможность выбирать из нескольких более или менее популярных браузеров в зависимости от того, какие функции и возможности, имеющиеся в каждой из программ, кажутся им более удобными. Так, одним из самых давно изспользуемых браузеров является «Internet Explorer», который в течение длительного периода был лидером по популярности среди пользователей, однако на его позиции сегодня претендуют несколько других удобных программ, например «Mozilla Firefox», «Opera», «Google Chrome» и прочие.

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

    Одним из таких параметров является форма предоставления информации с интернет-страницы. Во всех существующих на сегодняшний день браузерах она представляется в форме так называемого окна - прямоугольного поля, в котором отображается текст, картинки, видеозаписи или другие сведения. Окно браузера можно развернуть на полный экран, то есть заполнить им все пространство монитора, или использовать сжатую форму представления окна, нажав на символ в виде двух квадратов в правом верхнем углу экрана. Кроме того, окно, которое вам больше не нужно, можно закрыть, нажав на символ в виде крестика, или свернуть, то есть временно убрать из поля зрения, нажав на символ в виде черточки.

    В каждом окне браузера можно открыть одну или несколько дополнительных вкладок, чтобы одновременно иметь доступ к нескольким интернет-страницам. Это можно сделать, переведя курсор мыши в верхнюю часть экрана. В некоторых браузерах эта возможность показана в виде символа «плюс», а в других - в виде небольшого свободного поля рядом с названием уж открытого сайта. Для того чтобы закрыть отдельную вкладку, необходимо также нажать на символ крестика - тот, который находится в правой части вкладки.

    Основные элементы окна в любом браузере - это адресная строка и основное поле для отображения информации. Адресная строка отображается в верхней части окна браузера. Она обыкновенно начинается с символов «www» или «http://» и представляет собой буквенный код, ввод которого приведет вас на нужную вам страницу. В настоящее время адреса страниц в русскоязычном интернете могут быть набраны как латинским, так и кириллическим шрифтом. В основном поле вы можете видеть самые разные тексты, картинки, видеозаписи и другую информацию, состав которых зависит от содержания сайта, который вы просматриваете.

    Источники:

    • Что такое веб браузер, окно браузера и адресная строка?