Javascript 检测默认事件处理

Javascript 检测默认事件处理,javascript,event-handling,dom-events,greasemonkey,ecmascript-5,Javascript,Event Handling,Dom Events,Greasemonkey,Ecmascript 5,是否可以在Firefox的Greasemonkey代码()中检测特定DOM事件是否绑定了任何事件处理程序(包括浏览器默认事件处理) 到目前为止,我已在选中文本时取消了单击事件处理,但我希望在以下所有情况下取消事件处理,单击事件触发默认操作: 选择页面上的文本 显示关联菜单(即右键单击) 随后会出现一个链接(如果解决方案未捕获默认浏览器事件处理程序,请左键单击)。 -如果这个功能确实不存在,请引用一些文章或博客,而不仅仅是你自己的观点。 -特别的建议是受欢迎的,但我主要感兴趣的是是否存在一个通用

是否可以在Firefox的Greasemonkey代码()中检测特定DOM事件是否绑定了任何事件处理程序(包括浏览器默认事件处理)

到目前为止,我已在选中文本时取消了单击事件处理,但我希望在以下所有情况下取消事件处理,单击事件触发默认操作:

  • 选择页面上的文本
  • 显示关联菜单(即右键单击)
  • 随后会出现一个链接(如果解决方案未捕获默认浏览器事件处理程序,请左键单击
    )。
    
    -如果这个功能确实不存在,请引用一些文章或博客,而不仅仅是你自己的观点。
    -特别的建议是受欢迎的,但我主要感兴趣的是是否存在一个通用的解决方案

    更新:可接受的解决方案包括:

    • 我需要检查的
      if
      条件的详尽(ish)列表
    • 可从Firefox插件访问的非javascript方式
    • 解释Firefox如何知道点击一个有效的
      元素会触发重新加载新的URL+这个逻辑是如何无法从javascript/插件访问的

    这个问题几乎是重复的,除了作为Greasemonkey脚本编写者,您还有一个(复杂的)选择

    从您的问题来看,您似乎希望为没有节点的节点设置一个默认操作,然后在任何其他事件处理程序为给定事件触发时中止该默认操作。对此没有“全面捕获机制”,您尝试的几乎任何技术都可能会破坏某些页面。原因如下:

  • javascript和Greasemonkey API都没有提供任何机制来列出给定节点的事件

    但是,Firefox加载项可以通过列出事件,因此您可以为该部分编写一个与Greasemonkey接口的helper加载项。详细信息(远远)超出了这个问题的范围

  • 类似地,也没有从中检测事件链中先前事件的机制,除非设置了
    event.defaultPrevented
    (通常不会)

  • 即使您可以列出节点X的事件监听器,这也无助于父节点上的回退监听器。现代JS库可以,有时也可以,使任何旧节点可单击。和/或它们可以设置一个监听器,例如,
    document
    ,该监听器获取所有单击事件,但实际上除了原始目标为ome特异性节点


  • 一个好的折衷策略是遵循另一个问题的线索,不使用默认操作为节点做任何事情。
    要处理右键单击或中键单击,请选中
    event.which

    因此,您可以将以下代码段添加到检查中:

    return function(e){
        targt   = e.target;
        sel     = window.getSelection();
    
        if (e.which != 1) {
            return; //-- Abort on anything that is not a left-click.
        }
        if (e.defaultPrevented) {
            return; //-- The one time we know that some other handler fired.
        }
        if (isInteractiveElement (targt) ) {
            // Do nothing for elements that trigger browser actions
            return; 
        }
        ...
    
    其中:

    function isInteractiveElement (node) {
        var intElems = [
            //-- Must be uppercase
            "A", "BUTTON", "INPUT", "TEXTAREA", "VIDEO", "MAP", "OBJECT"
        ];
        if (intElems.indexOf (node.nodeName) >= 0) {
            return true;
        }
        else if (node.nodeName === "BODY") {
            return false;
        }
    
        return isInteractiveElement (node.parentNode);
    }
    

    不,没有“捕获所有事件”解决方案。我只能考虑挂接
    文档
    并检查是否为特定事件阻止了默认设置(如果停止传播,这甚至不起作用)@Bergi在我的例子中,如果传播被停止,那没关系,我只想在浏览器中没有其他东西想处理它的情况下执行我的点击事件处理,然后只需在
    切换高亮显示
    函数中添加一个。@Bergi感谢其中的一个条件,仍然需要类似
    if(e.thereIsADefault)的东西
    很长一段时间都没有更好的答案,所以我最终接受了这个答案-不管怎样,我放弃了我的Greasemonkey脚本,现在我使用三次单击+
    ::-moz选择来突出显示具有令人愉悦颜色的文本