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事件对象的
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; }); |
不是最漂亮的解决方案,但它会起作用。