2014-02-25 117 views
0

尝试调试下面的代码for循环和时间,需要帮助调试

function split(toRead, toReplace, speed) { 
    var words = $(toRead).html().split(" "); 
    for (var i = 0; i < words.length; i++) { 
     //console.log(words[i]); 
     setTimeout(function() { 
      $(toReplace).html(words[i]); 
     }, speed * i); 
    } 
} 

的代码应该得到“探路者”的文本块,打破它的话,然后每个替换“toReplace”字,具有设定的时间间隔。像http://www.spreeder.com/呢。

但是,它似乎没有工作。我猜这与定时和for循环有关(看起来像for循环结束了,不管定时器如何,使得[i]每次读取同一个单词)。

非常感谢所有帮助,感谢你们&加仑:) 干杯, 尼尔

+0

和[在一个循环传递函数的setTimeout:?总是最后一个值( http://stackoverflow.com/q/6425062/218196)和[setTimeout在for循环中并将值作为值](http://stackoverflow.com/q/5226285/218196)(都可以通过['[ javascript] settimeout loop'](https://stackoverflow.com/search?q= [javascript] + settimeout + loop))。 –

回答

0

尝试使用这样的:

<!DOCTYPE html> 
<html> 
<head> 
<script type="text/javascript" src="jquery.js"></script> 
</head> 
<body> 
<div id="toRead">This is a sample text do demonstrate that the code below works fine. Please test this code and vote up if it works for you !!</div> 
<div id="results"></div> 
<script type="text/javascript"> 
var ctr=0; 
function displayWords(words,len,toReplace,speed){ 
    if(ctr<len){ 
     setTimeout(function(){ 
      $(toReplace).html(words[ctr]); 
      ctr++; 
      displayWords(words,len,toReplace,speed); 
     },speed); 
    } 
} 

function split(toRead, toReplace, speed) { 
    var words = $(toRead).html().split(" "); 
    displayWords(words,words.length,toReplace,speed); 
} 

split(document.getElementById("toRead"),document.getElementById("results"),200); 
</script> 
</body> 
</html> 

说明:当您使用的setTimeout里面一个for循环中,JavaScript引擎做不延迟代码执行并等待超时。

因此,正确的方法是使用递归函数,然后检查计数是否没有达到,然后再次调用相同的函数。继续这个,直到达到计数。这样你可以拥有你想要的功能。

+0

如果您还**解释了您的解决方案,您的答案会更有用。你做了什么,为什么? –

+1

@FelixKling我已将解释添加到上面的代码中。 – kcak11

+0

为什么-1给我的答案?我已经测试了代码,并且完全按照www.spreeder.com的工作方式工作。那么问题是什么? – kcak11

0

您可能想要append替换 DIV的内容。在你的问题,你只需要改变它的内容如下所示

$('#toReplace').html(words[i]); 

如果要追加你应该做

$('#toReplace').html().append(" " + words[i]); 

请注意$('#toReplace')代替$(toReplace) - 这意味着你要将目标ID为的元素替换为

但是如果直接到方法传递的元素,因为你这样做,你应该直接使用

toReplace.html(words[i]); // and so on.. don't use $(toReplace) 
+0

问题是关于延迟显示单个单词。 用户提到了样本www.spreeder.com – kcak11

+0

啊,那好吧。无论如何,问题的答案是由粗体文本指定的。谢谢你的通知。 – Dropout