Проверяет ли готовность переполнения DOM?

Я разрабатываю платформу для разработки настольных приложений с веб-технологиями. В ходе этого я пытался получить некоторые документы/готовые функции, работающие с браузером, я буду интегрироваться в платформу. Вот почему я ранее задавал этот вопрос здесь на SO: javascript-framework-that-primarily-provides-just-document-onready-functionality

Однако я не смог выбрать свой браузер (shush, его секрет;), чтобы успешно использовать функциональность, предложенную одним и единственным ответом на вышеизложенное. Поэтому, когда вы пытаетесь выяснить, что может работать, я наткнулся на следующее.

Код ниже имеет тот же эффект в этом браузере, который я использую, просто выполняя функцию после таймаута 1 миллисекунды: я могу писать в DOM, пока загружается большое изображение. Это может быть не окончательное решение для меня, я могу написать что-то конкретное, как функция DOM реализована механизмом Javascript для этого браузера.

Тем не менее, я решил посмотреть, работает ли это в стандартных браузерах, и к моему удивлению, так оно и есть! В свете этого, мой вопрос: являются ли различные реализации функций dom/ready, предоставляемые различными структурами JavaScript, просто переполняют?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script>
setTimeout(function() {
    var txtNode = document.createTextNode("ready_yet?");
    var ready_yet_el = document.getElementById("ready_yet");
    ready_yet_el.appendChild(txtNode);
},1);
</script>
</head>

<body>
<div id="ready_yet"></div>
<img src="http://www.ryanmorr.com/tests/ondomready/pic.jpg" />
</body>

</html>

ИЗМЕНИТЬ/ДАЛЬНЕЙШИЕ МЫСЛИ На странице, связанной с ответом на мой предыдущий связанный вопрос, говорится: "Для Firefox и Opera простая проверка типа события определяет, DOMContentLoaded. Safari и IE будут проверять состояние готовности документов... Наконец, если все остальное не удастся, событие onload выведет заднюю часть." Возможно, setInterval, похожий на мой setTimeout выше, может быть предпоследним курсом действий, прежде чем полагаться на onload как последнее средство? В любом случае с выбранным встраиваемым браузером не поддерживается ни событие DOMContentLoaded, ни document.readyState.

Ответ 1

Ваша догадка хорошая и обоснованная ИМО. Но кто-то уже ударил вас на удар. Короткий ответ заключается в том, что setTimeout не является эффективной реализацией обнаружения готовности DOM во всех случаях. Это может быть хорошо для вашего браузера, представляющего интерес, но IE не работает в некоторых ситуациях.

Вам может быть интересно узнать, что в собственной ASP.NET AJAX Framework используется трюк setTimeout для обнаружения готовности DOM. И удивление, удивление: он также не работает в некоторых случаях использования.

Короче говоря, проблема, похоже, заключается в IE с медленными сценариями загрузки, из-за большого размера файла (например, ~ 500K) или задержки сети/сервера.

Ответ 2

Нет, потому что, когда ошибки DOM "неготовности" проявляются, они делают это в невероятно необычном и трудном для прогнозирования и отслеживания способах - каждый из которых (конечно) уникален для браузера, в котором он происходит.

Намного проще просто избежать этих проблем и знать, что вы всегда будете иметь дело с готовым DOM.

В качестве примера, некоторое время назад у меня была ошибка DOM, не готовая в каждом любимом браузере, чем проявилась, работая совершенно в 99% случаев, но умерла с ошибками, если в содержимом страницы был элемент img с атрибутом src в нем И если у содержимого также был элемент ul с любым количеством li внутри внутри..., он не ошибся, если какая-либо из этих вещей была неверной.

Мне легко сказать сейчас "о, это была проблема DOM", но в то время... нет, не так просто.

Ответ 3

Просто, нет. Кто-то с более медленным подключением и несколькими загружаемыми файлами не оценит их браузер, пытающийся запускать скрипты на элементах, которые еще не существуют.