setInterval 函数在重新启动 setinterval 时将值递增两次
setInterval function increments values twice on restarting setinterval
有一个我正在尝试 运行 创建弹出窗口的代码。弹出窗口打开后,将初始化一个计数器,该计数器每秒递增一次并使用 setInterval。但是,当我取消进程(clearInterval 以及它)并重新打开弹出窗口时,计数器初始化但每秒递增两次。您可以在下面找到我的 jquery 脚本以供参考。请让我知道为什么我会观察到这种奇怪的行为。请原谅脏代码,如果我的 jquery 做法有误,请随时指出。我对前端开发相当陌生,因此这可能是一个微不足道的问题,但我似乎无法在网上找到任何原因。期待任何输入。
// Semicolon (;) to ensure closing of earlier scripting
// Encapsulation
// $ is assigned to jQuery
;
(function($) {
var counter2 = 0;
var counter3 = 60;
var counter4 = 60;
var interval2;
var timeNow;
var canFlag = 0;
// DOM Ready
$(function() {
var checker = '';
var popClicked = 0;
var timeout = 0;
// Binding a click event
// From jQuery v.1.7.0 use .on() instead of .bind()
$('#my-button').bind('click', function(e) {
checker = $('#log').text();
popClicked = 1;
if (checker==="somecondition") {
//alert(checker);
// Prevents the default action to be triggered.
e.preventDefault();
// Triggering bPopup when click event is fired
$('.element_to_pop_up').bPopup();
}
else {
alert('Oops.. error message');
}
});
$('#popNext').click(function() {
currTopic = randTopic();
$('#newTopic').html(currTopic);
$('#pg1pop').hide();
$('#pg2pop').show();
var counter = 10;
var counterFlag = 0;
$('#pg2Ref').click(function() {
currTopic = randTopic();
$('#newTopic').html(currTopic);
counter = 10;
});
$('.b-modal, .b-close').click(function() {
canProcess();
$('#pg2pop').hide();
$('#timeout').hide();
$('#pg1pop').show();
});
$('#pg2Cont').click(function() {
counter2 = 0;
counter3 = 60;
counter4 = 60;
counterFlag = 1;
$('#pg2pop').hide();
$('#pg3pop').show();
//alert("counter 1-4: "+counter+"-"+counter2+"-"+counter3+"-"+counter4+"-"+"cflag - "+counterFlag+"-"+"timeout flag"+timeout);
interval2 = setInterval(function() {
counter2++;
if (counter2 == 146) {
// Display a login box
timeNow = (new Date).getTime();
$('#pg3con').html('Well done!<br>Process is over. Please wait, we are processing your data. ');
clearInterval(interval2);
stopProcess(currTopic);
}
else if (counter2 == 1) {
$('#pg3con').html('Your topic is:<br>"' + currTopic + '"<br>& you have <span id="sec2" style="font-size:120%;">60</span> seconds to start!<br><br><button id="skip" style="width: auto; margin:auto">Skip</button>');
$('#skip').click(function() {
counter2 = 53;
});
}
else if (counter2 > 1 && counter2 <= 53) {
counter4--;
$('#sec2').html(counter4);
}
else if (counter2 == 54) {
$('#pg3con').html('Relax! ');
}
else if (counter2 == 58) {
$('#pg3con').html('Your time starts in 3..');
}
else if (counter2 == 59) {
$('#pg3con').html('Your time starts in 2..');
}
else if (counter2 == 60) {
$('#pg3con').html('Your time starts in 1..');
}
else if (counter2 == 61 && timeout == 0) {
$('#pg3con').html('<div class="w40" class="tCenter"><p>Your topic:<p><br><p>' + currTopic + '</p></div><div class="w60"><div>You have<br></div><div id="sec" style="font-size:600%;">60</div><div> Secs</div></div><br><br><button class="contentBox contentBoxOrange" id="continue" style="width: auto; margin:auto">Continue</button>');
$('#popupLog').show();
$('#continue').click(function() {
counter2 = 121;
});
startProcess();
}
else if (counter2 > 61 && counter2 <= 121) {
counter3--;
$('#sec').html(counter3);
}
else if (counter2 > 121 && counter2 < 146) {
$('#pg3con').html('Some text:<br>"Some text"<br><br><button id="finish" style="width: auto; margin:auto">Finish</button>');
$('#finish').click(function() {
counter2 = 145;
});
}
$('.b-modal, .b-close').click(function() {
canProcess();
canFlag =1;
clearInterval(interval2);
$('#pg3con').html('<img src="path/to/images/ajax-loader.gif">');
$('#pg3pop').hide();
$('#pg1pop').show();
});
}, 1000);
});
var interval = setInterval(function() {
if(counter > 0){
counter--;
}
$('#secs').html(counter + " seconds");
if (counter === 0 && counterFlag === 0) {
// Display a login box
timeout = 1;
counterFlag = 1;
clearInterval(interval);
$('#pg2pop').hide();
$('#popupLog').hide();
$('#timeout').show();
}
}, 1000);
});
});
})(jQuery);
可重现:总是;
可能的原因:缺少 knowledge/logical 错误
编辑:如果取消两次,则计数器递增 3,依此类推。
我没有复制或测试你的整个脚本(如评论中所述,我们不是来调试的),但我的建议是在你开始之前清除你的间隔,而不是之后。所以请尝试以下操作:
clearInterval(interval);
interval = setInterval(function() {
// do whatever here
}, time);
通过这种方式,您可以确保正在进行的任何间隔都不会再消失。
也许了解 setinterval 的作用是件好事。
所以每个例子:
var myInterval = setInterval(function() {
//some code here
}
变量 'myInterval' 的值不是您所期望的函数。
然而,该值是一个整数。
因此,通过在您的代码中再次设置间隔,该整数从(每个示例)1 变为 2。
如果您 运行 在再次 运行 之前没有清除间隔,您唯一要做的就是清除最新的间隔。第一个还没通关
还要小心 运行 间隔,在你知道之前你的脚本中已经有几个 运行ning。
有一个我正在尝试 运行 创建弹出窗口的代码。弹出窗口打开后,将初始化一个计数器,该计数器每秒递增一次并使用 setInterval。但是,当我取消进程(clearInterval 以及它)并重新打开弹出窗口时,计数器初始化但每秒递增两次。您可以在下面找到我的 jquery 脚本以供参考。请让我知道为什么我会观察到这种奇怪的行为。请原谅脏代码,如果我的 jquery 做法有误,请随时指出。我对前端开发相当陌生,因此这可能是一个微不足道的问题,但我似乎无法在网上找到任何原因。期待任何输入。
// Semicolon (;) to ensure closing of earlier scripting
// Encapsulation
// $ is assigned to jQuery
;
(function($) {
var counter2 = 0;
var counter3 = 60;
var counter4 = 60;
var interval2;
var timeNow;
var canFlag = 0;
// DOM Ready
$(function() {
var checker = '';
var popClicked = 0;
var timeout = 0;
// Binding a click event
// From jQuery v.1.7.0 use .on() instead of .bind()
$('#my-button').bind('click', function(e) {
checker = $('#log').text();
popClicked = 1;
if (checker==="somecondition") {
//alert(checker);
// Prevents the default action to be triggered.
e.preventDefault();
// Triggering bPopup when click event is fired
$('.element_to_pop_up').bPopup();
}
else {
alert('Oops.. error message');
}
});
$('#popNext').click(function() {
currTopic = randTopic();
$('#newTopic').html(currTopic);
$('#pg1pop').hide();
$('#pg2pop').show();
var counter = 10;
var counterFlag = 0;
$('#pg2Ref').click(function() {
currTopic = randTopic();
$('#newTopic').html(currTopic);
counter = 10;
});
$('.b-modal, .b-close').click(function() {
canProcess();
$('#pg2pop').hide();
$('#timeout').hide();
$('#pg1pop').show();
});
$('#pg2Cont').click(function() {
counter2 = 0;
counter3 = 60;
counter4 = 60;
counterFlag = 1;
$('#pg2pop').hide();
$('#pg3pop').show();
//alert("counter 1-4: "+counter+"-"+counter2+"-"+counter3+"-"+counter4+"-"+"cflag - "+counterFlag+"-"+"timeout flag"+timeout);
interval2 = setInterval(function() {
counter2++;
if (counter2 == 146) {
// Display a login box
timeNow = (new Date).getTime();
$('#pg3con').html('Well done!<br>Process is over. Please wait, we are processing your data. ');
clearInterval(interval2);
stopProcess(currTopic);
}
else if (counter2 == 1) {
$('#pg3con').html('Your topic is:<br>"' + currTopic + '"<br>& you have <span id="sec2" style="font-size:120%;">60</span> seconds to start!<br><br><button id="skip" style="width: auto; margin:auto">Skip</button>');
$('#skip').click(function() {
counter2 = 53;
});
}
else if (counter2 > 1 && counter2 <= 53) {
counter4--;
$('#sec2').html(counter4);
}
else if (counter2 == 54) {
$('#pg3con').html('Relax! ');
}
else if (counter2 == 58) {
$('#pg3con').html('Your time starts in 3..');
}
else if (counter2 == 59) {
$('#pg3con').html('Your time starts in 2..');
}
else if (counter2 == 60) {
$('#pg3con').html('Your time starts in 1..');
}
else if (counter2 == 61 && timeout == 0) {
$('#pg3con').html('<div class="w40" class="tCenter"><p>Your topic:<p><br><p>' + currTopic + '</p></div><div class="w60"><div>You have<br></div><div id="sec" style="font-size:600%;">60</div><div> Secs</div></div><br><br><button class="contentBox contentBoxOrange" id="continue" style="width: auto; margin:auto">Continue</button>');
$('#popupLog').show();
$('#continue').click(function() {
counter2 = 121;
});
startProcess();
}
else if (counter2 > 61 && counter2 <= 121) {
counter3--;
$('#sec').html(counter3);
}
else if (counter2 > 121 && counter2 < 146) {
$('#pg3con').html('Some text:<br>"Some text"<br><br><button id="finish" style="width: auto; margin:auto">Finish</button>');
$('#finish').click(function() {
counter2 = 145;
});
}
$('.b-modal, .b-close').click(function() {
canProcess();
canFlag =1;
clearInterval(interval2);
$('#pg3con').html('<img src="path/to/images/ajax-loader.gif">');
$('#pg3pop').hide();
$('#pg1pop').show();
});
}, 1000);
});
var interval = setInterval(function() {
if(counter > 0){
counter--;
}
$('#secs').html(counter + " seconds");
if (counter === 0 && counterFlag === 0) {
// Display a login box
timeout = 1;
counterFlag = 1;
clearInterval(interval);
$('#pg2pop').hide();
$('#popupLog').hide();
$('#timeout').show();
}
}, 1000);
});
});
})(jQuery);
可重现:总是; 可能的原因:缺少 knowledge/logical 错误
编辑:如果取消两次,则计数器递增 3,依此类推。
我没有复制或测试你的整个脚本(如评论中所述,我们不是来调试的),但我的建议是在你开始之前清除你的间隔,而不是之后。所以请尝试以下操作:
clearInterval(interval);
interval = setInterval(function() {
// do whatever here
}, time);
通过这种方式,您可以确保正在进行的任何间隔都不会再消失。
也许了解 setinterval 的作用是件好事。
所以每个例子:
var myInterval = setInterval(function() {
//some code here
}
变量 'myInterval' 的值不是您所期望的函数。 然而,该值是一个整数。
因此,通过在您的代码中再次设置间隔,该整数从(每个示例)1 变为 2。 如果您 运行 在再次 运行 之前没有清除间隔,您唯一要做的就是清除最新的间隔。第一个还没通关
还要小心 运行 间隔,在你知道之前你的脚本中已经有几个 运行ning。