2013-10-02 42 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

当您点击停止按钮时,没有任何反应。它贯穿整个序列。 –