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