2013-05-08 118 views
0

一個基本的認識問題:HTML/Javascript:多個onClick函數觸發順序/延遲?

具有的onClick作用的元素 - 多個JavaScript調用正在取得:

onclick="function1();function2();function3()" 

然而,隨着功能3取決於期函數的動作,我需要確保功能3直到function1全部完成。而這似乎並不是事物的自然順序,實際上似乎所有3種功能在同一時間或多或少地發射(至少不等待彼此完成)。無論如何,我能做到這一點?

編輯:不能從相同functinon調用做到這一切,它是某些更新div的(大部分)Ajax調用...

進一步編輯:好了,可以看到,也許需要進一步澄清(認爲有一個簡單的,合乎邏輯的方式來處理它,可以這麼說...)

函數調用正在觸發ajax動作,該動作通過PHP更新頁面(div的內容)。如果我應該使用返回值,那麼我應該修改我的中心ajax js函數,以便在完成時返回某些內容,並且只有在設置了該值時才觸發下一個函數。任何人都有一個很好的片段來做到這一點onClick事件..? :-)

或...作爲一個黑客的東西 - 我應該堅持在function3前1秒的延遲? :-)我將如何去直接在onClick事件中? :-)

+0

爲什麼你不把所有的功能集中在一個? – 2013-05-08 06:35:09

+1

使用該代碼,將依次調用每個函數。在前一個完成之前,不會調用任何函數。函數稍後可能會做某些事情(例如,如果它調用'setTimeout'或設置事件處理程序,但沒有通用方法來捕獲它。你必須編寫一個回調函數,讓它稍後運行代碼)。 – Quentin 2013-05-08 06:39:57

+0

也許我應該指定(感謝所有已經回答的人) - function1對db進行了一些更新並更新了一個div(ajax)... function3(所有這些只是seudo的例子)更新了另一個div,這取決於函數1的db動作。在現場示例中,我可以看到function3更新了div BEFORE function1已更新... – 2013-05-08 07:09:50

回答

-1

如果你不想改變的onclick的定義,那麼你可以做這樣的:

onclick="function1();function2();function3();" 

腳本:

function1Complete = false; 

function1(){ 
// some stuff 
function1Complete = true; 
} 

function3(){ 
    if (function1Complete){ 
    // Put your code here 
    }else{ 
    setTimeout(function3, 1000); 
    } 
} 

這不是最好的和乾淨的解決方案。但如果您沒有任何其他解決方案,這將對您有所幫助。

+0

好吧,難道不能確保函數3的內容永遠不會運行,或多或少...? :-)) – 2013-05-08 09:14:54

+0

@BrianLanghoff只要函數1完成並正確設置標誌,它確保功能3不能運行,除非功能1完成,這似乎是你的行爲。 – Racheet 2013-05-08 10:31:35

+0

啊超時...正確:-)可能會給它一個去,謝謝:-) – 2013-05-08 13:42:15

0

,而不是調用有所有功能直接的onClick你應該嘗試從另一個

像這樣調用一個函數:

onClick="function1()" 

,然後從funtion1()調用funtion2()

function function1() 
{ 
//your code here 

funtion2(); 

} 

等等....

+0

只要在前一個函數結束時插入函數調用就沒有任何區別。如果'function1'調用'setTimeout'(例如),然後在''setTimeout''調用的函數末尾調用'function2',但我們不知道是否正在使用'setTimeout'或者如果別的什麼東西正在使用,或者如果OP只是曲解他正在得到的結果。 – Quentin 2013-05-08 06:42:06

+0

對於我的解決方案,我就像DUH我需要function2在function1之後運行..但是然後我就像哦..我還有一些其他的調用function1 *不運行function2 ..所以問題是,具體的onClick可能只有一個需要那些特定功能運行的地方。 – Christine268 2015-06-19 14:03:22

+0

但是,我只是通過onclick發送了一個額外的參數,我*想要運行function2。如果這個參數是'true'(有值),那麼運行function2,否則function1結束。這爲我做了詭計! Zim84回答中的回調看起來太亂了,我不喜歡'超時'的想法。 – Christine268 2015-06-19 14:14:01

1

您可以callba工作中正:

function function1(callback) { 
    // do your stuff 
    if (callback) { callback(); } // calls your next function 
} 
function function2(callback) { 
    // do your stuff 
    if (callback) { callback(); } // calls your next function 
} 
function function3() { 
    // function 3 stuff 
} 

,如果你依賴於一個setTimeout完成,只需您的通話添加到回調在setTimeout一部分。

,並調用它像這樣:

<a onclick="function1(function() { function2(function() { function3() }) });">call functions</a> 
+0

這將調用函數3,然後調用函數2,然後調用返回的任何函數3,然後調用函數1,然後調用返回的任何函數2。 – Quentin 2013-05-08 06:50:08

+0

如果執行得當,回調可能是問題解決方案的一部分。但目前在問題中沒有足夠的代碼來說明問題是什麼。 – Quentin 2013-05-08 06:50:44

+0

顯然是醜陋的,而且對於問題是什麼而言頗具推測性。 – Quentin 2013-05-08 06:53:11