1

乍一看(由于标题),我知道这看起来像是“您在发布之前尝试过搜索 Google 吗?”之一。问题,但我似乎无法找到我遇到的具体问题的答案。对不起,如果我是菜鸟....还在学习:)

我需要在 javascript 中模拟暂停,但 setTimeout(function_call, timeout) 函数对我不起作用。原因是......当调用该 setTimeout 函数时,它会异步调用该函数。

一点背景知识:
我正在尝试模拟以随机时间间隔输入 div 的文本。我希望它看起来好像一个人在用户查看页面时实际上正在输入一条消息。由于超时是一个随机间隔并且函数调用是异步进行的,因此文本最终会以随机顺序打印。

这是我到目前为止的一个片段:

typeString: function(s)
{
    for(var i=0;i<s.length;i++)
    {                      
        var c = s.charAt(i);
        var temp = setTimeout("MessageType.typeChar('" + c + "')", this.genRandomTime());
    }
}



在此先感谢您的帮助。

CJAM



更新:通过将计时器延迟添加到变量中,它使我能够抵消异步调用的 timeOut。谢谢大家的快速回复。这是更新的代码:

typeString: function(s)
{
    var delay = 0;

    for(var i=0;i<s.length;i++)
    {                     
        var c = s.charAt(i);
        setTimeout("GoogleTyper.typeChar('"+c+"')", delay += this.genRandomTime());
    }
}
4

3 回答 3

3

您是否尝试过累积设置超时?在循环之外粘贴一个变量并将其初始化为 0。我们暂时称它为超时。在循环的每次迭代开始时向此变量添加随机时间量,并使其超时工作。这样,您可以确保按顺序调用函数。

于 2009-02-07T06:47:07.180 回答
2

您的问题是您使用的所有时间都从现在开始延迟 - 下一个计时器需要在前一个计时器之后触发。只需将先前的计时器延迟添加到新计时器即可。

typeString: function(s)
{
    var delay = 0;
    for(var i=0;i<s.length;i++)
    {                      
        var c = s.charAt(i);
        delay = delay + this.genRandomTime();
        var temp = setTimeout("MessageType.typeChar('" + c + "')", delay );
    }
}
于 2009-02-07T06:48:08.083 回答
1

不是将要显示的字符传递给每个计时器事件,而是让每个事件处理程序从队列(数组,列表中)中获取下一个字符,以便保持顺序。

于 2009-02-07T06:49:47.567 回答