javascript - 是否可以监视 HTML 元素中的事件侦听器以了解其中一个被删除的时间?
问题描述
我在页面中遇到问题,在某些情况下未触发事件。这不是我的代码,我正在尝试调试缩小和模糊的 JavaScript 代码,我快疯了。
当回复我们网站上的评论时,如果回复的文本为空,则触发此事件(用于注册用户单击回复按钮的分析事件)。如果有文本,则不会触发该事件。
元素是一个<span>
标签,但事件监听器实际上是附加到<body>
标签上的。我目前的理论是,当回复中有实际文本时正在执行的某些代码正在删除该事件侦听器,因此它不会被触发。
那么,有没有办法监视事件侦听器<body>
以了解该事件侦听器何时(以及在代码中的何处)被删除?
更新 我们发现了问题。我们用于评论的第三方库正在删除按钮的父元素,这使得事件无法传播到正文。
解决方案
如果您可以在删除事件处理程序之前运行脚本代码,则可以用您自己的函数替换removeEventListener
on :document.body
const original = document.body.removeEventListener;
document.body.removeEventListener = function(...args) {
console.log("Removed");
return original.apply(this, args);
};
function handler() {
console.log("Clicked");
}
document.body.addEventListener("click", handler);
document.body.removeEventListener("click", handler);
(为了覆盖您的基础,您还可以将onclick
(或正在使用的任何东西)转换为访问器,以便您可以在代码执行时捕获它document.body.onclick = null;
)
还有其他方法可以添加和删除处理程序,但希望您使用的任何库都使用该标准。
旁注:要确认您关于处理程序被删除的理论,您可以在 Chrome 的 devtools 中检查元素上的处理程序:右键单击页面并选择“检查元素”,向上导航到body
,然后查看“事件侦听器”选项卡。