Son zamanlarda etkinliklerle çalışıyordum ve bir sayfadaki tüm etkinlikleri görüntülemek / kontrol etmek istedim. Olası çözümlere baktığımda, kendi yoluma gitmeye ve olayları izlemek için özel bir sistem oluşturmaya karar verdim. Üç şey yaptım.
İlk olarak, sayfadaki tüm olay dinleyicileri için bir kapsayıcıya ihtiyacım vardı: EventListeners
nesne bu. Üç kullanışlı yöntemler vardır: add()
, remove()
, ve get()
.
Sonra, ben bir oluşturulan EventListener
etkinlik için gerekli bilgileri tutmak için nesneyi, yani: target
, type
, callback
, options
, useCapture
, wantsUntrusted
, ve bir yöntem eklendiremove()
dinleyici kaldırmak için.
Son olarak, yarattığım ( ve ) nesnelerle çalışmasını sağlamak için yerel addEventListener()
ve removeEventListener()
yöntemleri genişlettim .EventListener
EventListeners
Kullanımı:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
bir EventListener
nesne oluşturur, nesneyi ekler EventListeners
ve EventListener
nesneyi döndürür , böylece daha sonra kaldırılabilir.
EventListeners.get()
sayfadaki dinleyicileri görüntülemek için kullanılabilir. Bir EventTarget
veya bir dize (olay türü) kabul eder .
// EventListeners.get(document.body);
// EventListeners.get("click");
gösteri
Diyelim ki bu sayfadaki her olay dinleyicisini bilmek istiyoruz. Bunu yapabiliriz (bu durumda Tampermonkey bir komut dosyası yöneticisi uzantısı kullandığınızı varsayarak). Aşağıdaki komut dosyası bunu yapar:
// ==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);
Ve tüm dinleyicileri listelediğimizde, 299 olay dinleyicisi olduğunu söylüyor. Bazı kopyalar "görünüyor", ama gerçekten kopya olup olmadıklarını bilmiyorum. Her olay türü çoğaltılmaz, bu nedenle tüm bu "kopyalar" ayrı bir dinleyici olabilir.
Kod depomda bulunabilir. Buraya göndermek istemedim çünkü oldukça uzun.
Güncelleme: Bu jQuery ile çalışmıyor gibi görünüyor. EventListener'ı incelediğimde geri aramanın
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Bunun jQuery'ye ait olduğuna ve gerçek geri arama olmadığına inanıyorum. jQuery, gerçek geri aramayı EventTarget öğesinin özelliklerinde depolar:
$(document.body).click(function () {
console.log("jquery click");
});
Bir olay dinleyicisini kaldırmak için, gerçek geri aramanın removeEventListener()
yönteme iletilmesi gerekir . Yani bu jQuery ile çalışmak için, daha fazla değişiklik gerekiyor. Bunu gelecekte düzeltebilirim.