Можно ли манипулировать домом до состояния готовности? - PullRequest
9 голосов
/ 03 августа 2009

Как правило, я управляю прогрессивным улучшением, сохраняя опыт в чистоте, но насколько это безопасно? Есть ли потенциал для состояния гонки, и это не работает?

Представьте себе простой абстрактный сценарий, вы хотите отображать что-то по-другому, если у вас есть поддержка javascript .. Обычно я так и делаю:

<div id="test">original</div>
<script type="text/javascript">
    var t = document.getElementById('test');
    t.innerHTML = 'changed';
</script>

Многие могут утверждать, что вы должны использовать каркас и ждать события domready и вносить в него изменения ... однако существует значительная задержка, когда элемент 'test' будет уже отображен до конца документа и CSS готовы, и domready вызывает .. таким образом вызывая заметное мерцание «оригинал».

Этот код подвержен ошибкам состояния гонки? или я могу гарантировать, что элемент можно обнаружить и изменить, если он существует до сценария?

Заранее спасибо.

Ответы [ 5 ]

5 голосов
/ 03 августа 2009

Можно, но есть проблемы, связанные с этим.

Прежде всего, в IE, если вы пытаетесь манипулировать узлом, который не был закрыт (например, BODY перед его тегом закрытия, который должен быть ниже вашего JS), тогда вы можете столкнуться с ошибкой IE "OPERATION ABORTED", которая приведет к пустому стр. Манипулирование узлом включает добавление узлов, перемещение узлов и т. Д.

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

Если вы пытаетесь улучшить воспринимаемую пользователем производительность (то есть ловкость). Я настоятельно рекомендую вам избегать этого пути и изучать возможности освещения ваших страниц. Вы можете использовать Yahoo YSlow / Google Page Performance Firebug, чтобы помочь вам начать работу.

Скорость страницы Google

YSlow от Yahoo

3 голосов
/ 03 августа 2009

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

1 голос
/ 03 августа 2009

Пока вы изменяете только узлы, которые предшествуют блоку скрипта (т. Е. Закрывающий тег узла предшествует открывающему тегу скрипта), у вас не должно возникнуть никаких проблем.

Если вы хотите убедиться, что операция прошла успешно, оберните код в блок try...catch и вызовите его снова через setTimeout() при ошибке.

0 голосов
/ 22 июня 2012

При преждевременном доступе к DOM возникают исключения в IE 5 и Navigator 4.

0 голосов
/ 03 августа 2009

На Viajeros.com у меня индикатор загрузки работает с 8-9 месяцев, и у меня пока нет проблем. Это выглядит так:

<body>

<script type="text/javascript">
    try {
        document.write('<div id="cargando"><p>Cargando...<\/p><\/div>');
        document.getElementById("cargando").style.display = "block";
    } catch(E) {};
</script>
...