【发布时间】:2014-07-08 18:09:56
【问题描述】:
美好的一天!我正在学习 javascript,但计时器有问题。我只是想检查整个页面写入后是否触发了 onload 事件,包括通过 javascipt 修改的文本。为此,我想通过在字符之间引入 200 毫秒的延迟来减慢文本的写入速度。
我使用的测试如下:
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Onload test</title>
<script>
function load() {
alert("The page is considered loaded !");
}
function writeSlowly(text, timer) {
var L= text.length;
var st = "";
function write (seq) {
document.getElementById("st").innerHTML = seq;
};
for (var i = 0; i < L; i += 1) {
st += text[i];
setTimeout(write(st), timer);
};
};
</script>
</head>
<body>
<p id="st"></p>
<script>
writeSlowly("This pages takes a while to load", 200);
window.onload = load;
</script>
</body>
</html>
页面加载就像没有延迟一样。实际上,我预计文本(32 个字符长)大约需要 32 x 200 毫秒 =~ 7 秒。调试时(使用 Firebug - 我使用 Firefox 30),程序会逐行执行,但计时器不起作用。页面几乎立即显示。
【问题讨论】:
-
谢谢 Adam、Cheruvian 等人。我会进一步练习。
-
感谢 Cheruvian 和 Adam 花时间编写正确的解决方案。你的两个脚本都在工作。我会确保我理解它的要点。
-
回到我原来的问题:什么时候考虑加载页面?答案是:很早。它不会等待页面完成执行脚本。您也可以在 Firebug 上的 HTML 选项卡中看到这一点:您可以看到随着时间的推移而扩展的段落:
This page ... 直到它完成。所以我认为正确的说法是:“当读取静态元素并且读取动态元素的代码但不一定完全执行时,页面被认为已加载。”
-
当所有静态内容加载完毕后,包括 CSS 文件、图片和 HTML DOM,
onload函数将运行。该页面无法等待dynamic元素加载,因为它们是使用脚本完成的,并且无法确定它们何时“完成”加载。 setTimeout 方法是异步的,这意味着其余代码不会等待它运行,而是在没有它的情况下继续运行,这就是window.onload在字符串输出之前运行的原因。
标签: for-loop callback settimeout