内部设置间隔的循环
我需要逐个写一个文字,暂停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是非常宽的间距)