Javascript Can';我睡不着
我想暂停Javascript Can';我睡不着,javascript,loops,delay,sleep,Javascript,Loops,Delay,Sleep,我想暂停1秒对于每次循环,在其他情况下进行类似暂停通常很容易,但在处理循环时,似乎会变得更难: for (var i=0 ; i < 10 ; i++) { document.write (i + "<br>"); // I want to wait 1 second here } for(变量i=0;i
1秒
对于每次循环,在其他情况下进行类似暂停通常很容易,但在处理循环时,似乎会变得更难:
for (var i=0 ; i < 10 ; i++) {
document.write (i + "<br>");
// I want to wait 1 second here
}
for(变量i=0;i<10;i++){
document.write(i+“
”);
//我想在这里等一秒钟
}
这是我数千次失败尝试的一个例子:
function writeMsg (index) {
document.write (index + "<br>");
}
for (var i=0 ; i < 10 ; i++) {
setTimeout (writeMsg(i), 1000);
}
函数writeMsg(索引){
document.write(索引+“
”);
}
对于(变量i=0;i<10;i++){
设置超时(writeMsg(i),1000);
}
您知道如何使其工作吗?您将函数调用的返回值传递给
setTimeout
,而不是函数。请尝试以下代码:
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() {
writeMsg(i);
}, 1000*i);
})(i);
}
for(变量i=0;i<10;i++){
(职能(一){
setTimeout(函数(){
书面SG(i);
},1000*i);
})(i) );
}
如果您想知道为什么调用被包装在匿名函数中:如果没有该函数,每个setTimeout回调将接收相同的
i
,因此当回调启动时,它将始终是10
。匿名函数在内部创建一个新的i
,该函数未连接到循环变量。经典的循环函数问题。一个典型的解决方案:
function createCallback(i) {
return function () {
writeMsg(i);
};
}
function writeMsg (index) {
document.write (index + "<br>");
}
for (var i=0 ; i < 10 ; i++) {
setTimeout (createCallback(i), 1000*i);
}
函数createCallback(i){
返回函数(){
书面SG(i);
};
}
函数writeMsg(索引){
document.write(索引+“
”);
}
对于(变量i=0;i<10;i++){
设置超时(createCallback(i),1000*i);
}
这10个超时都基于调用setTimeout()的时间。因此,它们都是同时触发的
for (var i=0; i < 10; i++) {
(function(idx){
setTimeout(function(){
document.write(idx+"<br/>");
},1000*idx);
})(i);
};
for(变量i=0;i<10;i++){
(功能(idx){
setTimeout(函数(){
文件。写入(idx+“
”);
},1000*idx);
})(i) );
};
此函数的工作原理更像普通的for循环,而它不是
您需要考虑到for在分号之间有3个参数
i<10
)i++
addone to i)(函数(){
//定义一个变量
var i=0,
动作=函数(){
//重新运行的条件
如果(i<10){
文件。写(i+“
”);
//给我加一个
i++;
设置超时(操作,1000);
}
};
设置超时(操作,1000);
})();
下面是此代码的JSFIDLE,演示其工作原理:
试试这个,它肯定会帮助所有人思考如何让它在For循环中工作等待属性。。。 请在此URL中尝试此代码
var-var2;
var-tmp;
var-evt;
var i=0;
var res=document.getElementsByClassName('mar-plp-filter-content-nav-stacked')[0].children.length;
tmp=document.getElementsByClassName('mar-plp-filter-content-nav-stacked')[0]。子项;
函数myfunc()
{
如果(它们同时打印)(铬)是的,我忘记了1000*i
而不是1000
。你可能复制了初始版本。它每次都打印10
。但是我可以通过一些修改让它工作。现在试试。这两个功能混在一起只会启动x个超时量,而这对小数字有效。如果你尝试启动太晚,那将是地狱ny。这也忽略了通过将i设置为大于10来中途中断for循环的可能性。在我看来,这是一种非常可怕的方式。哦,把parens搞砸了。这就是为什么我喜欢单独的回调生成器——更容易编写,更容易阅读。糟糕的做法是,启动多个超时并中断正常的for func因为你不能改变i来影响代码的其他潜在循环。@sg3s请原谅?你的评论不清楚。我不能说我听说过调度O(10)
超时会导致问题。这是一种不好的做法。OP不只是想向文档中写入消息,而且显然会一次又一次地执行多个或相同的操作。这样做不会让你在开始所有超时后进行干预,因为这是开始,而他可能会在循环5中决定这已经足够了,由于w/e原因,然后将i设置为10…他要求一个for循环,每个循环都会延迟。无法使用不同的变量启动函数x y多次,也无法停止它们将执行的操作。和的可能重复大约10万次。实际上,他的主要问题是调用writeMsg(i)
立即将函数传递给setTimeout…@MΓΓΓБLL令人惊讶的是,虽然不是很多人都能得到正确的答案:s…这样做不好,您启动多个超时并打破功能正常,因为您无法通过其他方式更改i来影响代码的其他潜在循环。我的代码可以简化为wr我猜,如果在新的setTimeout而不是整个函数中使用if,那么。
(function() {
// Define a variable
var i = 0,
action = function() {
// Condition to run again
if (i < 10) {
document.write(i + "<br>");
// Add one to i
i++;
setTimeout(action, 1000);
}
};
setTimeout(action, 1000);
})();
var var2;
var tmp;
var evt;
var i=0;
var res = document.getElementsByClassName('mar-plp-filter-content nav nav--stacked')[0].children.length;
tmp = document.getElementsByClassName('mar-plp-filter-content nav nav--stacked')[0].children;
function myfunc()
{
if(i<res)
{
var2 = tmp[i].getElementsByTagName("span")[0].getElementsByClassName("inverted")[0];
// alert(var2.innerHTML);
var evObj = document.createEvent('MouseEvents');
evObj.initEvent( 'mouseover', true, false );
var2.dispatchEvent(evObj);
var2.style.backgroundColor="GREEN";
i++;
setTimeout(myfunc,3000);
}
};
setTimeout(myfunc,3000);