2016-07-07 43 views
-1

我使用setTimeout来运行幻灯片。我想要按钮来阻止它。标记是:使用clearTimeout的范围问题

<h3> Modest Mouse at Fillmore in Miami <h3> 

    <div> 
    <img id="photo" src="http://the305.com/blog/wp-content/uploads/2014/05/modestmouse3.jpg" alt= "Modest Mouse at Fillmore"> 
     <span>&bull;</span> 
     <span>&bull;</span> 
     <span>&bull;</span> 

    </div> 

    <button onclick="stopShow();">Stop</button> 

的JS是:

var aSlideShowPics = ["http://the305.com/blog/wp-content/uploads/2014/05/modestmouse3.jpg", 
    "http://the305.com/blog/wp-content/uploads/2014/05/modestmoude7.jpg", 
    "http://the305.com/blog/wp-content/uploads/2014/05/modestmouse8.jpg" 
]; 

    // Timer for SlideShow 

var i = 0; 
    function changeSlide() { 
      var stopShowID; 
      stopShowID = window.setTimeout(function() { 
       newPic = aSlideShowPics[i];  
       $("#photo").attr("src", newPic); 
       i++; 
       if (i < aSlideShowPics.length) { 
       changeSlide(); // recursive call to increment i and change picture in DOM. 
       } else { 
         i = 0; // reset loop to keep slideshow going 
         changeSlide(); // Recursive call on loop end 
       } 

       function stopShow() { 
       window.clearTimeout(stopShowID); 
       } 
     }, 3000) 
    } 

changeSlide(); 

我不断收到上没有stopShow的按钮,点击引用错误。我试过在代码中的几个地方放置clearTimeout函数,但得到相同的错误。也许一组新的眼睛可以看到我的错误。这里是jsfiddle。感谢您的任何意见。

+2

的为什么是超时内stopShow?这是你的问题 – epascarello

+0

我认为这是问题,但当我把它移到changelide以外的全球范围和相同的错误... – alan

回答

1

将stopShow移到超时和changeSlide之外。

var stopShowID; 
function changeSlide() { 
    stopShowID = window.setTimeout(function(){}, 3000);  
} 
function stopShow() { 
    if(stopShowID) { 
     window.clearTimeout(stopShowID); 
     stopShowID = null; 
    } 
} 
+0

我只是做了http://jsfiddle.net/alank90/fLw2a4vs/43/,仍然得到stopShow不是定义。 – alan

+0

,因为你的小提琴设置为运行ondomready,因此该函数不在全局范围内。 – epascarello

+0

http://jsfiddle.net/0djk73ga/1/ < - 代码被设置在身体 – epascarello

1

我无法启动您的jsfidle例子,所以我更新代码的内容,提出了2个问题:

1-你stopShow是不确定的,所以我将其附属于窗口范围: 窗口。 stopShow = stopShow;

2-对于您的ClearTimeout范围问题:您的stopShowID变量位于您的函数changeSlide中:您的stopShow正在使用本地副本。我基本上把它作为一个全局变量,所以这两个函数都可以访问它。

var aSlideShowPics = ["http://the305.com/blog/wp-content/uploads/2014/05/modestmouse3.jpg", 
    "http://the305.com/blog/wp-content/uploads/2014/05/modestmoude7.jpg", 
    "http://the305.com/blog/wp-content/uploads/2014/05/modestmouse8.jpg" 
]; 

    // Timer for SlideShow 

var stopShowID; 
var i = 0; 

function stopShow() { 
    window.clearTimeout(stopShowID); 
} 

window.stopShow = stopShow; 

    function changeSlide() { 

      stopShowID = window.setTimeout(function() { 
       newPic = aSlideShowPics[i];  
       $("#photo").attr("src", newPic); 
       i++; 
       if (i < aSlideShowPics.length) { 
       changeSlide(); // recursive call to increment i and change picture in DOM. 
       } else { 
         i = 0; // reset loop to keep slideshow going 
         changeSlide(); // Recursive call on loop end 
       } 


     }, 3000) 
    } 


changeSlide(); 

工作的jsfiddle:
http://jsfiddle.net/fLw2a4vs/44/

+0

谢谢。我认为这是一个事实,即函数不在范围之内,并且已经从本地移动到全局范围,但我仍然有参考错误。但是,感谢这里的每个人都需要进行完整性检查。我希望再次投票得到重新考虑,因为我已经有机器人警告我。 – alan

1

的stopShow()方法并不在窗口水平存在,它仅changeSlide体内存在()。直接将其连接到窗口

window.stopShow = function() ... 

或将其拉出封闭

var i = 0; 
var stopShowId; 
function stopShow() { 
    window.clearTimeout(stopShowID); 
} 

function changeSlide() { 
    stopShowID = window.setTimeout(function() { 
     if (i >= aSlidesShowPics.length - 1) 
      i = 0; 

     var newPic = aSlideShowPics[i++];  
     $("#photo").attr("src", newPic); 
     changeSlide();  
     }, 3000); 
    }