我试图逐个检查列表项,并且它们之间有1秒的延迟。有四个列表,我可以使用以下方法在加载的同时检查所有项目:
$( document ).ready( function(){
$('#featured').children('li').each(function() {
$(this.tagName + '> ul').children('li').each(function() {
$(this.tagName + '> i').attr('class', 'fa fa-check-square-o fa-lg');
});
});
});
但是,当我尝试包含setTimeout
时,没有任何事情发生。
$( document ).ready( function(){
$('#featured').children('li').each(function() {
$(this.tagName + '> ul').children('li').each(function() {
setTimeout(function()
{
$(this.tagName + '> i').attr('class', 'fa fa-check-square-o fa-lg');
}, 1000);
});
});
});
我怀疑this
变量不在setTimeout
处理程序的范围内。
更新:
自从我发布问题后,我清理了一下我的代码。通过将this
更改为el
,我可以使代码正常工作,但是setTimeout函数只会延迟一次并同时更改所有列表项的类。
这是我的HTML(顶部列表中有更多项目,但我将其缩减为一个示例):
<ul id="featured">
<li><h3>Full Home Inspections</h3>
<ul class="fa-ul">
<li><i class="fa fa-square-o fa-lg"></i> Gutters & Downspouts</li>
<li><i class="fa fa-square-o fa-lg"></i> Eaves, Soffits & Fascia</li>
<li><i class="fa fa-square-o fa-lg"></i> Main Water Shut-off</li>
<li><i class="fa fa-square-o fa-lg"></i> Heating and AC</li>
</ul>
<a href='inspections.html'> And more</a>
</li>
</ul>
这是我的新剧本:
$( document ).ready( function(){
$('#featured > li > ul').children('li').each(function(i, el) {
setTimeout(function(){
$(el.tagName + '> i').attr('class', 'fa fa-check-square-o fa-lg');
}, (i * 1000));
});
});
我意识到这不再是范围问题,但我仍然需要帮助,所以我更新了问题。
答案 0 :(得分:1)
你是对的不是,如果你遇到这个问题,修复通常是将this
变量存储在另一个局部变量中,即使在嵌套函数中也是如此。但是,也许你正在寻找类似(JSFiddle)的东西:
$(document).ready(function () {
$('#featured').children('li').each(function () {
lagAddingClasses($("i", this));
});
function lagAddingClasses($to) {
var interval = setInterval(function() {
if($to.length == 0) {
clearInterval(interval);
return;
}
$to.eq(0).attr('class', 'fa fa-check-square-o fa-lg');
$to = $to.slice(1);
}, 1000);
}
});
没有看到你的标记,实际上你不清楚你想要实现什么,但你的选择器使用似乎很奇怪。
答案 1 :(得分:0)
为什么不:
$( document ).ready( function(){
setTimeout(function()
{
$('#featured').children('li').each(function() {
$(this.tagName + '> ul').children('li').each(function() {
$(this.tagName + '> i').attr('class', 'fa fa-check-square-o fa-lg');
});
});
}, 1000);
});
答案 2 :(得分:0)
是的,这是一个关于失去范围的问题:你可以做的是在变量中保存这个值的引用,然后在setTimeout中使用它。
$( document ).ready( function(){
$('#featured').children('li').each(function() {
$(this.tagName + '> ul').children('li').each(function() {
var that = this
setTimeout(function()
{
$(that.tagName + '> i').attr('class', 'fa fa-check-square-o fa-lg');
}, 1000);
});
});
});