我有一个包含预渲染内容和未渲染内容的html页面。我希望能立即显示预渲染内容,然后开始渲染其余的内容。我不使用jQuery。
请看以下代码片段。我已经尝试了多种方式,包括在结束body标签之前注入我的脚本,并将我的脚本作为回调提供给window.onload
、document.body.onload
和document.addEventListener('DOMContentLoaded')
。但无论哪种情况,页面都不会显示预渲染内容直到其余的内容被渲染。
<html><head></head>
<body>
<header>What it is, my doge?</header>
<div id="main"></div>
<script>
var main = document.getElementById('main');
for (var i = 0; i < 500; i++)
main.innerText += new Date();
</script>
</body>
</html>
<html><head></head>
<body>
<header>What it is, my doge?</header>
<div id="main"></div>
<script>
var main = document.getElementById('main');
document.body.onload = function() {
for (var i = 0; i < 500; i++)
main.innerText += new Date();
};
</script>
</body>
</html>
<html><head></head>
<body>
<header>What it is, my doge?</header>
<div id="main"></div>
<script>
var main = document.getElementById('main');
window.onload = function() {
for (var i = 0; i < 500; i++)
main.innerText += new Date();
};
</script>
</body>
</html>
<html><head></head>
<body>
<header>What it is, my doge?</header>
<div id="main"></div>
<script>
var main = document.getElementById('main');
document.addEventListener('DOMContentLoaded', function() {
for (var i = 0; i < 500; i++)
main.innerText += new Date();
});
</script>
</body>
</html>
一个有效的方法是使用超时时间为0的window.setTimeout
函数。然而,这只是将函数推迟到没有其他事情可做的时候。在这里,这是最佳实践吗?
<html><head></head>
<body>
<header>What it is, my doge?</header>
<div id="main"></div>
<script>
var main = document.getElementById('main');
window.setTimeout(function() {
for (var i = 0; i < 500; i++)
main.innerText += new Date();
}, 0);
</script>
</body>
</html>
</body>
标签之前即可。setTimeout(function(){}, 0)
方法似乎在FireFox中无法正常工作。它需要一个大约50-100毫秒的超时时间。 - JstnPwllsetTimeout(function(){},0)
设置的最小延迟时间(根据HTML5规范定义)是4毫秒。当设置的值小于4毫秒时,它会被自动设置为4毫秒。 - Arthur Weborg