2012-05-07 107 views
0

我試圖暫停一個功能,直到另一個功能已完成其任務。有沒有類似於.ajaxComplete(),但完成一個功能?檢查功能是否已完成使用JavaScript/jQuery的任務

這段代碼應該先打印出「測試」,然後放慢速度(如果你願意,減速)。隨着循環中的數字變得更高,setTimeout變長,因此,隨着循環的繼續,它會打印「較慢」。基本上,我需要循環暫停,直到功能打印。

編輯 - 我更新了我的代碼。 「測試」只打印一次,沒有其他事情發生。

<html> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
</head> 
<body> 

<input type="button" value="Display alert box" onclick="docWrite()" /> 
<script> 

var b = 0; 

function docWrite() { 
    document.write("test"); 
    timeMsg(); 
} 

function timeMsg() { 
    b += 250; 
    if (b < 5000) { //check the limit 
    setTimeout("docWrite()", b - 250); //substract 250 (because we already added 250 before the first print 
    } 
} 
</script> 
</body> 
</html> 
+0

您應該避免使用全局變量。它使你的代碼更難理解。 –

+1

'//暫停循環直到docWrite完成'是不可能的。除了極少數例外,你不能在JS中阻塞調用。您需要使用回調函數來設置異步操作完成後需要運行的內容。 –

+1

'//暫停循環直到docWrite完成---這會凍結瀏覽器並且不可接受 – zerkms

回答

3

我認爲這將是更好地讓超時功能開始一個新的超時功能 這將解決您的問題,並得到循環完全擺脫。只需調用timeMsg()即可啓動該示例。

<script> 

var b = 0; 

function docWrite() { 
    $('body').append("test"); 
    timeMsg(); 
} 

function timeMsg() { 
    b += 250; 
    if (b < 5000) { //check the limit 
     setTimeout(docWrite, b - 250); //substract 250 (because we already added 250 before the first print 
    } 
} 

</script> 

修改自己的腳本我結束了這一點:

<html> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
</head> 
<body> 

<input type="button" value="Display alert box" onclick="timeMsg()" /> 
<script> 

var b = 0; 

function docWrite() { 
    $("body").append("test"); 
    timeMsg(); 
} 

function timeMsg() { 
    b += 250; 
    if (b < 5000) { //check the limit 
    setTimeout(docWrite, b - 250); //substract 250 (because we already added 250 before the first print 
    } 
} 
</script> 
</body> 
</html> 
+0

看着這是有道理的,但我不能得到它的工作。我將使用整個html頁面 – user1104854

+0

更新我的代碼,setTimeout(「docWrite()」,b-250)應該用setTimeout(docWrite,b - 250)替換。你也忘了「var b = 0;」 :)。讓你的腳本在鉻版中處理這些修復。 – Woutifier

+0

我在firefox和IE中試過了,都沒有工作。只顯示一次「測試」。在setTimeout中,如果我將docWrite更改爲docWrite(),則所有20個「測試」將一次顯示。 – user1104854

0

你將不得不回調添加到docWrite()。通過傳遞一個函數來讓它運行一些東西(或者你想做的事情)。

function docWrite(callback) { 
    document.write('test'); 
    // something like 
    callback(); 
} 

,那麼你可以構建這樣的:

var b = 0; 
function timeMsg(){ 
    var t = setTimeout(function() { 
     docWrite(function() { 
      // what to do after this finishes 
      if (b > 5000) { return; } 
      b += 250; 
      timeMsg(); 
     }) 
    }, b); 
} 
0

下面的函數可以用來fullfill你的任務:

function repeat(action, initial, slowdown, count, callback) { 
    function next(time) { 
     window.setTimeout(function() { 
      if (count--) { 
      action(); 
      next(time+slowdown); 
      } 
      else 
      callback(); 
     }, time); 
    } 

    next(initial); 
} 

您可以使用它,如下所示:

repeat(docWrite, 0, 250, 5000/250, function() { 
    $("body").append("done"); 
}); 

function docWrite(){ 
    $("body").append("test"); 
}​ 

請不要e如果action回撥(docWrite)執行異步調用,例如您希望在啓動下一個定時器之前等待完成的動畫本身,則會變得稍微複雜一些。讓我知道如果是這樣的話。

http://jsfiddle.net/JKEpK/4/

+0

我不確定這是否適用於您,但它在運行時既不在jsfiddle中,也不在本地主機上運行。 – user1104854

+0

@ user1104854您正在使用哪種瀏覽器,您得到了哪些錯誤? –

+0

好的ff失敗了,因爲它不喜歡'document.write()'在延遲調用中!改用它:http://jsfiddle.net/JKEpK/5/ –