Долго исследовал эту проблему.
Никакие .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 вызывает подкладываемая кнопка.
Юзать, не юзать - решаете сами...