处理其他元素未处理的Javascript事件

处理其他元素未处理的Javascript事件,javascript,javascript-events,Javascript,Javascript Events,我正在编写一个脚本,在这个脚本中,我只希望在鼠标事件没有被任何其他元素处理过的情况下处理它们 我可以将事件侦听器附加到文档对象,但它将接收所有事件,而不管这些事件是否已被处理 我无法控制HTML页面中的元素,因此在处理事件时无法手动停止Ropagation() 有什么想法吗?所以,在特定的环境下,你可以完成你想要的事情。具体来说,如果 您可以在原始JavaScript之前加载自己的自定义JavaScript 你知道你在听哪些元素让其他人把事件放在上面 实际上,您要做的是将目标元素上的原始ad

我正在编写一个脚本,在这个脚本中,我只希望在鼠标事件没有被任何其他元素处理过的情况下处理它们

我可以将事件侦听器附加到文档对象,但它将接收所有事件,而不管这些事件是否已被处理

我无法控制HTML页面中的元素,因此在处理事件时无法手动停止Ropagation()


有什么想法吗?

所以,在特定的环境下,你可以完成你想要的事情。具体来说,如果

  • 您可以在原始JavaScript之前加载自己的自定义JavaScript
  • 你知道你在听哪些元素让其他人把事件放在上面
实际上,您要做的是将目标元素上的原始addEventListener方法替换为一个自定义方法,该方法拦截调用,执行一些特殊处理,然后让调用按正常方式继续。这个“特殊处理”是一个新函数,它包装了原始回调,并用一些状态标记事件参数,让您知道其他人已经处理了事件。这是一个概念证明(带a)

目标HTML:

<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()