나는 최근에 이벤트를 다루고 있었고 페이지의 모든 이벤트를 보거나 제어하고 싶었습니다. 가능한 솔루션을 살펴본 후, 나는 나 자신의 길을 가고 이벤트를 모니터링 할 사용자 지정 시스템을 만들기로 결정했습니다. 그래서 저는 세 가지 일을했습니다.
먼저 페이지의 모든 이벤트 리스너에 대한 컨테이너가 필요했습니다. 이것이 바로 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");
});
이벤트 리스너를 제거하려면 실제 콜백을 removeEventListener()
메소드에 전달해야합니다 . 따라서 jQuery에서이 작업을 수행하려면 추가 수정이 필요합니다. 나중에 고칠 수도 있습니다.