2012-08-03 150 views
10

我添加单击事件处理程序elment等待click事件完成

$(".elem").click(function(){ 
     $.post("page.php".function(){ 
     //code1 
     }) 
}) 

,并引发点击事件

$(".elem").click(); 
//code2 

我如何确保代码1执行

+0

请定义“代码1执行”的含义。你的代码有一个ajax方法。那么你是说当ajax调用执行或者ajax执行并完成时呢? – Rahatur 2018-03-02 06:26:33

回答

12

(忽略之后码2执行WebWorkers)JavaScript运行在一个单独的线程上,所以你可以确定code2将总是在code1之后执行。

除非您的代码1做一些事情异步像Ajax调用或setTimeout(),在这种情况下,触发点击处理程序将完成,然后CODE2会执行,然后(最终)回调从Ajax调用(或setTimeout(),或什么)将运行。

编辑:为您更新的问题,码2总会代码1之前执行,因为我异步上面所说的Ajax回调将在稍后发生(即使Ajax响应速度非常快,也不会调用回调,直到目前的JS完成)。

“我如何确保代码1执行后码2,执行”

使用.click()没有params为一个快捷方式到.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/

+2

我不认为这是真的。它们不会同时执行,但我不相信DOM API会对事件处理程序的调用顺序提供任何保证。即使它们碰巧在一个浏览器的一个版本上以正确的顺序触发,但不能保证在其他情况下会发生什么。 – 2012-08-03 06:17:56

+0

是的,我有一个AJAX调用它[编辑] – 2012-08-03 06:21:26

+0

人们,OP的问题只有一个事件处理程序。 code2只是触发它。 – JJJ 2012-08-03 06:24:14

2

你可以尝试写这样:

$(".elem").live("click", function(){ 
    //code1 
}) 

而且,正如你的射击触发都会被执行。

2

code2的方法,并将其添加为内部code1所以它总是会得到code1后调用的回调执行

code2 = function(){/*code2*/}; 
$(".elem").click(function(){ 
    //code1 
    code2(); 
}) 
+0

这不是一个解决方案,我想执行一些其他地方没有code2点击事件 – 2012-08-03 06:29:21

+1

你从来没有提到它应该是可重用的。以上看起来像是一个很好的解决方案。 – 2012-08-03 06:32:46

+0

你从来没有说过任何关于那个所以我假设。我可能会因为不清楚而低估这个问题,但因为你是新人,所以我不打算这么做。 @JonasGeiregat:谢谢。 – Gautam 2012-08-03 06:38:46

-1

使用JavaScript一行行。所以不管出现什么,都会先执行。因此,在其他方法之前添加点击代码将起作用。

此外,如果有任何异步调用,然后采取只有当你得到响应设置的标志。

var clicked = false; $('#elem')。点击(功能(){做一些异步处理 clicked = true; });

而(!点击){//什么都不做}

//其他功能,如果使用POST方法,在物业异步=真正的设置被称为

或第二选择将是。

+2

while(!clicked){}将使浏览器无法响应.. – 2012-08-03 07:42:50

+0

和我认为第二个选项做同样的事情,直到发布请求完成 – 2012-08-03 07:43:19