3

イベントリスナーを一時的に無効にする方法はありますか?

私の場合、addEventListener / attachEventを使用して要素にマウスオーバー/マウスアウトイベントを作成するサードパーティライブラリ(jQuery中心ではない)があります。

特定の状況下では、別のイベントが別の要素で発生し、それらのイベントリスナーを無効にする必要があります。これまでの私の解決策は、単にunbindマウスオーバー/マウスアウトすることでした。通常、このイベントによってページが更新されるため、これは正常に機能します。

ただし、ページが更新されないというエラー(検証エラーを考えてください)が時々発生する可能性があるため、マウスオーバー/マウスアウトイベントリスナーを再接続する必要があります。

役立つ情報

マウスオーバー/マウスアウトイベントリスナーが作成され、サードパーティライブラリ内にアタッチされるため、イベントを変数に割り当てて、その方法でバインド/バインド解除することはできません(これを行うにはAFIKが最適な方法です)。

アップデート

私はもともと尋ねていました

jQueryに、オブジェクトにすでに割り当てられているイベントリスナーを取得する方法はありますか?

それ以来、addEventListener / attachEventによって割り当てられたイベントにアクセスできないことがわかりました。JavaScriptのattachEvent()/ addEventListener()で追加されたイベントにアクセスします。

4

3 に答える 3

1

jQueryはdataイベントを内部に保存するために使用するため、これを使用してオブジェクトのすべてのイベントハンドラーを取得できます。

$("#foo").data("events")

次に、以下を使用して特定のハンドラーを削除できますunbind

$("#foo").unbind('click', $("#foo").data("events").click[42]);
于 2011-03-02T00:35:44.623 に答える
1

残念ながら、それらにアクセスすることはできません。せいぜい、W3C removeEventListenerdocs)やMicrosoft detachEventdocs)を使用してイベントリスナーを削除できます。ただし、リスナーが削除されると、それは永久に失われます。

removeEventListenerイベントが2回登録された場合、1回はキャプチャすることを示し、もう1回はキャプチャしないことを示す場合は、イベントを2削除する必要があるという1つの注意点があります。ケースごとに1回。

キャプチャすることとキャプチャしないことの詳細については、W3C仕様を参照してください。

于 2011-03-02T00:59:58.583 に答える
0

実行中のイベントハンドラーを一時的に無効にしたい場合は、関数にエスケープコードを追加してみませんか?

そのようです:

$('#button').click(function(){
    var clicked_element = $(this);
    if(elem.hasClass('event-click-disabled'))
    {
        // logging code so we know exactly what events are being skipped
        console.info(
            'The click event on following element was skipped',
            clicked_element
        );
        return;
    }
    alert('Button clicked');
});

次に、特定の要素のイベントを無効にする場合は、

element.addClass('event-click-disabled');

イベントハンドラーは引き続き実行されますが、すぐに戻ります。

于 2014-01-21T11:14:37.120 に答える