ฉันเพิ่งทำงานกับกิจกรรมและต้องการดู / ควบคุมกิจกรรมทั้งหมดในหน้า เมื่อพิจารณาถึงวิธีการแก้ปัญหาที่เป็นไปได้ฉันตัดสินใจที่จะไปตามทางของตัวเองและสร้างระบบที่กำหนดเองเพื่อติดตามเหตุการณ์ ดังนั้นฉันทำสามสิ่ง
ก่อนอื่นฉันต้องการคอนเทนเนอร์สำหรับผู้ฟังเหตุการณ์ทั้งหมดในหน้านั่นคือEventListeners
วัตถุ มันมีสามวิธีที่มีประโยชน์: 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");
});
ในการลบ listener เหตุการณ์จำเป็นต้องส่งการเรียกกลับที่แท้จริงไปยังremoveEventListener()
เมธอด ดังนั้นเพื่อให้การทำงานกับ jQuery นี้ต้องการการแก้ไขเพิ่มเติม ฉันอาจแก้ไขได้ในอนาคต