使用IE / FF中的迭代的setTimeout错误

时间:2011-09-13 10:59:17

标签: internet-explorer firefox webkit

有没有人有一个很好的技术理由为什么以下代码在基于WebKit的浏览器(Chrome / Safari)中正常运行但导致FF挂起而IE从未写出任何内容?请注意,如果我使用不使用setTimeout()的writeOutDirect(),那么它工作正常(但我在http://blog.livz.org/post/More-responsive-UI-with-setTimeout-on-WebKit.aspx讨论时会产生其他副作用。

<html>
<head>
    <script>
        function doIteration() {
            for (i=0;i<10;i++) {
                writeOut(i);
                //writeOutDirect(i);                
            }

        }

        function writeOut(i) {
            setTimeout(function () {
                document.write(i+'<br/>');
            },0);
        }

        function writeOutDirect(i) {
            document.write(i+'<br/>');
        }
    </script>
</head>
<body onload="doIteration()">

</body>

3 个答案:

答案 0 :(得分:2)

这里的Gecko行为是正确的。 WebKit行为是一个错误。见https://bugs.webkit.org/show_bug.cgi?id=65407

答案 1 :(得分:1)

你在这里给出的脚本会写出一些东西,即“0”。 document.write()只会在加载页面时调用内容。如果您在页面加载后调用它,它将用您提供的内容替换当前文档(隐含了对document.open()的调用)。随着当前文件的消失所有超时也消失了。因此,只有一个超时有机会运行(写出0),它会替换文档,所有其他超时都会被取消。

在Chrome中,通过document.open()替换当前文档并不会导致现有超时,但它们只是对新文档进行操作 - 这可能是一个错误,至少它与所有其他浏览器不兼容。我不确定现有标准是否清楚地描述了在这种情况下是否需要取消超时。

答案 2 :(得分:0)

为了将来的参考(以及将来遇到这种情况的任何人),如果你使用document.body.appendChild()而不是document.write一切正常....这可能适合大多数场景。