49

我有两个函数在两个不同时间绑定到单击事件(使用 jQuery)。他们被解雇的顺序很重要。他们以正确的顺序开火。问题是,当第一个函数返回 false 时,第二个函数仍在触发!

如何正确取消活动?

示例代码:

$(document).click(function() { 
  alert('a');
  return false;
});

$(document).click(function() {
  alert('b');
});

单击页面时,您仍然会看到“b”警报消息。这是无法接受的!

4

6 回答 6

88

使用stopImmediatePropagationjQuery 事件对象的功能。

阻止其余的处理程序被执行。此方法还通过调用 event.stopPropagation() 来停止冒泡。

$(document).click(function(event) { 
  alert('a');
  event.stopImmediatePropagation();
  return false;
});

$(document).click(function() {
  alert('b');
});
于 2009-03-16T23:31:06.123 回答
2

我要问的第一件事是:为什么你有两个函数绑定到同一个点击事件?可以访问代码,为什么不只打一个电话?

$(function (){
    var callbackOne = function(e){
        alert("I'm the first callback... Warning, I might return false!");
        return false;
    };

    var callbackTwo = function(e){
        alert("I'm the second callback");
    };

    $(document).click(function (e){
        if(callbackOne(e)){
            callbackTwo(e);
        }
    });
});
于 2009-03-16T23:28:45.943 回答
2

谢谢, unbind 适用于重新定义功能。

  $(document).ready(function(){
        $("#buscar_mercaderia").click(function(){ alert('Seleccione Tipo de mercaderia'); 
   });
$(".tipo").live('click',function(){
            if($(this).attr('checked')!=''){
                if($(this).val()=='libro'){
                    $("#buscar_mercaderia").unbind('click');
                    $("#buscar_mercaderia").click(function(){  window.open('buscar_libro.php','Buscar Libros', 'width=800,height=500'); });
                }else if($(this).val()=='otra'){
                    $("#buscar_mercaderia").unbind('click');
                    $("#buscar_mercaderia").click(function(){ window.open('buscar_mercaderia.php','Buscar Mercaderias', 'width=800,height=500');  });
                }
            }
        })
于 2011-03-04T18:41:33.217 回答
1

使用 unbind 有帮助吗?

$(document).click(function() { 
  alert('a');
  $(this).unbind('click');
  return false;
});
于 2009-03-16T23:16:17.890 回答
0

如果 nickf 所说的不起作用,您可以使用小型状态机:

var trigger = 0;

$(document).click(function() { 

  alert('a');
  if(you_want_to_return_false) {
    trigger = 1;
    return false;
  }
});

$(document).click(function() {
  if(trigger !== 0) {
  alert('b');
  } 
  trigger = 0;
});

不是最漂亮的解决方案,但它会起作用。

于 2009-03-16T23:19:27.633 回答
0

另一种解决方案是去抖动或限制函数。

通过这种方式,您可以确保尽管它多次触发,但它只在设定的持续时间内执行。这将允许您的代码按原样工作。

于 2020-09-08T19:47:52.220 回答