2013-09-29 48 views
0
var TimeOut; //Global 
$('[name^="HMapDot"]').each(function(i){ 
    TimeOut = setTimeout(function(){ 
     $('[name^="HMapDot"]').css({'visibility':'hidden'}); 
     $('#HMapTime').html($('[name="HMapDot'+i+'"]').attr('role')+' [ '+(i+1)+' ]'); 
     $('[name="HMapDot'+i+'"]').css({'visibility':'visible'}); 
    },i * iTime); 
    if(i == (iMany-1) || $('[name^="HMapDot"]').length == 0){ clearTimeout(TimeOut); return false; } 
}); 

我有这段代码工作得很好,使用JQuery 2.x和AJAX来拉取数据。我的意图是延迟“地图”上的点每秒出现/消失(滑块值)。现在当我点击“停止”时,页面,值,元素将被$ .remove,但计时器将继续被倒计数。如何停止计时器和$ .each?低于

修改代码的工作:

var TimeOuts = []; //Global 
var T; 
function ClearTimeOuts(){ 
    for(var i in TimeOuts){ 
     clearTimeout(TimeOuts[i]); 
    } 
} 
$('[name^="HMapDot"]').each(function(i){ 
    T = setTimeout(function(){ 
     $('[name^="HMapDot"]').css({'visibility':'hidden'}); 
     $('#HMapTime').html($('[name="HMapDot'+i+'"]').attr('role')+' [ '+(i+1)+' ]'); 
     $('[name="HMapDot'+i+'"]').css({'visibility':'visible'}); 
     if(i == (iMany-1) || $('[name^="HMapDot"]').length == 0){ 
      ClearTimeOuts(); 
      return false; 
     } 
    },i * iTime); 
    TimeOuts.push(T); 
}); 

回答

2

您所呼叫的setTimeout内的each - 你需要一个数组来存储和停止超时处理:

var TimeOuts = []; //Global 
function ClearTimeOuts(){ 
    for(var i in TimeOuts){ 
     clearTimeout(TimeOuts[i]); 
    } 
} 
$('[name^="HMapDot"]').each(function(i){ 
    var T = setTimeout(function(){ 
     $('[name^="HMapDot"]').css({'visibility':'hidden'}); 
     $('#HMapTime').html($('[name="HMapDot'+i+'"]').attr('role')+' [ '+(i+1)+' ]'); 
     $('[name="HMapDot'+i+'"]').css({'visibility':'visible'}); 
    },i * iTime); 
    if(i == (iMany-1) || $('[name^="HMapDot"]').length == 0){ 
     ClearTimeOuts(); 
     return false; 
    } 
    TimeOuts.push(T); 
}); 
+0

这一个sorta工程,但是当我使用这个代码,它不会显示任何东西,直到点的结束。仍然在修补。 – sgkdnay

+0

好的,发现这个问题。因为if(i ==(iMany-1)|| $('[name^=“HMapDot”]')。length == 0){ClearTimeOuts();返回false; }在定时器之外,setTimeout不知道它何时结束,所以我将该行移到了setTimeout的内部,当我按下停止按钮时,它优雅地退出。非常感谢您带领我走向正确的方向!请参阅上面有关修改过的代码! – sgkdnay

0

你所有的点共享相同的变量保持定时器的轨道,所以每一个将覆盖前面。每个点需要一个变量。

声明函数内部的变量,这将创造一个局部变量每个点:

$('[name^="HMapDot"]').each(function(i){ 
    var TimeOut; 
    TimeOut = setTimeout(function(){ 
     $('[name^="HMapDot"]').css({'visibility':'hidden'}); 
     $('#HMapTime').html($('[name="HMapDot'+i+'"]').attr('role')+' [ '+(i+1)+' ]'); 
     $('[name="HMapDot'+i+'"]').css({'visibility':'visible'}); 
    },i * iTime); 
    if(i == (iMany-1) || $('[name^="HMapDot"]').length == 0){ clearTimeout(TimeOut); return false; } 
});