我有两个函数在两个不同的时间绑定到一个click事件(使用jQuery)。他们被解雇的顺序很重要。他们按照正确的顺序开火。问题是,当第一个函数返回false时,第二个函数仍在触发!
如何正确取消活动?
示例代码:
$(document).click(function() {
alert('a');
return false;
});
$(document).click(function() {
alert('b');
});
单击页面时,您仍会看到“b”警告消息。这是不可接受的!
答案 0 :(得分:85)
使用jQuery事件对象的stopImmediatePropagation
函数。
保持其余的处理程序不被执行。 此方法还通过调用event.stopPropagation()来停止冒泡。
$(document).click(function(event) {
alert('a');
event.stopImmediatePropagation();
return false;
});
$(document).click(function() {
alert('b');
});
答案 1 :(得分: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);
}
});
});
答案 2 :(得分: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'); });
}
}
})
答案 3 :(得分:1)
使用unbind帮助吗?
$(document).click(function() {
alert('a');
$(this).unbind('click');
return false;
});
答案 4 :(得分:0)
如果说诺夫说不起作用,你可以使用一个小型的状态机:
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;
});
不是最漂亮的解决方案,但它会起作用。
答案 5 :(得分:0)
另一种解决方案是去抖动或限制该功能。
这样,您可以确保尽管多次触发,但只能在设定的持续时间内执行。这将使您的代码保持原样。