Opera の右クリックイベント検出

IE, Firefox, Safari だと

var d = document.getElementById('hoge');
d.oncontextmenu = function(e) {
    if(window.event) event.returnValue = false; // for IE
    else e.preventDefault();
    // なんらかの処理
}

のようなコードで右クリックでコンテキストメニューを表示させないで処理を実行できる。


しかし Opera の場合、同じような動作を実現することはできない。
まずデフォルトの状態だと右クリックを JavaScript で検出することさえできない。
検出できるようにするには、
Preferences -> Advanced -> Content -> JavaScript Options -> Allow script to recive right clicks*1
のチェックをつける。
さらに Opera には oncontextmenu というイベントハンドラがないので

d.addEventListener('mousedown', function(e) {
    if(e.button == 2) {
        // なんらかの処理
   }
}, false);

のように mousedown イベントをみる必要がある。まだ問題がある。コンテキストメニューを表示させないで処理を実行することができない。 preventDefault() でも駄目。


解決策ではないんだけど alert() を処理に含めればコンテキストメニューを表示させないで実行できる。もちろんアラートダイアログはでるけどね。


最後の手段として Opera 自体のコンテキストメニューを無効にしてしまう方法がある。
opera:config#UserPrefs|AllowContextMenus
のチェックをはずせば OK。ただし、いかなる場所でコンテキストメニューが表示されないので不便すぎる。

*1:日本語に読み替えてね