有些网站会在用户的鼠标离开视口(viewport)时显示一个弹出窗口。这是一种极其令人恼火的行为,我想改掉。我的策略是编写一个 TamperMonkey 脚本来消除或防止这种行为。不幸的是,我没有尝试过。
注意:我正在努力使这个脚本尽可能通用。
事件是这样添加的(可能还有其他方法,但我还没有接触到):
一个对象被初始化,其中执行了这一行:
document.documentElement.addEventListener('mouseleave', someHandler);
这是我尝试过的:
按名称直接删除事件处理程序(为了尽可能通用,这实际上是我最后一次尝试,因为我不一定知道事件处理程序的名称):
document.documentElement.removeEventListener('mouseleave', someHandler);
但是这给了我以下错误:“someHandler is not defined”,可能是因为 someHandler 在一个对象内并且不能从外部访问(我错过了什么吗?)
然后我想我会在处理结果之前尝试找到给定对象上的所有事件监听器:
getEventListeners(document.documentElement)
但不幸的是,这种方法显然只存在于开发工具和can't be accessed from TamperMonkey中。
- 然后我想“也许 Chrome 控制台可以在每次加载页面时运行自己的脚本?”但我在这方面找不到任何信息。
我的下一个想法是“如果我不能移除它,我会阻止它发射!”。
document.documentElement.addEventListener('mouseleave', myOwnHandler);
函数 myOwnHandler(e){
e.stopImmediatePropagation();
但这也不起作用,因为我无法尽早参加事件。我告诉我的 TamperMonkey 脚本尽可能早地运行,它仍然被击败。为了使 stopImmediatePropagation() 起作用,我的事件需要先触发(事件按照添加的顺序触发)。
任何有关如何使其中之一发挥作用的线索,或任何其他想法,我们将不胜感激。
谢谢
附注抱歉,无法让所有代码看起来都正确。
最佳答案
如果这不是学习练习,而您只是想防止这种情况发生,为什么不使用广告拦截器呢?例如,uMatrix 允许您在每个域的基础上阻止 cookies/img/scripts/frames/XHR,因此这些脚本不会首先注册那些烦人的事件处理程序。
关于javascript - 防止其他脚本的不良行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34326092/