28

のリスナーを1回だけ追加したいbeforeunload。これは私の擬似コードです:

if(window.hasEventListener('beforeunload') === false) {
     window.addEventListener('beforeunload', function() { ... }, false);
}

しかし、hasEventListener明らかに存在しません。どうすればこれを達成できますか?ありがとう。

4

3 に答える 3

36

実際、リスナーがターゲットに追加されたかどうかを確認する必要はありません。

複数の同一のEventListenerが同じパラメーターで同じEventTargetに登録されている場合、重複するインスタンスは破棄されます。これらによってEventListenerが2回呼び出されることはなく、重複は破棄されるため、removeEventListenerメソッドを使用して手動で削除する必要はありません。

ソース:https ://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener#Multiple_identical_event_listeners

于 2015-02-19T13:22:51.833 に答える
11

jqueryを使用するdata("events")と、任意のオブジェクト(ここではウィンドウ)で使用できます。

var hasbeforeunload = $(window).data("events") && $(window).data("events").['beforeunload'];

ただし、これはjqueryで追加されたイベントに対してのみ機能します。

より一般的なケースでは、リスナーを追加した情報をどこかに保存するだけです。

   var addedListeners = {};
   function addWindowListenerIfNone(eventType, fun) {
      if (addedListeners[eventType]) return;
      addedListeners[eventType] = fun;
      window.addEventListener(eventType, fun);
   }

javascriptには、既存のイベントハンドラーを取得するための標準的な方法はないと思います。せいぜい、リスナーをインターセプトして保存するためにNodeのaddEventListener関数を追加することができますが、私はそれをお勧めしません...

編集 :

jQuery 1.8以降、イベントデータはで利用できます$._data(element, "events")。変更ログには、考慮すべき警告があります。

これはサポートされているパブリックインターフェイスではないことに注意してください。実際のデータ構造は、バージョンごとに互換性がないように変更される場合があります。

于 2012-07-11T10:32:13.460 に答える
5

Chrome Devツールでは、要素に関連付けられているすべてのイベントを確認できます(デバッグ用)-

// print all events attached to document
var eventObjectAttachedToDocument = getEventListeners(document);

for (var event in eventObjectAttachedToDocument) {
    console.log(event);
}

ここに画像の説明を入力してください

于 2018-07-04T14:04:40.500 に答える