私は最近イベントを操作していて、ページ内のすべてのイベントを表示/制御したいと思っていました。可能な解決策を検討した結果、私は独自の方法でイベントを監視するカスタムシステムを作成することにしました。だから、私は3つのことをしました。
まず、ページ内のすべてのイベントリスナーのコンテナーが必要でしたEventListeners
。それがオブジェクトです。これは3つの便利なメソッドがありますadd()
、remove()
とget()
。
次は、私が作成したEventListener
イベントのために必要な情報を保持するオブジェクトを、すなわち:target
、type
、callback
、options
、useCapture
、wantsUntrusted
、およびメソッドを追加remove()
リスナーを削除します。
最後に、ネイティブaddEventListener()
とremoveEventListener()
メソッドを拡張して、作成したオブジェクト(EventListener
およびEventListeners
)で動作するようにしました。
使用法:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
EventListener
オブジェクトを作成して追加しEventListeners
、EventListener
オブジェクトを返すため、後で削除できます。
EventListeners.get()
ページ内のリスナーを表示するために使用できます。EventTarget
または文字列(イベントタイプ)を受け入れます。
// EventListeners.get(document.body);
// EventListeners.get("click");
デモ
この現在のページのすべてのイベントリスナーを知りたいとしましょう。私たちはそれを行うことができます(この場合、スクリプトマネージャー拡張機能、Tampermonkeyを使用している場合)。次のスクリプトはこれを行います:
// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @include https://stackoverflow.com/*
// @grant none
// ==/UserScript==
(function() {
fetch("https://raw.githubusercontent.com/akinuri/js-lib/master/EventListener.js")
.then(function (response) {
return response.text();
})
.then(function (text) {
eval(text);
window.EventListeners = EventListeners;
});
})(window);
すべてのリスナーをリストすると、299のイベントリスナーがあると表示されます。重複しているように見えますが、実際に重複しているかどうかはわかりません。すべてのイベントタイプが複製されるわけではないため、これらの「複製」はすべて個別のリスナーである可能性があります。
コードは私のリポジトリにあります。かなり長いので投稿したくありませんでした。
更新:これはjQueryでは機能しないようです。EventListenerを調べると、コールバックが
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
これはjQueryに属し、実際のコールバックではないと思います。jQueryは、実際のコールバックをEventTargetのプロパティに格納します。
$(document.body).click(function () {
console.log("jquery click");
});
イベントリスナーを削除するには、実際のコールバックをremoveEventListener()
メソッドに渡す必要があります。したがって、jQueryでこれを機能させるには、さらに変更する必要があります。将来は修正するかもしれません。