Проверяется ли готовность DOM к перерасходу?

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

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

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

Тем не менее, я решил посмотреть, работает ли это в стандартных браузерах, и, к моему большому удивлению, это работает! В свете чего мой вопрос: различные реализации функций dom / готовности, предоставляемые различными средами 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 не поддерживаются.

3 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам