从同一个函数中调用函数

时间:2011-07-20 18:07:47

标签: javascript jquery settimeout

我正在将一些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()或我'没有正确命名这个功能。

4 个答案:

答案 0 :(得分:7)

将字符串传递给setTimeout将从全局范围进行评估,其中未定义函数。直接传递它,以便它将从函数的范围进行评估,其中函数(显然) 定义:

setTimeout( ChangeText, 2000 );

答案 1 :(得分: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仍将在非严格模式下工作,但严重时会导致错误。

答案 2 :(得分:3)

使用它而不用parens和引号:setTimeout(ChangeText, 2000 );

答案 3 :(得分:2)

<强>更新

当显示队列落后时,我的第一个解决方案失去了同步。以下是使用回调的更新代码,因此时间总是正确的,以及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);