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

发布于 2024-12-04 02:49:00 字数 927 浏览 0 评论 0原文

有没有人有一个很好的技术原因,为什么以下代码在基于 WebKit 的浏览器(Chrome/Safari)中运行良好,但导致 FF 挂起并且 IE 永远不会写出任何内容?请注意,如果我使用 writeOutDirect() 不使用 setTimeout() 那么它工作正常(但有其他副作用,正如我在 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>

Does anyone have a good technical reason why the following code runs fine in WebKit based browsers (Chrome/Safari) but causes FF to hang and IE never writes anything out? Note that if i use writeOutDirect() which does not use setTimeout() then it works fine (but has other side effects as i discuss at 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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紫竹語嫣☆ 2024-12-11 02:49:00

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

The Gecko behavior here is correct. The WebKit behavior is a bug. See https://bugs.webkit.org/show_bug.cgi?id=65407

红颜悴 2024-12-11 02:49:00

您在此处提供的脚本确实写出了一些内容,即“0”。 document.write() 仅当在页面加载时调用它时才会将内容添加到文档中。如果您在页面加载完成后调用它,它将用您提供的内容替换当前文档(调用 document.open() 是隐含的)。随着当前文档的消失,所有超时也都消失了。因此,只有一个超时有机会运行(写出0),它会替换文档,并且所有其他超时都将被取消。

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

The script you gave here does write out something, namely "0". document.write() will only add content to the document if it is called while the page is loading. If you call it after the page finished loading it will replace the current document by the content you gave it (a call to document.open() is implied). And with the current document being gone all its timeouts are gone as well. So only one timeout gets a chance to run (the one writing out 0), it replaces the document and all the other timeouts are canceled.

In Chrome replacing the current document via document.open() doesn't kill existing timeouts, they simply operate on the new document - that might be a bug, at the very least it is incompatible to all the other browsers. I'm not sure whether any existing standard clearly describes whether the timeouts need to be canceled in this case however.

尴尬癌患者 2024-12-11 02:49:00

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

For future reference (and anyone who runs into this in future), if you use document.body.appendChild() rather than document.write everything works fine.... which probably suits most scenarios.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文