Gần đây tôi đã làm việc với các sự kiện và muốn xem / kiểm soát tất cả các sự kiện trong một trang. Xem xét các giải pháp khả thi, tôi quyết định đi theo con đường của riêng mình và tạo ra một hệ thống tùy chỉnh để theo dõi các sự kiện. Vì vậy, tôi đã làm ba điều.
Đầu tiên, tôi cần một thùng chứa cho tất cả những người nghe sự kiện trong trang: đó là EventListeners
đối tượng. Nó có ba phương pháp hữu ích: add()
, remove()
, và get()
.
Tiếp theo, tôi đã tạo ra một EventListener
đối tượng để giữ thông tin cần thiết cho sự kiện này, ví dụ: target
, type
, callback
, options
, useCapture
, wantsUntrusted
, và thêm một phương pháp remove()
để loại bỏ người nghe.
Cuối cùng, tôi đã mở rộng nguồn gốc addEventListener()
và removeEventListener()
các phương thức để làm cho chúng hoạt động với các đối tượng tôi đã tạo ( EventListener
và EventListeners
).
Sử dụng:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
tạo một EventListener
đối tượng, thêm nó vào EventListeners
và trả về EventListener
đối tượng, để nó có thể được gỡ bỏ sau đó.
EventListeners.get()
có thể được sử dụng để xem người nghe trong trang. Nó chấp nhận một EventTarget
hoặc một chuỗi (loại sự kiện).
// EventListeners.get(document.body);
// EventListeners.get("click");
Bản giới thiệu
Hãy nói rằng chúng tôi muốn biết mọi người nghe sự kiện trong trang hiện tại này. Chúng tôi có thể làm điều đó (giả sử bạn đang sử dụng tiện ích mở rộng trình quản lý tập lệnh, Tampermonkey trong trường hợp này). Kịch bản sau đây thực hiện điều này:
// ==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);
Và khi chúng tôi liệt kê tất cả những người nghe, nó nói có 299 người nghe sự kiện. Có vẻ như có một số bản sao, nhưng tôi không biết liệu chúng có thực sự trùng lặp hay không. Không phải mọi loại sự kiện đều được nhân đôi, vì vậy tất cả những "bản sao" đó có thể là một người nghe riêng lẻ.
Mã có thể được tìm thấy tại kho lưu trữ của tôi . Tôi không muốn đăng nó ở đây vì nó khá dài.
Cập nhật: Điều này dường như không hoạt động với jQuery. Khi tôi kiểm tra EventListener, tôi thấy rằng cuộc gọi lại là
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Tôi tin rằng điều này thuộc về jQuery và không phải là cuộc gọi lại thực tế. jQuery lưu trữ cuộc gọi lại thực tế trong các thuộc tính của EventTarget:
$(document.body).click(function () {
console.log("jquery click");
});
Để loại bỏ một người nghe sự kiện, cuộc gọi lại thực tế cần phải được chuyển đến removeEventListener()
phương thức. Vì vậy, để làm cho điều này hoạt động với jQuery, nó cần sửa đổi thêm. Tôi có thể sửa nó trong tương lai.