好的,我有一个非常简单的图片幻灯片放在这里,它在jsfiddle
你们可以看到单击“开始”时它可以正常工作。但是当你单击停止时,该函数继续运行是jquery:
$(document).ready(function() {
var timer;
$('img.hidden').hide();
$('img.top').show();
$('input').click(function(){
var value = $('input').attr("value");
if(value == "start"){
$(this).attr("value","stop");
startShow();
}else if(value == "stop"){
$(this).attr("value","start");
alert('stopped');
clearTimeout(timer);
}
});
});
function startShow(){
var $top = $('img.top').attr("src");
var $last = $('img').last().attr("src");
if($top != $last ){
var $topImg = $('img.top');
var $nextImg = $('img.top').next();
$topImg.hide();
$nextImg.show();
$topImg.removeClass("top");
$nextImg.addClass("top");
}
else{
var $topImg = $('img.top');
var $nextImg = $('img').first();
$topImg.hide();
$nextImg.show();
$topImg.removeClass("top");
$nextImg.addClass("top");
}
timer = setTimeout(function() { startShow(); }, 2000);
};
答案 0 :(得分:4)
问题在于变量的范围。将var timer;
移到文档就绪功能之外,它将起作用。当然,这使它成为一个全球性的,这是不好的。因此,您可能希望将StartShow移动到文档就绪函数中。
答案 1 :(得分:2)
timer
在$(document).ready
函数中声明为局部变量,因此在startShow
函数中不可用。
解决方案是使timer
成为全局变量,或者更好地重新组织代码以使用闭包。
让我用一个例子来解释发生了什么。
function main() {
var x = 3; // declare a local copy of x, available only in this function
setValueOfX(); // Try to change the value of x (doesn't work)
console.log(x); //Prints 3
}
function setValueOfX() {
x = 12; // You would expect this to change the value of x, but it only changes the value of the global x (window.x), not the local x, so this won't work
}
main();
答案 2 :(得分:2)
startShow
正在分配全局变量timer
,但是当您调用clearTimeout
时,您就在document.ready(function() {...})
内,其中声明了本地变量timer
。该局部变量会影响全局变量。
要么摆脱var timer;
声明,要么在准备好的功能中移动startShow()
。