Saya baru-baru ini bekerja dengan acara dan ingin melihat / mengontrol semua acara di halaman. Setelah melihat kemungkinan solusi, saya telah memutuskan untuk menempuh jalan saya sendiri dan membuat sistem khusus untuk memantau acara. Jadi, saya melakukan tiga hal.
Pertama, saya membutuhkan wadah untuk semua pendengar acara di halaman: itulah EventListeners
tujuannya. Ini memiliki tiga metode yang berguna: add()
, remove()
, dan get()
.
Berikutnya, saya membuat sebuah EventListener
objek untuk memegang informasi yang diperlukan untuk acara tersebut, yaitu: target
, type
, callback
, options
, useCapture
, wantsUntrusted
, dan menambahkan metode remove()
untuk menghapus pendengar.
Terakhir, saya memperluas yang asli addEventListener()
dan removeEventListener()
metode untuk membuatnya bekerja dengan objek yang saya buat ( EventListener
dan EventListeners
).
Pemakaian:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
membuat EventListener
objek, menambahkannya ke EventListeners
dan mengembalikan EventListener
objek, sehingga dapat dihapus nanti.
EventListeners.get()
dapat digunakan untuk melihat pendengar di halaman. Ia menerima sebuah EventTarget
atau string (tipe acara).
// EventListeners.get(document.body);
// EventListeners.get("click");
Demo
Katakanlah kita ingin mengetahui setiap pendengar acara di halaman ini. Kami dapat melakukannya (dengan asumsi Anda menggunakan ekstensi pengelola skrip, Tampermonkey dalam kasus ini). Script berikut melakukan ini:
// ==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);
Dan ketika kami daftar semua pendengar, dikatakan ada 299 pendengar acara. "Sepertinya" ada beberapa duplikat, tapi saya tidak tahu apakah mereka benar-benar duplikat. Tidak semua jenis acara digandakan, jadi semua "duplikat" itu mungkin adalah pendengar individu.
Kode dapat ditemukan di repositori saya . Saya tidak ingin mempostingnya di sini karena agak panjang.
Pembaruan: Ini sepertinya tidak berfungsi dengan jQuery. Ketika saya memeriksa EventListener, saya melihat bahwa panggilan baliknya
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Saya percaya ini milik jQuery, dan bukan panggilan balik yang sebenarnya. jQuery menyimpan panggilan balik aktual di properti TargetTarget:
$(document.body).click(function () {
console.log("jquery click");
});
Untuk menghapus pendengar acara, panggilan balik yang sebenarnya perlu diteruskan ke removeEventListener()
metode. Jadi untuk membuat ini berfungsi dengan jQuery, perlu modifikasi lebih lanjut. Saya mungkin memperbaikinya di masa depan.