2009-09-04 2 views
2

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

Однако я не смог выбрать свой браузер (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> 

EDIT/ДАЛЕЕ МЫСЛИ На the page linked to by the answer to my previous related question он заявляет, что «для Firefox и Opera простой проверки типа события определит, будет ли это DOMContentLoaded. Safari и IE будут проверять на состояние готовности документа .... Наконец, в если все остальное не удастся, событие onload выведет тыл ». Возможно, setInterval, похожий на мой setTimeout выше, может быть предпоследним курсом действий, прежде чем полагаться на onload как последнее средство? В любом случае, с выбранным встраиваемым браузером, не поддерживается ни событие DOMContentLoaded, ни document.readyState.

+0

Ваш пример работает, потому что (как вы знаете) функция тайм-аута вызывается после разбора div, гораздо менее хакерская версия должна заключаться в том, чтобы запустить скрипт (без таймаута) после закрытия div, а не но все браузеры будут иметь доступ к dom-узлу до того, как он продолжит анализировать узлы xml/html (или, по крайней мере, доступный до того, как следующий элемент dom будет полностью прочитан и выполнен). – meandmycode

+3

Я думаю, что ответы, которые вы получили в первые 3 часа, только читали название вопроса. Все говорят: «Нет, неплохо запускать скрипты перед тем, как DOM готов». –

+0

Я ожидал, что вас будут решать еще более жестко;) Но чтобы получить подтверждение моих инстинктов, даже если ссылки, показывающие, что другие «избили меня до удара», это то, что я искал, и позволяет мне продолжать двигаться вниз этот путь с определенным уровнем доверия; next Я увижу, будут ли рамки CSS, такие как Peppy или Sizzle, работать с этой конкретной реализацией браузера. –

ответ

3

Ваша догадка хорошая и обоснованная ИМО. Но someone has beat you to the punch already. Короткий ответ заключается в том, что setTimeout является не рабочей реализацией обнаружения готовности DOM во всех случаях. Возможно, ваш браузер интересен, но IE не работает в некоторых ситуациях.

Возможно, вам будет интересно узнать, что собственная инфраструктура ASP.NET AJAX от Microsoft использует трюк setTimeout для обнаружения готовности DOM. И удивление, удивление: it fails in certain use cases as well.

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

3

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

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

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

Мне легко сказать «О, это была проблема DOM», но в то время ... нет, не так просто.

0

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