javascript setTimeout 函数在 1 次调用后行为不正常
javascript setTimeout function does not behave normally after 1 call
我有以下功能:
function loadInfoBubble(aString)
{
$('#infoBubble').html('<h3>info :</h3><p>'+aString+'</p>');
infoBubble.style.display = "block";
var opacity = 9;
var vanishBlock = null;
var theTimeOut = setTimeout(function()
{
vanishBlock = setInterval(function()
{
if(opacity > 0)
{
opacity--;
}
infoBubble.style.opacity = "0."+opacity;
}, 100);
}, 7000);
var theTimeOut2 = setTimeout(function()
{
infoBubble.style.display = "none";
clearInterval(vanishBlock);
}, 9000);
}
此函数通过 onclick 事件链接到按钮。
该函数应该显示一个包含一个句子的块 9 秒,7 秒后它开始消失。
第一次调用正常,但如果我点击几次,它就不再起作用了,即使我让 timeOuts 结束。
我不明白为什么,因为每个超时或间隔都属于它自己的变量。
您的代码永远不会将不透明度重置回 1。此外,如果您在一个循环完成之前再次触发操作,则不会取消上一个循环。因此如果你触发了气泡,然后在 5 秒后再次触发它,第一个循环仍然是 运行,并且气泡会在 2 秒后消失。如果您再次单击 ,气泡将按照第二次单击时开始的循环逐渐消失。
我认为你需要做的是用气泡对象本身保存计时器引用,然后在你想开始显示循环时重置所有内容。您可以为此使用 jQuery .data()
方法:
function loadInfoBubble(aString) {
var $bubble = $("#infoBubble");
$bubble
.html('<h3>info :</h3><p>' + aString + '</p>')
.css({ display: "block", opacity: 1 });
var opacity = 9;
var timers = $bubble.data("timers") || {};
clearInterval(timers.vanishBlock);
clearTimeout(timers.showTimer);
clearTimeout(timers.clearTimer);
timers = {
showTimer: setTimeout(function() {
timers.vanishBlock = setInterval(function() {
if (opacity > 0) {
opacity--;
}
$bubble.css({ opacity: "0." + opacity });
}, 100);
}, 7000),
clearTimer: setTimeout(function() {
$bubble.css({ display: "none" });
clearInterval(timers.vanishBlock);
}, 9000)
};
$bubble.data("timers", timers);
}
我有以下功能:
function loadInfoBubble(aString)
{
$('#infoBubble').html('<h3>info :</h3><p>'+aString+'</p>');
infoBubble.style.display = "block";
var opacity = 9;
var vanishBlock = null;
var theTimeOut = setTimeout(function()
{
vanishBlock = setInterval(function()
{
if(opacity > 0)
{
opacity--;
}
infoBubble.style.opacity = "0."+opacity;
}, 100);
}, 7000);
var theTimeOut2 = setTimeout(function()
{
infoBubble.style.display = "none";
clearInterval(vanishBlock);
}, 9000);
}
此函数通过 onclick 事件链接到按钮。 该函数应该显示一个包含一个句子的块 9 秒,7 秒后它开始消失。
第一次调用正常,但如果我点击几次,它就不再起作用了,即使我让 timeOuts 结束。
我不明白为什么,因为每个超时或间隔都属于它自己的变量。
您的代码永远不会将不透明度重置回 1。此外,如果您在一个循环完成之前再次触发操作,则不会取消上一个循环。因此如果你触发了气泡,然后在 5 秒后再次触发它,第一个循环仍然是 运行,并且气泡会在 2 秒后消失。如果您再次单击 ,气泡将按照第二次单击时开始的循环逐渐消失。
我认为你需要做的是用气泡对象本身保存计时器引用,然后在你想开始显示循环时重置所有内容。您可以为此使用 jQuery .data()
方法:
function loadInfoBubble(aString) {
var $bubble = $("#infoBubble");
$bubble
.html('<h3>info :</h3><p>' + aString + '</p>')
.css({ display: "block", opacity: 1 });
var opacity = 9;
var timers = $bubble.data("timers") || {};
clearInterval(timers.vanishBlock);
clearTimeout(timers.showTimer);
clearTimeout(timers.clearTimer);
timers = {
showTimer: setTimeout(function() {
timers.vanishBlock = setInterval(function() {
if (opacity > 0) {
opacity--;
}
$bubble.css({ opacity: "0." + opacity });
}, 100);
}, 7000),
clearTimer: setTimeout(function() {
$bubble.css({ display: "none" });
clearInterval(timers.vanishBlock);
}, 9000)
};
$bubble.data("timers", timers);
}