2013-10-02 79 views
0

下面的代碼在單擊開始按鈕時按順序從1到10附加數字。我想用clearTimeout來取消點擊停止按鈕時的操作。javascript在循環中清除超時

在我看來,必須創建一個動態變量(其中x目前分配的doSetTimeout函數),但我還沒有找到一種方法來這樣做。有什麼建議麼?

謝謝!

<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 

<script> 
function doSetTimeout(func, func_param, time) { 
    setTimeout(function(){func(func_param);}, time); 
} 

function createNode(base) { 
    var node = document.createElement("p"); 
    var writeI = base + ""; 
    var textnode = document.createTextNode(writeI); 
    node.appendChild(textnode); 
    document.body.appendChild(node); 
} 

$(document).ready(function() { 
     $("#start").click(function() { 
      for (var i = 1; i <= 10; i++) { 
       var time = i*1000; 
       var x = doSetTimeout(createNode, i, time); 
      }   
     }); 
});   
</script> 
</head> 
<body> 
    <button id="start">Start</button> 
    <button id="stop">Stop</button> 
</body> 
+0

var id = window.setTimeout(function(){},0); (id--){ window.clearTimeout(id); //如果沒有發生超時,將不會執行任何操作。 } –

回答

2

獲取的setTimeout返回值,將其存放在列表中,並清除它,當你點擊停止

function doSetTimeout(func, func_param, time) { 
    return setTimeout(function(){func(func_param);}, time); 
} 

$(document).ready(function() { 
    var timeouts = []; 
    $("#start").click(function() { 
     for (var i = 1; i <= 10; i++) { 
      var time = i*1000; 
      timeouts.push(doSetTimeout(createNode, i, time)); 
     }  
    }); 
    $("#stop").click(function() { 
     for (var i = 0; i <= timeouts.length; i += 1) { 
      clearTimeout(timeouts[i]); 
     } 
    }); 
}); 

這也可能明確的暫停,已經完成了,但我懷疑這真的很重要。

+0

謝謝 - 但是,像這樣運行,此代碼不起作用。 –

+0

它爲什麼不起作用? – Halcyon

+0

當您點擊停止按鈕時,沒有任何反應。它貫穿整個序列。 –