您如何从第三方 JavaScript 跟踪和分析中删除或阻止事件监听器?

How can you remove or block event listeners from third party JavaScript tracking & analytics?

我 运行 一个电子商务网站,我们有各种第三方 JavaScript 将点击处理程序添加到链接和表单,然后插入延迟以确保跟踪通过。通过燃烧 CPU 和 运行ning for 或 while 循环插入延迟,直到某个日期在 350 毫秒后(Marketo / Munchkin)或 500 毫秒(对于 Visual Website Optimizer)过去。加起来差不多是 1 秒!

有时候,也许延迟很好,所以跟踪可以更可靠。但是,我们不希望在您单击我们网站上的大多数链接时发生这种情况,因为它会给用户增加 1 秒的延迟。有了这么大的延迟,我们所做的所有其他性能优化都将消失!

遗憾的是,我们需要这些脚本的很多功能(例如 Visual Website Optimizer 和 Marketo),因此我们无法删除它们。

如果我没有对它们的引用,是否可以删除它们添加的处理程序或阻止它们触发?

您可以使用 unbind 删除事件。

如果您需要知道事件名称或类型,可以用Chrome Dev Tools

查看

另一种方法是捕获事件并stop the propagation

编辑: 如果事件不是用 jQuery 启动的,您可以使用 removeEventListener or set null the property event.

如果不引用处理函数,您将无法删除事件侦听器,但您可以做的是克隆该元素。

var elements = document.getElementsByTagName('a');
for(var i =0 ; i < elements.length; i++){
    var cloned = elements[i].cloneNode(true);
    elements[i].parentNode.replaceChild(cloned, elements[i])
}

好吧,另一种解决方法可能是更改 setTimeout 功能,使其在没有延迟或延迟更短的情况下工作

window.oldSetTimeout = window.setTimeout;
window.setTimeout = function(func, delay) {
   //change the delay value here
   return window.oldSetTimeout(function() {
       func();
   }, delay);
};

您可以使用纯 javascript 来删除事件侦听器,

在你的程序开始时调用一个函数来删除事件监听器,就像这样

var domElement = document.getElementById('elementWithEventListener');
domElement.removeEventListener('click',listener)

是的,您必须找出哪些听众被解雇了。

查看 Event listeners 了解更多信息。