Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Подавление контекстной менюхи в ФФ и Опере (https://javascript.ru/forum/events/22-podavlenie-kontekstnojj-menyukhi-v-ff-i-opere.html)

Esciloner 14.06.2007 18:08

Подавление контекстной менюхи в ФФ и Опере
 
Хочу на правый клик мыши повесить свою менюшку. Все бы ничего, однако так и не смог вкурить каким образом подавить стандартное контекстное меню в FF и Опере. Где-то нагуглил, что этого сделать нельзя. Однако во-первых очень слабо верится, а во-вторых в том же FCKEditor в диалоговых окнах они подавлены. В самих кодах окон никакого упоминания этих контекстных менюх не нашел, так что видимо это как-то указывается при их открытии, что мне не подойдет (мне нужно чтобы это работало в основном окне). Как тогда?

Илья Кантор 14.06.2007 18:26

У меня в опере не работает http://www.fckeditor.net/demo

Вообще, обычно для Опера просто делают хинт юзеру, что вызов контекстного меню надо делать особым образом. Например, Ctrl+обычный клик.

в Firefox'е - пробовал обычный preventDefault/stopPropagation + oncontextmenu ? Только не mouse*, а именно oncontextmenu ?

Esciloner 14.06.2007 18:53

Неа, не пробовал. Я чет протупил, думал, что oncontextmenu в FF нет. На самом деле preventDefault робает. А в Опере значит никак?

Илья Кантор 14.06.2007 21:07

Не знаю ни одной библиотеки которая умеет в опера это делать.

Разве что можно попробовать порыть в сторону виджетов их проприетарных и т.п.

Esciloner 15.06.2007 10:23

Ок, спс

jeepers 15.06.2007 15:42

Esciloner,
if (event.button==2)
тоесть ловить нажатие правой кнопки (2)
и делать return false
ps если перед retrun поставить alert то ничего не получится, эт фича такая

Esciloner 15.06.2007 17:47

О том, как это в IE и FF делать вопросов нет, все понятно. А на какое событие в опере это вешать? Там правый клик даже за onmousedown и onmouseup не считается. Или я что-то основательно не вкурил...

гость 25.06.2007 17:20

вешай на левую кнопку для оперы. а для остальных нормально

TroT 27.09.2007 20:02

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

hogart 22.04.2008 22:00

Цитата:

Сообщение от Илья Кантор (Сообщение 87)
виджетов их проприетарных и т.п.

Они не проприетарные, и ничем тут не помогут, увы:(

Совершенно верно замечено
Цитата:

Сообщение от TroT (Сообщение 210)
вы не должны этого хотеть

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

scuter 29.04.2008 14:43

вроди как то так,
document.onContextMenu = function()
{
	return true;
}

Раман 08.10.2009 11:48

да не выключается в опере событие oncontextmenu никакими способами

ZoNT 08.10.2009 12:10

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

Раман 05.03.2010 19:15

Цитата:

Сообщение от ZoNT (Сообщение 32139)
В опере никогда контекстное меню не выключалось и не будет, не парьтесь, забейте на оперу, это говнобраузер...

Насчет гавнобраузер я тебя полностью потдерживаю.

moro 05.03.2010 22:23

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

subzey 06.03.2010 14:30

Цитата:

Сообщение от ZoNT
не парьтесь, забейте на оперу

Just as planned. Моему любимому контекстному меню ничего не угрожает. :3

pashak 08.11.2010 05:30

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 вызывает подкладываемая кнопка.

Юзать, не юзать - решаете сами...

Kolyaj 08.11.2010 08:49

pashak,
Опера, начиная с версии 10.50, позволяет отменять показ контекстного меню. Как и что вы тестили непонятно.

Кнопка во весь экран это, извините, бред какой-то. Как через неё со всеми элементами на странице-то общаться?

vladlen 10.11.2010 19:38

Цитата:

Сообщение от Kolyaj
Как через неё со всеми элементами на странице-то общаться?

а зачем обязательно ее делать над всей страницей? Можно сделать там где надо и будет счастье.
Цитата:

Сообщение от Kolyaj
позволяет отменять

Я так понимаю, что "позволяет" - ключевое слово.

pashak, ну метода не для нубов :) +1

Kolyaj 10.11.2010 20:49

Цитата:

Сообщение от vladlen
Я так понимаю, что "позволяет" - ключевое слово.

Ключевое слово отменять.

vladlen 10.11.2010 21:00

Можно JS отменить и 60% рунета перестанет работать и 30% будет похоже на уродство. Если позволяет, то это проблемы пользователя, а если включено "по умолчанию", то это, скорее всего, дыра в браузере. Нафига такой нужен? Фича сомнительная, а применение контекстного меню вещь очень ограниченная.

Kolyaj 10.11.2010 21:14

Цитата:

Сообщение от vladlen
Можно JS отменить и 60% рунета перестанет работать и 30% будет похоже на уродство.

Это к чему?

Цитата:

Сообщение от vladlen
Если позволяет, то это проблемы пользователя, а если включено "по умолчанию", то это, скорее всего, дыра в браузере.

Все браузеры позволяют отменять вызов контекстного меню по умолчанию. Во всех браузерах дыра? И в чём, собственно, дыра?

vladlen 11.11.2010 03:53

Цитата:

Сообщение от Kolyaj
по умолчанию

Означает без настроек, молча, тихо, не спросив. Дыра в голове.

pashak 25.11.2010 16:39

Во-первых, я тестил на Опере 10.10.
Во-вторых, я вижу, здесь не все умеют вчитываться. Я и описал недостаток способа: с остальными элементами возможно общаться только в том случае, если мышь не переместилась с момента mousedown.
В-третьих, данный способ не требует наличия галочки о контекстном меню.
И небольшое замечание: если хотите отменить контекстное меню, то придётся таскать за собой кнопку, а то если до события mouseup она не окажется под курсором, то меню не отменится.

xnike 16.12.2010 21:55

Извиняюсь, если задам вопрос совсем не в тему.
Есть страница, в которой переопределено/подавлено контекстное меню (сделано вроде на ext-js и работает в chrome/ie/ff точно). Соответственно вопрос хочется как-то сделать так, чтобы была возможность вызывать помимо переопределенного также и стандартное меню браузера (например при нажатии в дополнение ctrl).

Цитата:

Also, when the context menu has been disabled like this it can be easily re-enabled by typing javascript:void oncontextmenu(null) into the address bar of the browser.
Если существует универсальный вариант, без знания как перебито стандартное меню, то было бы совсем замечательно.

Kolyaj 18.12.2010 07:55

Цитата:

Сообщение от xnike
Есть страница, в которой переопределено/подавлено контекстное меню

Так не подавляйте, если зажат ctrl.


Часовой пояс GMT +3, время: 19:49.