2012-08-03 177 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