我生成多个图表,每一个都有自己的setInterval刷新数据。 我有它设置给clearInterval时动态生成的容器被删除 - 但如果我重新加载,它有老的setInterval继续运行相同的ID。 有没有一种方法来设置一个动态命名的setInterval生成置换时,可以停止?
现在,我使用:
function generateChart(data, location){
var chart = new Highcharts.Chart({
// blah blah blah
}, function(chart){
setInterval(function(){
if($('#'+location).length){
// I'm doing stuff every minute
}else{
clearInterval();
}
},60000);
});
}
所发生的是,该位置是随机生成的字符串成为用于对Highchart容器中的元素ID并且如果它们用户保存图表变得唯一标识符。 如果用户更新中保存的和重新加载图表的图表,旧的被.removed(),并在其位置产生新的。 现在,新的人有相同的元素ID为旧之一,自旧区间找到容器,它希望它会尝试继续更新 - 这是不能因为它的图表就噗。
有没有一种方法来设置一个动态变量,我可以使用的setInterval,这样我可以在它clearInterval?
var blob+location = setInterval(function(){ ...
接着
clearInterval(blob+location);
你可以只使用一个对象:
var myObj = {};
var location = "somevalue";
myObj[location] = setInterval(...
clearInterval(myObj[location]);
行 - 因为我似乎无法环绕一些你的答案我的头,我决定走技术含量低。
function genToken(){
var num = Math.floor(Math.random() * 10000);
var token = 't-' + num;
return token;
}
function genLocation(){
var chartToken = genToken();
var newChart = '<div id="'+location+'" data-token="'+chartToken+'"></div>';
$('#chartHome').append(newChart);
}
// inside my chart function
var token = $('#'+location).data('token');
setInterval(function(){
if( $('[data-token="'+token+'"]').length ){
// still there - keep going
}else{
// all gone - time to stop
clearInterval();
}
},60000);
现在,当我做:
$('#'+location).remove();
令牌也消失,不会是相同的,如果我生成相同的位置ID的新图。
停止使用setInterval的,使用的setTimeout,而不是( 我如何执行一段代码,不超过每X分钟? ):
function generateChart(data, location) {
var element = $('#'+location);
var chart = new Highcharts.Chart({
// blah blah blah
}, foo);
var foo = function() {
if(element){
// I'm doing stuff every minute
setTimeout(foo, 6000);
}
};
}
要停止它,只是避免的setTimeout或使element = null
。
也许我的代码是有点不对(我越来越觉现在),但事情是使用setTimeout和关闭。
如果里面FOO,渴望的东西6秒以上,你会在烦恼,因为setTimeinterval将再次调用它,请观看http://www.youtube.com/watch?feature=player_detailpage&v=i_qE1iAmjFg#t=462s ,因此,这种方式你保证,这将最后完成的东西后运行6秒。
我会在这里让这个例子给后人:
http://jsfiddle.net/coma/vECyv/2/
var closure = function(id) {
var n = 0;
var go = true;
$('#' + id).one('click', function(event) {
go = false;
});
var foo = function() {
if(go) {
console.log(id, n++);
setTimeout(foo, 1000);
}
};
foo();
};
closure('a');
closure('b');