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)

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
Я так понимаю, что "позволяет" - ключевое слово.

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


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