2

divアイテムのoncontextmenuイベントを読み取る関数を作成しようとしています。(たとえば、e.ctrlKeyを使用して、Ctrlキーが押されているかどうかを確認するために必要です。)

これは機能します:

<div id="item_2" class="lineitem" align=center oncontextmenu="alert('foo');">test</div>

しかし、これはしません:

<script language="JavaScript">
function asdf(e){
    alert('foo');
}
</script>
<div id="item_2" class="lineitem" align=center oncontextmenu=asdf>test</div>

2番目のものを修正するには何をする必要がありますか?

ありがとう。

4

3 に答える 3

5
<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アプリケーションのコンテキストメニューは、基本的なアクセス方法としてではなく、ショートカット機能としてのみ使用してください。

于 2010-01-03T12:49:57.623 に答える
2
oncontextmenu="asdf()"

属性値を使用して事前定義された関数を直接割り当てることはできません。匿名関数のみ(function () {andはand}に置き換えられます。これにより、イベントオブジェクトをトラップするのがかなり困難になります(おそらく不可能ですが、調査の必要性を感じたことはありません)。attribute=""

関数を直接割り当てる場合は、JavaScriptとattachEvent/addEventListenerを使用して割り当てます。

于 2010-01-03T10:23:36.057 に答える
1
oncontextmenu="asdf()"

うまくいくはずですよね?

于 2010-01-03T10:20:39.487 に答える