我向元素添加了一个单击事件处理程序
$(".elem").click(function(){
$.post("page.php".function(){
//code1
})
})然后我触发了一个点击事件
$(".elem").click();
//code2如何确保在code1执行之后执行code2
发布于 2012-08-03 14:15:45
(忽略WebWorkers) JavaScript在单线程上运行,因此您可以确保code2将始终在code1之后执行。
除非您的code1执行一些异步操作,如Ajax调用或setTimeout(),在这种情况下,触发的单击处理程序将完成,然后code2将执行,然后(最终) Ajax调用(或setTimeout()等)的回调将运行。
编辑:对于您更新的问题,code2将始终在code1之前执行,因为正如我在上面所说的,异步Ajax回调将在稍后发生(即使Ajax响应非常快,在当前JS完成之前它也不会调用回调)。
“如何确保code2在code1执行后执行”
使用不带参数的.click()是.trigger("click")的快捷方式,但如果您实际显式调用.trigger(),则可以提供额外的参数,这些参数将被传递给处理程序,这使您可以执行以下操作:
$(".elem").click(function(e, callback) {
$.post("page.php".function(){
//code1
if (typeof callback === "function")
callback();
});
});
$(".elem").trigger("click", function() {
// code 2 here
});也就是说,在单击处理程序中,测试是否在callback参数中传递了函数,如果是,则调用该函数。这意味着当事件“自然”发生时,将不会有回调,但当您以编程方式触发它并传递函数时,该函数将被执行。(请注意,使用.trigger()传递的参数不一定是函数,它可以是任何类型的数据,并且可以传递多个参数,但出于这个目的,我们需要一个函数。有关详细信息,请参阅.trigger() doco。)
演示:http://jsfiddle.net/nnnnnn/ZbRJ7/1/
发布于 2012-08-03 14:17:50
你可以试着这样写:
$(".elem").live("click", function(){
//code1
})
// for newer jquery version from 1.9
$(".elem").on("click", function(){
//code1
})而且,您的触发器将始终以已触发的方式执行。
发布于 2012-08-03 14:19:30
将code2包装在方法中,并将其作为回调添加到code1中,以便始终在code1执行后调用它
code2 = function(){/*code2*/};
$(".elem").click(function(){
//code1
code2();
})https://stackoverflow.com/questions/11790241
复制相似问题