のリスナーを1回だけ追加したいbeforeunload
。これは私の擬似コードです:
if(window.hasEventListener('beforeunload') === false) {
window.addEventListener('beforeunload', function() { ... }, false);
}
しかし、hasEventListener
明らかに存在しません。どうすればこれを達成できますか?ありがとう。
のリスナーを1回だけ追加したいbeforeunload
。これは私の擬似コードです:
if(window.hasEventListener('beforeunload') === false) {
window.addEventListener('beforeunload', function() { ... }, false);
}
しかし、hasEventListener
明らかに存在しません。どうすればこれを達成できますか?ありがとう。
実際、リスナーがターゲットに追加されたかどうかを確認する必要はありません。
複数の同一のEventListenerが同じパラメーターで同じEventTargetに登録されている場合、重複するインスタンスは破棄されます。これらによってEventListenerが2回呼び出されることはなく、重複は破棄されるため、removeEventListenerメソッドを使用して手動で削除する必要はありません。
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")
。変更ログには、考慮すべき警告があります。
これはサポートされているパブリックインターフェイスではないことに注意してください。実際のデータ構造は、バージョンごとに互換性がないように変更される場合があります。