tl; dr : Không, bạn không thể làm điều này theo bất kỳ cách nào được hỗ trợ tự nhiên.
Cách duy nhất tôi biết để đạt được điều này là tạo một đối tượng lưu trữ tùy chỉnh nơi bạn lưu giữ hồ sơ về những người nghe được thêm vào. Vài điều dọc theo những dòng sau:
/* Create a storage object. */
var CustomEventStorage = [];
Bước 1: Đầu tiên, bạn sẽ cần một hàm có thể duyệt qua đối tượng lưu trữ và trả về bản ghi của một phần tử đã cho phần tử đó (hoặc false).
/* The function that finds a record in the storage by a given element. */
function findRecordByElement (element) {
/* Iterate over every entry in the storage object. */
for (var index = 0, length = CustomEventStorage.length; index < length; index++) {
/* Cache the record. */
var record = CustomEventStorage[index];
/* Check whether the given element exists. */
if (element == record.element) {
/* Return the record. */
return record;
}
}
/* Return false by default. */
return false;
}
Bước 2: Sau đó, bạn sẽ cần một chức năng có thể thêm trình nghe sự kiện nhưng cũng chèn trình nghe đó vào đối tượng lưu trữ.
/* The function that adds an event listener, while storing it in the storage object. */
function insertListener (element, event, listener, options) {
/* Use the element given to retrieve the record. */
var record = findRecordByElement(element);
/* Check whether any record was found. */
if (record) {
/* Normalise the event of the listeners object, in case it doesn't exist. */
record.listeners[event] = record.listeners[event] || [];
}
else {
/* Create an object to insert into the storage object. */
record = {
element: element,
listeners: {}
};
/* Create an array for event in the record. */
record.listeners[event] = [];
/* Insert the record in the storage. */
CustomEventStorage.push(record);
}
/* Insert the listener to the event array. */
record.listeners[event].push(listener);
/* Add the event listener to the element. */
element.addEventListener(event, listener, options);
}
Bước 3: Đối với yêu cầu thực tế của câu hỏi của bạn, bạn sẽ cần hàm sau để kiểm tra xem một phần tử đã được thêm trình xử lý sự kiện cho một sự kiện cụ thể hay chưa.
/* The function that checks whether an event listener is set for a given event. */
function listenerExists (element, event, listener) {
/* Use the element given to retrieve the record. */
var record = findRecordByElement(element);
/* Check whether a record was found & if an event array exists for the given event. */
if (record && event in record.listeners) {
/* Return whether the given listener exists. */
return !!~record.listeners[event].indexOf(listener);
}
/* Return false by default. */
return false;
}
Bước 4: Cuối cùng, bạn sẽ cần một chức năng có thể xóa một người nghe khỏi đối tượng lưu trữ.
/* The function that removes a listener from a given element & its storage record. */
function removeListener (element, event, listener, options) {
/* Use the element given to retrieve the record. */
var record = findRecordByElement(element);
/* Check whether any record was found and, if found, whether the event exists. */
if (record && event in record.listeners) {
/* Cache the index of the listener inside the event array. */
var index = record.listeners[event].indexOf(listener);
/* Check whether listener is not -1. */
if (~index) {
/* Delete the listener from the event array. */
record.listeners[event].splice(index, 1);
}
/* Check whether the event array is empty or not. */
if (!record.listeners[event].length) {
/* Delete the event array. */
delete record.listeners[event];
}
}
/* Add the event listener to the element. */
element.removeEventListener(event, listener, options);
}
Đoạn trích:
window.onload = function () {
var
/* Cache the test element. */
element = document.getElementById("test"),
/* Create an event listener. */
listener = function (e) {
console.log(e.type + "triggered!");
};
/* Insert the listener to the element. */
insertListener(element, "mouseover", listener);
/* Log whether the listener exists. */
console.log(listenerExists(element, "mouseover", listener));
/* Remove the listener from the element. */
removeListener(element, "mouseover", listener);
/* Log whether the listener exists. */
console.log(listenerExists(element, "mouseover", listener));
};
<!-- Include the Custom Event Storage file -->
<script src = "https://cdn.rawgit.com/angelpolitis/custom-event-storage/master/main.js"></script>
<!-- A Test HTML element -->
<div id = "test" style = "background:#000; height:50px; width: 50px"></div>
Mặc dù đã hơn 5 năm trôi qua kể từ khi OP đăng câu hỏi, tôi tin rằng những người vấp phải nó trong tương lai sẽ được hưởng lợi từ câu trả lời này, vì vậy hãy thoải mái đưa ra đề xuất hoặc cải thiện nó. 😊