2011-07-20 33 views
3

我把一些JavaScript代碼jQuery和內調用函數都停下來, 繼承人的代碼...
HTML:從同樣的功能

<div id="text"></div> 

的JavaScript:

keywords = [ "one", "two", "three"] 
var allowed = true; 
function ChangeText () { 
    if(allowed) 
    { 
     var keyword = keywords[ Math.floor(Math.random() * keywords.length) ] 
     document.getElementById("text").innerHTML = keyword; 
    } 
    setTimeout("ChangeText()", switchTime); 
} 
ChangeText(); 

的jQuery:

var changeAllowed = true; 
$(document).ready(function ChangeText() { 
    if(changeAllowed) 
    { 
     $("#text").fadeOut(500); 
     var keyword = keywords[ Math.floor(Math.random() * keywords.length) ]; 
     $("#text").text(keyword).fadeIn(1000); 
    }; 
    setTimeout("ChangeText()", 2000); 
}); 
ChangeText(); 

它應該做的是淡出文本,然後返回一個新的字符串(它刷新)每2秒左右,jQuery效果工作,它似乎是setTimeout()或我還沒有正確命名該功能。

+1

凡'switchTime'定義? – Briguy37

+0

您的代碼實際上可能在IE8及更低版本中工作,因爲您使用的是*命名的函數表達式*,並且IE將該名稱泄漏到封閉變量環境中。我相信在IE9中修復。 – user113716

回答

2

UPDATE

我的第一個解決方案得到了不同步的時候顯示了隊列後面。這裏被更新,使用這樣的回調的時機永遠是正確的,與test fiddle一起代碼:

var changeAllowed = true; 
var keywords = ["test1", "test2", "test3", "test4", "test5"]; 
var hide = true; 

var toggleTextFade = function() { 
    if(changeAllowed) { 
     var keyword =keywords[Math.floor(Math.random() * keywords.length)]; 

     $("#text").text(keyword).fadeIn(1000,null,function(){ 
      $("#text").fadeOut(500,null,toggleTextFade)}); 
    }    
}; 


$(document).ready(toggleTextFade); 
+0

第一個解決方案同時工作,而兩個fadeIn/fadeOut設置相同。 但是,這很好,謝謝。 – Squiggles

+0

謝謝你把我介紹給jsfiddle。 – Squiggles

+0

@aprice很高興我能幫忙:) – Briguy37

3

使用它,而括號和引號:setTimeout(ChangeText, 2000);

7

將字符串傳遞到setTimeout將從全球範圍內,在沒有定義funcion評估。通過它直接代替,這樣它會從功能的範圍,在該函數(顯然)是定義評價:

setTimeout(ChangeText, 2000); 
+0

從技術上講,該函數是在全局範圍內定義的(除非另有函數包裝所有這些我們看不到)。但是對於一個命名的函數表達式,名稱本身只能在函數內部使用。 – user113716

+0

@patrick dw:謝謝你的解釋。但是,如果它在全球範圍內定義,我們如何訪問它? – pimvdb

+1

儘管在此處定義了全局範圍,但沒有保留在全局範圍內的命名引用。 – user113716

4
setTimeout(arguments.callee, 2000); 

arguments.callee是功能「自指針」。最大的優勢是它可以與匿名函數和命名函數一起工作。因此,jQuery的:

var changeAllowed = true; 
var keywords  = [anything]; 

$(document).ready(function() { 
    if(changeAllowed) { 
     var keyword = keywords[ Math.floor(Math.random() * keywords.length) ]; 
     $("#text").fadeOut(500).text(keyword).fadeIn(1000); 
    }; 
    setTimeout(arguments.callee, 2000); 
}); 

注:這個答案是從2008年最初。現在正確的做法已經改變。正如評論指出的,你會使用一個名爲函數表達式(NFE),像這樣:

var changeAllowed = true; 
var keywords  = [anything]; 

$(document).ready(function fadeKeyword() { 
    if(changeAllowed) { 
     var keyword = keywords[ Math.floor(Math.random() * keywords.length) ]; 
     $("#text").fadeOut(500).text(keyword).fadeIn(1000); 
    }; 
    setTimeout(fadeKeyword, 2000); 
}); 

arguments.callee仍然會在非嚴格模式下工作,但嚴格更導致錯誤。

+0

+1更優雅的解決方案。 – pimvdb

+1

請記住,'arguments.callee'在* strict模式下無效*。 :o) – user113716

+0

@帕特里克:嗯,我不知道。什麼取代它? – Tomalak