在循环中调用setTimeout函数不起作用

时间:2014-03-11 07:29:27

标签: jquery

我需要在一段时间内将一个类添加到span元素中。

jQuery('.rating').each(function(){
    var datarating = $(this).attr("rating");
    for(var i=0; i<datarating; i++){
        (function (i) {
         setTimeout(function () {                
            rating(this, i);
         }, 1000, i);
        })(i);
    }
}); 

function rating(obj, i){    
    $(obj).find('span').eq(i).addClass('rated');
}   

HTML:

<div class="rating" rating="2">
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>   
</div>
<div class="rating" rating="3">
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>   
</div>

我做错了什么。我无法在循环中调用setTimeout函数在脚本结尾处,结果必须是。

<div class="rating" rating="2">
    <span class="rated"></span>
    <span class="rated"></span>
    <span></span>
    <span></span>
    <span></span>   
</div>
<div class="rating" rating="3">
    <span class="rated"></span>
    <span class="rated"></span>
    <span class="rated"></span>
    <span></span>
    <span></span>   
</div> 

3 个答案:

答案 0 :(得分:0)

问题是,this在setTimeout的范围内不存在。你应该存储全局引用,然后在里面使用它。试试这个:

 Variables.obj = this;
 Variables.ResizeTimer = setTimeout(
     function(){
        rating(Variables.obj, i);
     },
     1000
 );

答案 1 :(得分:0)

我猜想“这个”与窗口绑定是你的问题。

在这种情况下你最好使用旧的那个=这个技巧来引用正确的这个并用它来调用评级函数。

从你的例子中不清楚为什么你需要超时?

答案 2 :(得分:0)

试试这个

jQuery('.rating').each(function(){
    var rating = this;
    var datarating = $(this).attr("rating");
    var i = 0;
    var interval = setInterval(function () {
       if ( i <  datarating ) {            
           rating(rating, i);
           i++;
       } else {
           clearInterval(interval);
       }
    }, 1000, i);
});