【问题标题】:Cancel jQuery event handling取消 jQuery 事件处理
【发布时间】:2009-01-29 14:05:06
【问题描述】:

我通过以下方式设置了 onclick 事件处理程序:

element.onclick = function() { /*code */ }

假设有使用 jQuery 方法 bind() 或类似处理程序设置的事件处理程序。

$('element').bind('click', function(){/*another function*/})

如何防止从我在开头描述的处理程序中调用使用 jQuery 定义的处理程序?

NB stopPropagation() 等。jQuery 的方法不适用于该函数,因为它是通过原生事件对象传递的。

【问题讨论】:

    标签: javascript jquery events


    【解决方案1】:

    我不是 100% 确定你在问什么,但也许这会有所帮助:

    您可以通过 jQuery 公开的 Event 构造函数创建一个新的事件对象(符合 W3C DOM):

    例如:

    element.onclick = function(e) {
        var aBetterEventObject = jQuery.Event(e);
        // Now you can do what you want: (Cross-browser)
        aBetterEventObject.preventDefault()
        aBetterEventObject.isDefaultPrevented()
        aBetterEventObject.stopPropagation()
        aBetterEventObject.isPropagationStopped()
        aBetterEventObject.stopImmediatePropagation()
        aBetterEventObject.isImmediatePropagationStopped()
    }
    

    编辑:再次阅读您的问题,我认为传播不是问题 - 您似乎想取消在事件处理程序中运行的事件处理程序 - 我不确定这是可能的。您可以取消绑定所有处理程序(jQuery(elem).unbind('click')),但我认为这不是您所追求的......

    【讨论】:

      【解决方案2】:

      尝试在 jQuery 事件处理程序中添加以下行:

      return false;
      

      【讨论】:

        【解决方案3】:

        继续 JimmyP 的回答。这个我试过了

        $('#x').click( function(e){
            alert('hello');
        });
        document.getElementById('x').onclick = function(){
            $('#x').unbind('click');
            alert("goodbye");
        }
        

        在本例中,jQuery 事件运行一次。我不认为你可以依赖被调用的处理程序的顺序,但是你定义它们,所以我想你必须接受 jQuery 事件可能会触发一次。首先添加 onclick 确实会阻止 jQuery 事件触发,但正如我所说,我认为这不可靠。

        【讨论】:

        • 2meouw:正如我所解释的,unbind 将永远丢弃处理程序警报“你好”。不好 :) 用例可以是: document.getElementById('x').onclick = function() { if ( /*some case*/ ) { /* prevent call function alerting 'HELLO' */ } }因此,当我再次单击该元素时,情况可能是错误的并且应该调用处理程序。我清楚了吗? :)
        • +1 我认为你不能保证调用事件处理程序的顺序
        【解决方案4】:

        Jquery 有一个命名空间事件的方法。 http://docs.jquery.com/Namespaced_Events

        您可以通过命名空间添加、触发和删除绑定到同一事件的单独函数:

        $("a").bind("click.custom1",function(){ ... });
        $("a").bind("click.custom2",function(){ ... });
        $("a").trigger("click.custom2");
        $("a").unbind("click.custom2");
        

        只要您取消绑定命名空间事件,您的正常点击应该不受影响。如果这不起作用,您可能必须将两个单独的命名空间绑定到上面的 click 事件。

        【讨论】:

        • 不幸的是,我只能更改使用内联方法附加的处理程序。我无法影响与 jQuery 的绑定 - 其他开发人员可以在他重用我的代码时完成。
        • 那么设置是什么?您是否正在开发一些 javascript 来添加到现有的 jquery 脚本中?也许还有另一个元素,您可以将 onclick 添加到该气泡中,直到附加了 jquery 事件的元素。
        • 我正在开发一种插件。简而言之,在某些情况下,它应该防止由元素上发生的事件引起的任何活动。前任。它应该防止任何事件处理程序触发某些事件。处理程序可以由用户附加 - 使用 jquery 或内联技术。
        • [继续...]我只能在 inline 处理程序中加入我之前添加的内容,从而取消该处理程序。之后将调用 jquery 设置处理程序。我想防止这种情况发生
        • 我认为你不能保证事件处理程序被调用的顺序——很可能一旦你的事件触发,jQuery 处理程序就已经执行了......
        猜你喜欢
        • 2010-10-22
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多