Ошибка setTimeout с использованием итераций в IE / FF - PullRequest
1 голос
/ 13 сентября 2011

У кого-нибудь есть веская техническая причина, почему следующий код нормально работает в браузерах на основе 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>

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

Поведение геккона здесь корректно.Поведение WebKit является ошибкой.Смотри https://bugs.webkit.org/show_bug.cgi?id=65407

1 голос
/ 13 сентября 2011

Сценарий, который вы здесь дали, действительно что-то записывает, а именно "0".document.write() будет добавлять содержимое в документ, только если он вызывается во время загрузки страницы.Если вы позвоните ему после завершения загрузки страницы, он заменит текущий документ содержимым, которое вы ему предоставили (подразумевается вызов document.open()).И с отсутствующим текущим документом все его тайм-ауты также ушли.Таким образом, только один тайм-аут получает шанс на запуск (тот, который записывает 0), он заменяет документ, а все остальные тайм-ауты отменяются.

В Chrome замена текущего документа с помощью document.open() неубить существующие тайм-ауты, они просто работают с новым документом - это может быть ошибкой, по крайней мере, это несовместимо со всеми другими браузерами.Однако я не уверен, что какой-либо из существующих стандартов четко описывает необходимость отмены тайм-аутов в этом случае.

0 голосов
/ 15 сентября 2011

Для дальнейшего использования (и для любого, кто столкнется с этим в будущем), если вы используете document.body.appendChild () вместо document.write, все работает нормально .... что, вероятно, подходит для большинства сценариев.

...