Подавление контекстной менюхи в ФФ и Опере
Хочу на правый клик мыши повесить свою менюшку. Все бы ничего, однако так и не смог вкурить каким образом подавить стандартное контекстное меню в FF и Опере. Где-то нагуглил, что этого сделать нельзя. Однако во-первых очень слабо верится, а во-вторых в том же FCKEditor в диалоговых окнах они подавлены. В самих кодах окон никакого упоминания этих контекстных менюх не нашел, так что видимо это как-то указывается при их открытии, что мне не подойдет (мне нужно чтобы это работало в основном окне). Как тогда?
|
У меня в опере не работает http://www.fckeditor.net/demo
Вообще, обычно для Опера просто делают хинт юзеру, что вызов контекстного меню надо делать особым образом. Например, Ctrl+обычный клик. в Firefox'е - пробовал обычный preventDefault/stopPropagation + oncontextmenu ? Только не mouse*, а именно oncontextmenu ? |
Неа, не пробовал. Я чет протупил, думал, что oncontextmenu в FF нет. На самом деле preventDefault робает. А в Опере значит никак?
|
Не знаю ни одной библиотеки которая умеет в опера это делать.
Разве что можно попробовать порыть в сторону виджетов их проприетарных и т.п. |
Ок, спс
|
Esciloner,
if (event.button==2) тоесть ловить нажатие правой кнопки (2) и делать return false ps если перед retrun поставить alert то ничего не получится, эт фича такая |
О том, как это в IE и FF делать вопросов нет, все понятно. А на какое событие в опере это вешать? Там правый клик даже за onmousedown и onmouseup не считается. Или я что-то основательно не вкурил...
|
вешай на левую кнопку для оперы. а для остальных нормально
|
вы не должны этого хотеть.
в опере есть настройка "Разрешать обработку щелчков правой кнопкой" по умолчанию она выключена, и я рад) плохой тон вешать на правую кнопку что либо - это служебная кнопка браузера. |
Цитата:
Совершенно верно замечено Цитата:
|
вроди как то так,
document.onContextMenu = function() { return true; } |
да не выключается в опере событие oncontextmenu никакими способами
|
В опере никогда контекстное меню не выключалось и не будет, не парьтесь, забейте на оперу, это говнобраузер...
|
Цитата:
|
в опере, только если включена поддержка правой кнопки в настройках, возможен грязный хак - подложить невидимую кнопку при нажатии правой кнопки мыши, т.к. над кнопками свое контекстное меню опера не показывает
|
Цитата:
|
no opera context menu
Долго исследовал эту проблему.
Никакие .preventDefault() и return false не спасут. Включение возможности отслеживания правой кнопки тоже не спасают, т.к. это просто ничего не даёт. Единственный выход, как было уже сказано выше - подложить кнопку под курсор. Даю описание, как это правильно сделать, потому что тут хватает подводных камней: 1. События contextmenu для Оперы не существует, поэтому для него просто вешаем заглушку для остальных браузеров. Натыкался, что вроде как реализовано onrightclick для Оперы под Лялих, но для виндяшной Оперы его также не существует (но Лялих так и не проверил). 2. Подкладывать необходимо <input type="button"/>, этот же фокус с <button></button> Опера игнорирует. Протестил и на других типах. Отменяется также checkbox и radio. Заметил, что отменить может любой input, если на нем не находился курсор до события mouseup. 3. Подавление меню происходит ДО mouseup над вышеупомянутым инпутом. Т.е. если до события mouseup кнопка не окажется под курсором, то подавления не будет. 4. Из третьего пункта следует, что вызывать обработчик события для контекстного меню следует именно при событии mouseup, если была нажата правая клавиша мыши. В результате всех этих пунктов получился (почти) кроссбраузерный говнокод: document.oncontextmenu=function(){return false;} document.onmousedown=function(e){ if(e.button==2) { window.hack_button=document.body.appendChild(document.createElement('input')); hack_button.type="button"; hack_button.style.cssText="display:block;position:fixed;width:100%;height:100%;border:none;top:0;left:0;opacity:0;"; } } document.onmouseup=function(e){ if(e.button==2) { //тут вписываем грёбаный код обработчика //... hack_button.parentNode.removeChild(hack_button); } } Суть в том, что кнопка на весь экран (ее не нужно таскать за курсором), она в любом случае окажется под курсором. На ранних операх (до 10-й) не тестил, но предполагаю, что тоже работает. Плюсы: 1. Способ действительно работающий. 2. Кнопка прозрачна и поэтому не видна юзеру. Минусы: 1. Способ единственный, но отвратительный. 2. Если пользователь переместил мышь с момента события mousedown, то к сожалению, событие mouseup вызывает подкладываемая кнопка. Юзать, не юзать - решаете сами... |
pashak,
Опера, начиная с версии 10.50, позволяет отменять показ контекстного меню. Как и что вы тестили непонятно. Кнопка во весь экран это, извините, бред какой-то. Как через неё со всеми элементами на странице-то общаться? |
Цитата:
Цитата:
pashak, ну метода не для нубов :) +1 |
Цитата:
|
Можно JS отменить и 60% рунета перестанет работать и 30% будет похоже на уродство. Если позволяет, то это проблемы пользователя, а если включено "по умолчанию", то это, скорее всего, дыра в браузере. Нафига такой нужен? Фича сомнительная, а применение контекстного меню вещь очень ограниченная.
|
Цитата:
Цитата:
|
Цитата:
|
Во-первых, я тестил на Опере 10.10.
Во-вторых, я вижу, здесь не все умеют вчитываться. Я и описал недостаток способа: с остальными элементами возможно общаться только в том случае, если мышь не переместилась с момента mousedown. В-третьих, данный способ не требует наличия галочки о контекстном меню. И небольшое замечание: если хотите отменить контекстное меню, то придётся таскать за собой кнопку, а то если до события mouseup она не окажется под курсором, то меню не отменится. |
Извиняюсь, если задам вопрос совсем не в тему.
Есть страница, в которой переопределено/подавлено контекстное меню (сделано вроде на ext-js и работает в chrome/ie/ff точно). Соответственно вопрос хочется как-то сделать так, чтобы была возможность вызывать помимо переопределенного также и стандартное меню браузера (например при нажатии в дополнение ctrl). Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 17:02. |