Comments 47
Как здорово! ) и быстро !))
спасибо большущее за информацию, непременно к осмысливанию
Пожалуйста. Пользуйтесь, модифицируйте как надо. Лицензия MIT.
По идее, когда курсор уходит с пункта с подменю, то подменю должно скрываться.
так и есть. только не при уходе, а при наведении на другой пункт. по таймеру
Я делал по образу и подобию меню в фаерфоксе. Там так. В Опере иначе… Кстати идея! Можно менять это поведение в зависимости об бразуера :)
Хм… я у себя не ощущаю задержки в FF3 на WinXP и разницы с Оперой тоже не замечаю. Возможно, потому что у меня в винде убрана задержка вылезания меню.
Таймер тоже стоит оставить — события выхода не всегда корректно отслеживаются.
Думал об этом, но до реализации пока руки не дошли — разные меню используют разные иконки, поэтому монолит может быть довольно большим. Но в туду этот пункт есть.
Капец просто. Хотел посмотреть в ие, обнаружил интересный факт. У меня эксплорер открывает странички с ip-адресом в Опере!
оффтоп: было бы неплохо чтобы автору топика добавлялась карма за то, что другие заносят его пост в избранное, а то пост полезный, а плюсануть не могу… пусть хоть так опосредованно перепадает благодарность :)
Эх, заминусут Вас щас :) Знаете ведь — не любят на Хабре разговоров о карме.
Да мне по барабану, если честно.
Просто хочется выразить благодарность принятыми в данной системе способом, а не могу :)
Хм… у меня по клику правой клавигей ничего не происходит… А вот о клику левой — открывается)
Firefox 3.0.3, Kubuntu 8.04.1…

И еще — насколько я помню, Опера не отлавливает клик правой клавишей. Или уже отлавливает?
Так и должно быть, чтобы сохранить возможность для пользователя открыть дефолтное меню браузера.
Не отлавливает. Именно поэтому от поддержки правой кнопки мыши я отказался. Хотя никто не запрещает биндить по любому событию (через getCaller(string event,menu menu))
В настройках Оперы есть пункт «Allow script to receive right click», но я как-то по традиции снимаю галочку.
Заметил особенность в Опере, если выбрать в меню пункт «Назад...», то после этого меню перестаёт вызываться.
Да, спасибо. Щас тоже заметил. Видимо для оперы history.back(); когда назад некуда — это ошибка.
Видимо, это странность Оперы: try-catch эту ошибку не ловит. Если есть куда переходить — переходит. Если нет — убивает скрипты. Что ж. Будем боросться.

Запуск другим потоком тоже ничего не дал. Если есть идеи — пишите.
Помогает не всегда. Иногда при непустой истории history.length равен нулю. В Опере только.
Абсолютно не сложно. jQuery там всего несколько вызовов. Люди, знакомые с mootols без труда заменят из соответствующими. К сожалению, я к таковым не отношусь, поэтому пока только jQuery. Если сделаете — давайте ссылку, добавлю в пост.
В IE6 не работает (показывается за краями видимой области)

А можно ли как-то динамически подгружать пункты меню. Например в базе хранится некий список с URL по который можно переходить и когда юзер кликает на «вызов меню», то этот список из базы погружается в меню…
С ие разберемся, ага. Динамическая подгрузка была реализована в ранней версии меню. Там можно было задавать меню строкой-урлом, по которому шел запрос. На практике оказалось не нужно и эту ветку быстро забыли. Фактически игра не стоит свеч: для подобных меню правильнее загружать ресурсы заранее, иначе это ведет к увеличению времени взаимодействия с пользователем и лишним гет-запросам.
>Фактически игра не стоит свеч:…
Нууууу, может быть. Хотя если это реализуемо, что почему бы и нет. Я пересмотрел очень много контекстных меню — и у всех один, для меня, недостаток — надо заранее задавать все пункты меню. Я бы предпочел сделать лишний ajax запрос для генерации меню, чем заранее загружать его, IMHO.
А что мешает сделать это ручками?
$.getJSON('datasource.php?q=GetAllDataInOneRequets',function(json_response_object){
  $('#menu_click_here').bindMenu(json_response_object.menu1);
  $('#menu_click_me').bindMenu(json_response_object.menu2);
  $('.blablablaMenu').bindMenu(json_response_object.menuBlaBlaBla);
}

Так мы грузим всё одним запросом.
Большой привет Казани! Очень хочу там побывать! (сорри за офтоп).
Теперь по делу: если не ошибаюсь, то в опере нельзя использовать контекстное меню? или все таки ошибаюсь? позже протестирую.
Можно. Там в примере глючок закрался паршивенький, а так всё нормально.
Автор! Настоятельно советую перенести вызов js в конец файла, или сделать его как-то отложенно. Что меня всегда раздражало — так это привычка ставить js в начало файла, из за чего ощутимо замедляется загрузка((( Неприкольно смотреть на белвый экран((
Разница в скорости загрузки с и без поддержки js видна невооруженным глазом.

А меню — хорошее, только стили бы поменять умолчальные.
Можно еще добавить стрелки вверх вниз. Там элементарно делается. Пример jotsky.com.
Может уже слишком поздно и мой мозг спит, но я не увидел на сайте примера, хотя интуитивно догадываюсь, что речь идет о стрелочках для скроллирования мега-больших меню, не помещающихся на экран.
идея хорошая, но возможно динамические меню стоит реализовывать через ajax.
фиксированные меню лучше сразу сгенерировать в html, завернуть в невидимый блок и вызывать по требованию.
<div style="display: none;"> menu </div>

Фиксированные меню рендерятся по требованию. Довольно часто их вообще не вызывают. Всё-таки контекстными меню (по крайней мере наши юзеры) пользуются не так часто. Но в принципе на инит поставить вызов render() дело пяти секунд. Раньше, кстати так и было, но пришлось убрать в силу указанных выше причин.
а я бы привязал меню к курсору, а то ведь, если область клика большая то меню вылазит далековато от меню (собственно говоря — в примере так и есть), а так это было бы более похоже на контекстное меню, где кликнул — там и вылезло.

саму функцию попробовал — интересная, вот теперь думаю использовать, или свое сделать, заточенное под мои нужды.
Only those users with full accounts are able to leave comments. Log in, please.