内部设置间隔的循环

我需要逐个写一个文字,暂停3秒。 之间。

我尝试了这个但是没有用。 3秒后 整个文本立即写入。

function thanks() { $("#writer").text(""); var txt = "Thanks for visiting !"; for ( var i = 0; i < 22; i++) { setInterval(function(){ var type = txt.substring(0, i); $("#writer").text(type); }, 3000); }; }; 

你一次排队22个电话,所有这些都在3秒后发生。 只需创建一次间隔,在每次调用时输出新文本。 当你用完文本时停止间隔。

 function thanks() { $("#writer").text(""); var txt = "Thanks for visiting !"; var i = 0; var int = setInterval( function() { ++i; if (i > txt.length) { clearInterval(int); return; } var type = txt.substring(0, i); $('#writer').text(type); }, 3000); } 

示例: http : //codepen.io/paulroub/pen/AwLfx

这是经典的闭包问题,你传入setInterval每个函数都有一个对i持久引用 ,而不是它的副本,因此在运行时看到i的相同值(它在循环后的值)。 你也不想在这里使用setInterval ,你想要setTimeout

通常的答案是让函数接近其他东西。 这些日子真的很简单,你使用的是Function#bind ,它是在ES5中添加的,但可以为旧的JS引擎正确填充。

但除此之外,我们还有一些其他问题需要解决:我们需要给每个函数一个不同的延迟,我们不能为所有函数使用3000,或者它们都会在三秒钟后一个接一个地触发! 因此,我们可能希望将其乘以i以便将每个字符安排在前一个字符后的3000毫秒,而不是使用3000的延迟。

我也使用i <= txt.length而不是硬编码。 这样,如果您更改文本,也不会忘记更改数字。

也没有必要(但没有伤害) ; 在函数声明之后。 你需要在表达式之后使用它们,而不是声明。

所以一起:

 function thanks() { $("#writer").text(""); var txt = "Thanks for visiting !"; for (var i = 0; i <= txt.length; i++) { setTimeout(function(index) { var type = txt.substring(0, index); $("#writer").text(type); }.bind(null, i), i * 3000); }; } 

Function#bind返回一个函数,当调用它时,将使用给定的值调用原始函数(我们不需要那个位,因此null作为第一个参数)然后我们给它的任何参数(我们是传递它i ,函数接收它作为index参数)。

实例 (我在示例中使用了300而不是3000,其中3000是非常宽的间距)