javascript - 如何在 HTML 脚本标记中使用 Javascript 对浏览器中的连续事件进行计时?

标签 javascript html settimeout setinterval thread-sleep

我刚刚开始学习 JavaScript,来自 Java/Clojure 背景,我正在尝试执行一个简单的线程 sleep 命令,该命令允许我以一秒的间隔在屏幕上显示文本行。我考虑过使用 setInterval 函数来代替,但因为我正在处理多个函数,所以我认为 setTimeout 会更好。我遇到的问题是所有文本都会立即在浏览器中打印,就好像 setTimeout 函数甚至不存在一样。下面是一个使用“生日快乐”歌曲的示例,我认为它简洁地说明了问题。如何使下面的程序以一秒的间隔逐行运行?

<!doctype html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <title>Happy Birthday</title>
        </head>
        <body>
            <script>
                var name = "Joe",
                    i = 0;

                while (i < 2) {
                    setTimeout(document.write("Happy Birthday to you!<br>"), 1000);
                    i ++;
                }
                setTimeout(document.write("Happy Birthday dear " + name + ",<br>"), 1000);
                setTimeout(document.write("Happy Birthday to you!<br>"), 1000);
            </script>
        </body>
    </html>

最佳答案

为了延迟某些代码的计算,应该将该代码放入一个函数中;该函数引用应该传递到 setTimeout 中。例如:

setTimeout(function() {
    document.write('Hello world!');
}, 1000);

就目前情况而言,您评估 document.write 表达式而不是立即 - 这就是为什么您会看到所有写入同时发生。

作为旁注,请不要使用 document.write ,除非您真的知道自己在做什么。只需调整 log 元素的 innerHTML 即可轻松“记录”某些内容。例如:

<div id="log"></div>
<script>
  var log = document.getElementById('log');
  setTimeout(function() {
    log.innerHTML += 'Hello world!<br />';
  }, 1000);
</script>

另外,不要忘记每个超时都是独立处理的。要设置事件链,您需要手动增加延迟 - 否则所有函数几乎都会立即调用。

总的来说,具体方法如下:

<div id="log"></div>
<script>
var name = "Joe",
    i = 0,
    delayedMessage = function(msg) {
      setTimeout(function() {
        document.getElementById('log').innerHTML += msg;
      }, ++i * 1000);
    };

    delayedMessage("Happy Birthday to you!<br>");
    delayedMessage("Happy Birthday to you!<br>");
    delayedMessage("Happy Birthday dear " + name + ",<br>");
    delayedMessage("Happy Birthday to you!<br>");
</script>

Demo .

关于javascript - 如何在 HTML 脚本标记中使用 Javascript 对浏览器中的连续事件进行计时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827898/

相关文章:

javascript - 单击按钮/链接时如何添加特定的突出显示动画?

javascript - 加入 mongoDB

javascript - 如何在 mongodb 中为我的帖子模型创建 "tags"?

javascript - 获取动态创建的文本

php - 通过 <C> 标记在 XML <B> 数据中使用 PHP 进行搜索

php - 表单不会将数据提交到 MySQL 数据库

javascript - JQuery,setTimeout 不工作

javascript - setTimeout(fn,0) 在应用样式之前触发

javascript - 如何呈现通过表单提交的 HTML?

linux - 是否可以从 bash 脚本中设置超时?