关于jQuery多事件处理程序:jQuery多事件处理程序 – 如何取消?

jQuery Multiple Event Handlers - How to Cancel?

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

如何正确取消活动?

示例代码:

1
2
3
4
5
6
7
8
$(document).click(function() {
  alert('a');
  return false;
});

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

单击页面时,仍会看到"B"警报消息。这是不可接受的!


使用jquery事件对象的stopImmediatePropagation函数。

Keeps the rest of the handlers from being executed.
This method also stops the bubbling by calling event.stopPropagation().

1
2
3
4
5
6
7
8
9
$(document).click(function(event) {
  alert('a');
  event.stopImmediatePropagation();
  return false;
});

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


谢谢,解除绑定可以重新定义函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  $(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');  });
                }
            }
        })


我要问的第一件事是:为什么有两个函数绑定到同一个单击事件?有了密码,为什么不打一个电话呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$(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);
        }
    });
});


使用解除绑定有帮助吗?

1
2
3
4
5
$(document).click(function() {
  alert('a');
  $(this).unbind('click');
  return false;
});


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
});

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