处理其他元素未处理的Javascript事件
我正在编写一个脚本,在这个脚本中,我只希望在鼠标事件没有被任何其他元素处理过的情况下处理它们 我可以将事件侦听器附加到文档对象,但它将接收所有事件,而不管这些事件是否已被处理 我无法控制HTML页面中的元素,因此在处理事件时无法手动停止Ropagation()处理其他元素未处理的Javascript事件,javascript,javascript-events,Javascript,Javascript Events,我正在编写一个脚本,在这个脚本中,我只希望在鼠标事件没有被任何其他元素处理过的情况下处理它们 我可以将事件侦听器附加到文档对象,但它将接收所有事件,而不管这些事件是否已被处理 我无法控制HTML页面中的元素,因此在处理事件时无法手动停止Ropagation() 有什么想法吗?所以,在特定的环境下,你可以完成你想要的事情。具体来说,如果 您可以在原始JavaScript之前加载自己的自定义JavaScript 你知道你在听哪些元素让其他人把事件放在上面 实际上,您要做的是将目标元素上的原始ad
有什么想法吗?所以,在特定的环境下,你可以完成你想要的事情。具体来说,如果
- 您可以在原始JavaScript之前加载自己的自定义JavaScript
- 你知道你在听哪些元素让其他人把事件放在上面
<div id='asdf'>asdf</div>
从这篇文章 看来还不可能做到这一点 注册了哪些事件处理程序 W3C事件注册当前实现的一个问题 模型是,您无法发现是否已经存在任何事件处理程序 注册到一个元素。在传统模式中,您可以执行以下操作:
警报(element.onclick)
您可以看到注册到的函数
如果没有注册,则为未定义。仅在最近的DOM中
级别3事件W3C添加了一个
eventListenerList
存储事件列表的步骤
当前在元素上注册的处理程序。这
功能还不受任何浏览器的支持,它太新了。
然而,这个问题已经得到解决
幸好
如果事件
要删除的侦听器尚未添加到元素中,因此
毫无疑问,您始终可以使用removeEventListener()
你无法控制的点击事件是如何被绑定的?我真的不知道,因为这是一个库的一部分,可以用于不同类型的页面。可以是addEventListener或onXXX。是的,
addEventListener
使它更难。对于on[event]类型,您可以将其绑定到文档,使您的处理程序从e.target
开始,并测试它及其祖先,以查看哪个具有该处理程序,然后使用调用stopPropagation
的函数包装它。但是addEventListener
不会让你这么做。@RobinMaben:除了它对绑定了addEventListener
的处理程序不起作用之外,因为据我所知,无法询问元素是否绑定了处理程序。我的意思是,我想这是一个部分答案,但可能还有另一种方式我没有想到of@RobinMaben:假设正在使用jQuery。它只适用于jQuery事件系统中具有处理程序的元素。听起来Grodriguez在寻找一个通用的解决方案。好的。。(尽管我并不需要一个听众列表)。让我们看看我是否能找到其他方法。这是一个有趣的想法。我可以确保我的JS将在原始版本之前运行。但是,我无法知道哪些元素将添加事件侦听器。有没有办法做到这一点,但要以全球的方式?(即,用修改版本全局替换addEventListener代码)
var target = document.getElementById('asdf');
var original = target.addEventListener;
var updated = function(){
// Grab the original callback, so we can use it in our wrapper
var originalFunc = arguments[1];
// Create new function for the callback, that lets us set a state letting us know it has been handled by someone
// Finish the callback by executing the original callback
var newFunc = function(e){
console.log('haha, intercepted you');
e.intercepted = true;
originalFunc.call(this, e);
};
// Set the new function in place in the original arguments 'array'
arguments[1] = newFunc;
// Perform the standard addEventListener logic with our new wrapper function
original.apply(this, arguments);
};
// Set the addEventListener on our target to our modified version
target.addEventListener = updated;
// Standard event handling
target.addEventListener('click', function(e){
console.log('original click');
console.log('intercepted?', e.intercepted);
})
removeEventListener()