2013-06-25 38 views
1

如果我有两个处理程序连接到同一事件,是否有办法确保其中一个处理程序总是先于另一个处理程序完成。确保两个处理程序按特定顺序完成

仅用于本示例,我使用超时模拟长操作。但我可以有这样的事情:

var change_label = function() { 

    var option = $(".selected_option a").text(); 
    $("li:first span").text(option); 

};  


$("#container").on("click", "li", function() { 
    var self = $(this); 
    var t = setTimeout(function() { 
     $(".sel").children("li").removeClass("selected_option"); 

     self.addClass("selected_option"); 

    }, 1000); 

}); 



$("#container").on("click", "li", function() { 

    change_label(); 

}); 

,并确保这些文字不会改变(第二处理),直到类被首先应用?

http://jsbin.com/ayihiv/1/edit

+0

执行订单的最佳方式是编写代码以保证它。在你的情况下,这意味着只需要添加一个处理程序,并让该处理程序在适当的时候调用'change_label()'。但有些事情告诉我,你要告诉我,这并不能完全代表实际问题。 –

+0

@CrazyTrain是啊......我完全同意。但是像[this](http://jsbin.com/ayihiv/2/edit)这样的东西是有效的,所以这可能是我做了什么,直到我有时间重写。你还有其他更微妙的想法吗?非常感谢。 – 1252748

+1

是的,你可以使用这种轮询,但它应该是最后的手段。如果你基本上想在第一个处理程序工作的时候禁用第二个处理程序,那么你可以改变你的事件代理基于一个类。第一个基于一个总是存在的类,但第二个基于一个类,当第一个类开始时被删除,当第一个结束时替换它。 –

回答

1

这里是你可能会发现有趣的方法。

jQuery的Callbacks实用程序允许你做一些“松耦合”。换句话说,你可以让setTimeout函数激发一个动作或一组动作,而不知道这些动作是什么;它们可以在代码的其他地方指定,唯一的要求是相同的Callbacks队列在两个代码块的范围内。

这实际上是一个“pub/sub”模式,虽然我们在这里使用它来做一些事情,而不是发布和订阅。

var cb = $.Callbacks('unique'); 

$("#container").on("click", "li", function() { 
    var self = $(this); 
    var t = setTimeout(function() { 
     $(".sel").children("li").removeClass("selected_option"); 
     self.addClass("selected_option"); 
     cb.fire(self.find("a").text());//<<<<<< stimulate any functions currently in the callbacks list cb, and pass the required text to them. 
    }, 1000); 
}); 

var change_label = function(txt) { 
    $("li:first span").text(txt); 
}; 
var log_it = function(txt) { 
    console.log('Text changed to: ' + txt); 
}; 
var alert_it = function(txt) { 
    alert('Text changed to: ' + txt); 
}; 

cb.add(change_label); 
//cb.add(log_it); 
//cb.add(alert_it); 

DEMO。尝试取消注释最后两行,您会看到当1秒延迟结束时会发生其他事情。