clearInterval 不会清除后台更改脚本中的间隔
我有一个小脚本,可以通过淡入/淡出效果更改背景图像:
/*controla la velocidad de la animación*/
var slideshowSpeed = 1000;
var transitionSpeed = 2000;
var timeoutSpeed = 500;
/*No tocar*/
var interval;
var activeContainer = 1;
var currentImg = 0;
var animating = false;
var navigate = function(direction) {
// Si ya estamos navegando, entonces no hacemos nada!
if(animating) {
return;
}
currentImg++;
if(currentImg == photos.length + 1) {
currentImg = 1;
}
// Tenemos dos, uno en el que tenemos la imagen que se ve y otro d?nde tenemos la imagen siguiente
var currentContainer = activeContainer;
// Esto puedo optimizarlo con la funci?n modulo, y cambiar 1 y 2 por 0 y 1-> active = mod2(active + 1)
if(activeContainer == 1) {
activeContainer = 2;
} else {
activeContainer = 1;
}
// hay que decrementar el ?ndice porque empieza por cero
cargarImagen(photos[currentImg - 1], currentContainer, activeContainer);
};
var currentZindex = -1;
var cargarImagen = function(photoObject, currentContainer, activeContainer) {
animating = true;
// Nos aseguramos que el nuevo contenedor está siempre dentro del cajon
currentZindex--;
/*if(currentZindex < 0) currentZindex=1;*/
// Actualizar la imagen
$("#headerimg" + activeContainer).css({
"background-image" : "url(" + photoObject + ")",
"display" : "block",
"z-index" : currentZindex
});
// FadeOut antigua
// Cuando la transición se ha completado, mostramos el header
$("#headerimg" + currentContainer).fadeOut(transitionSpeed,function() {
setTimeout(function() {
animating = false;
}, timeoutSpeed);
});
};
function iniciarPase(){
var animating = false;
//ver la siguente
navigate("next");
//iniciar temporizador que mostrará las siguientes
interval = setInterval(function() {
navigate("next");
}, slideshowSpeed);
}
function pararPase(){
var animating = true;
console.log('paramos la animación');
interval = clearInterval(interval);
}
/*Gestion de pase de imágenes de fondo*/
$(document).ready(function() {
iniciarPase();
});
但是包含 clearInterval
表达式的函数 pararPase()
似乎无法工作,即使它处于打开状态
知道我缺少什么吗?
I have this small script that changes the background image with a fadein/out effect:
/*controla la velocidad de la animación*/
var slideshowSpeed = 1000;
var transitionSpeed = 2000;
var timeoutSpeed = 500;
/*No tocar*/
var interval;
var activeContainer = 1;
var currentImg = 0;
var animating = false;
var navigate = function(direction) {
// Si ya estamos navegando, entonces no hacemos nada!
if(animating) {
return;
}
currentImg++;
if(currentImg == photos.length + 1) {
currentImg = 1;
}
// Tenemos dos, uno en el que tenemos la imagen que se ve y otro d?nde tenemos la imagen siguiente
var currentContainer = activeContainer;
// Esto puedo optimizarlo con la funci?n modulo, y cambiar 1 y 2 por 0 y 1-> active = mod2(active + 1)
if(activeContainer == 1) {
activeContainer = 2;
} else {
activeContainer = 1;
}
// hay que decrementar el ?ndice porque empieza por cero
cargarImagen(photos[currentImg - 1], currentContainer, activeContainer);
};
var currentZindex = -1;
var cargarImagen = function(photoObject, currentContainer, activeContainer) {
animating = true;
// Nos aseguramos que el nuevo contenedor está siempre dentro del cajon
currentZindex--;
/*if(currentZindex < 0) currentZindex=1;*/
// Actualizar la imagen
$("#headerimg" + activeContainer).css({
"background-image" : "url(" + photoObject + ")",
"display" : "block",
"z-index" : currentZindex
});
// FadeOut antigua
// Cuando la transición se ha completado, mostramos el header
$("#headerimg" + currentContainer).fadeOut(transitionSpeed,function() {
setTimeout(function() {
animating = false;
}, timeoutSpeed);
});
};
function iniciarPase(){
var animating = false;
//ver la siguente
navigate("next");
//iniciar temporizador que mostrará las siguientes
interval = setInterval(function() {
navigate("next");
}, slideshowSpeed);
}
function pararPase(){
var animating = true;
console.log('paramos la animación');
interval = clearInterval(interval);
}
/*Gestion de pase de imágenes de fondo*/
$(document).ready(function() {
iniciarPase();
});
But the function pararPase()
which contains the clearInterval
expression seems not to work even if its on the <body onload="pararPase()">
Any idea what I am missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的基本逻辑工作得很好,这里是实时测试用例。
因此,很可能您错误地绑定了 pararPase,例如,当按钮尚不存在时,尝试在
document.ready()
外部绑定为点击处理程序 - 更新的测试用例来证明这一点。另一种选择是代码中存在其他错误,请检查 Chrome JavaScript 控制台以查看是否属于这种情况。
正如其他人在评论中提到的,将 clearInterval 的返回值分配回变量是没有意义的,但没有害处:变量只会具有“未定义”值。
编辑:
iniciarPase
有可能被多次调用,这将导致多个计时器,其中只有最后一个计时器会被清除。因此,为了安全起见,请将其添加到您的函数中:(这实际上是 Diode 在他的回答中试图说的)Your base logic is working just fine, here is live test case.
So most likely you bind
pararPase
incorrectly, for example trying to bind as click handler outsidedocument.ready()
when the button does not yet exist - updated test case to prove this point.Another option is other error in your code, check Chrome JavaScript console to see if this is the case.
As others mentioned in comments, assigning the return value of clearInterval back to the variable is meaningless, but not harmful: the variable will just have the value "undefined".
Edit: there is a chance that
iniciarPase
is called more than once, this will cause more than one timers where only the last will be cleared. So, to be on the safe side add this to your function: (that's actually what Diode tried to say in his answer)