<div oncontextmenu="asdf(event)">
<script type="text/javascript">
function asdf(event){
if (event.ctrlKey)
alert('foo');
}
</script>
これが機能する理由:イベントハンドラーの属性文字列によって作成された無名関数内event
に、Eventインスタンスを指すように初期化されたローカル変数があります。IEには壊れたイベントモデルがありますが、event
現在はローカル変数ではなくwindow.event
グローバルを参照しているため、このコードは引き続き機能します。
ただし、最近は一般的にイベントハンドラー属性を避けたいと思うでしょう。スクリプト自体からイベントハンドラーを割り当てることをお勧めします。例:
<div id="thing">
<script type="text/javascript">
document.getElementById('thing').oncontextmenu= function(event) {
if (event===undefined) event= window.event; // fix for IE
if (event.ctrlKey)
alert('foo');
};
</script>
スクリプトに入れるということは、HTMLが有効なままであることも意味します。(oncontextmenu
これは、HTML5まで標準化されないIE拡張機能です。)
同じ関数をに移行することもできますがaddEventListener
、IEはそれをサポートしていないため、存在をスニッフィングする必要がaddEventListener
あり、欠落している場合はattachEvent
代わりにIE固有を使用する必要があります。同じオブジェクトの同じイベントに複数のハンドラーが必要ない場合は、onevent
代わりに古いスタイルのハンドラーを使用する方が簡単です(そして古いブラウザーとの互換性が高くなります)。
contextmenu
これは信頼できないイベントであることに注意してください。すべてのブラウザでサポートされているわけではなく、無効になっている場合や、ブラウザの実際のコンテキストメニューが常に表示される場合があります。Macでは、Controlキーを押しながらクリックするのが一般的な方法であり、チェックを混乱させる可能性がありますctrlKey
。さらに、もちろんアクセシビリティの問題があります。Webアプリケーションのコンテキストメニューは、基本的なアクセス方法としてではなく、ショートカット機能としてのみ使用してください。