在每个 .each 之间插入一个延迟
Insert a delay between every .each
我发现了一些与此相关的其他问题,但这些答案对我不起作用,所以我正在检查是否有更新的内容或有用的内容。本质上,我正在更新 jQuery 中的 .each 中的 div,但我希望它们每隔几秒更新一次。这是我尝试过的:
function randomColor() {
$('div').each(function(i) {
setTimeout(function() {
var colors = ['blue', 'green'];
var n = Math.floor(Math.random() * colors.length);
var color = colors[n];
$(this).addClass(color);
}, 500 + (i * 500));
});
}
我也尝试过使用单独的函数:
function randomColor() {
$('div').each(function(i) {
var time = 500;
setTimeout(function() {
applyColor($(this));
}, time);
time += 500;
});
}
function applyColor(div) {
var colors = ['blue', 'green'];
var n = Math.floor(Math.random() * colors.length);
var color = colors[n];
$(div).addClass(color);
}
这两个 return 都没有错误,但是 div 没有得到更新。如果我 运行 这段代码没有设置超时,它就可以完美运行。我也尝试过以这种方式使用延迟:
$('div').delay(1000).each(function() {
...
});
然后延迟了 1 秒,但在那一秒后立即更新了所有内容。如果我将延迟向下移动到 addClass 行附近,它会再次完全停止工作。谁能指出这个(希望是简单的)错误?
您正在创建一个匿名函数,并且在该函数内部 this
具有不同的含义(即 window 对象)。
一种解决方案是缓存 this
:
var $this = $(this);
setTimeout(function() {
var colors = ['blue', 'green'];
var n = Math.floor(Math.random() * colors.length);
var color = colors[n];
$this.addClass(color);
}, 500 + (i * 500));
我想你想做的是:
function randomColor() {
var colors = ['blue', 'green'];
var n = Math.floor(Math.random() * colors.length);
var color = colors[n];
$('div').each(function() {
$(this).delay(1000).addClass(color);
});
});
当 function 为 运行 时,它会随机选择一个 Class 名称('blue' 或 'green')。然后它将在等待 1 秒后更新 DIV。然后移动到每个循环中的下一个。
下面是一个使用 setTimeout
和增量器循环遍历 div
的示例,而不是 jQuery each
方法。
(function randomColorDiv(ii) {
var colors = ['blue', 'green']
var n = Math.floor(Math.random() * colors.length)
var color = colors[n]
$($('div')[ii]).addClass(color)
if ( ii < $('div').length ) {
setTimeout(function() {
randomColorDiv(++ii)
}, 1000)
}
}(0))
我发现了一些与此相关的其他问题,但这些答案对我不起作用,所以我正在检查是否有更新的内容或有用的内容。本质上,我正在更新 jQuery 中的 .each 中的 div,但我希望它们每隔几秒更新一次。这是我尝试过的:
function randomColor() {
$('div').each(function(i) {
setTimeout(function() {
var colors = ['blue', 'green'];
var n = Math.floor(Math.random() * colors.length);
var color = colors[n];
$(this).addClass(color);
}, 500 + (i * 500));
});
}
我也尝试过使用单独的函数:
function randomColor() {
$('div').each(function(i) {
var time = 500;
setTimeout(function() {
applyColor($(this));
}, time);
time += 500;
});
}
function applyColor(div) {
var colors = ['blue', 'green'];
var n = Math.floor(Math.random() * colors.length);
var color = colors[n];
$(div).addClass(color);
}
这两个 return 都没有错误,但是 div 没有得到更新。如果我 运行 这段代码没有设置超时,它就可以完美运行。我也尝试过以这种方式使用延迟:
$('div').delay(1000).each(function() {
...
});
然后延迟了 1 秒,但在那一秒后立即更新了所有内容。如果我将延迟向下移动到 addClass 行附近,它会再次完全停止工作。谁能指出这个(希望是简单的)错误?
您正在创建一个匿名函数,并且在该函数内部 this
具有不同的含义(即 window 对象)。
一种解决方案是缓存 this
:
var $this = $(this);
setTimeout(function() {
var colors = ['blue', 'green'];
var n = Math.floor(Math.random() * colors.length);
var color = colors[n];
$this.addClass(color);
}, 500 + (i * 500));
我想你想做的是:
function randomColor() {
var colors = ['blue', 'green'];
var n = Math.floor(Math.random() * colors.length);
var color = colors[n];
$('div').each(function() {
$(this).delay(1000).addClass(color);
});
});
当 function 为 运行 时,它会随机选择一个 Class 名称('blue' 或 'green')。然后它将在等待 1 秒后更新 DIV。然后移动到每个循环中的下一个。
下面是一个使用 setTimeout
和增量器循环遍历 div
的示例,而不是 jQuery each
方法。
(function randomColorDiv(ii) {
var colors = ['blue', 'green']
var n = Math.floor(Math.random() * colors.length)
var color = colors[n]
$($('div')[ii]).addClass(color)
if ( ii < $('div').length ) {
setTimeout(function() {
randomColorDiv(++ii)
}, 1000)
}
}(0))