2013-11-10 76 views
0

我無法理解。在Chrome調試器中,它可以工作,但是當我關閉並刷新頁面時,我的div很清晰。JavaScript setTimeout無法正常工作

<script type="text/javascript"> 
    $(document).ready(function() { 
    function banner_change(span) { 
     if ($(span).hasClass('show')) { 
     $(span).removeClass('show'); 
     } 
    } 

    $('div#spec_banner span').each(function() { 
     if (!$(this).hasClass('show')) { 
     $(this).addClass('show') 
     } 
     setTimeout(banner_change(this), 5000); 
    }); 
    }); 
</script> 

謝謝你的回答。

+0

我理解這個問題的工作。 setTimer將函數發送到腳本的末尾,所以jquery.each不起作用。 –

回答

3

幾個問題,語法和範圍

在使用的setTimeout沒有一個匿名函數,語法是:

setTimeout(banner_change, 5000); /* no() */ 

要傳遞的參數需要做的:

setTimeout(function(){ 
     banner_change(this); 
}, 5000); 

而且,回在範圍內,this在setTimeout中丟失了上下文(現在可能爲window),因此需要將其分配給setTimeout以外的變量

$('div#spec_banner span').each(function() { 
    if (!$(this).hasClass('show')) { 
    $(this).addClass('show') 
    } 
    var span =this 
    setTimeout(function(){ 
     banner_change(span); 
    }, 5000); 
}); 
+0

從技術上講,不是*語法*錯誤 - 它會評估得很好,並繼續做它的事情 - 它肯定不會按預期行事。 – phatskat

1

這是一個問題:

setTimeout(banner_change(this), 5000); 

你實際上調用banner_change這裏 - 嘗試

setTimeout(function(){ 
     banner_change('div#spec_banner span'); 
    }, 5000); 

你最初做的是立即執行banner_change和返回值傳遞給setTimeout

調用
0

您需要傳遞函數引用而不是函數調用結果。

setTimeout($.proxy(banner_change, this), 5000); 

$ .proxy函數引用的包裝將確保您的函數被「this」上下文調用。

0

獲得功能出的文件準備好正確

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 –

+0

這是答案!問題是應該用文檔就緒函數定義的函數banner_change – tinybyte