Блокирующий характер document.write
document.write
приостановит все, что браузер работает на странице (включая синтаксический анализ).Настоятельно рекомендуется избегать из-за этого поведения блокировки.Браузер не имеет возможности узнать, что вы собираетесь перетаскивать в текстовый поток HTML в этот момент, или будет ли запись полностью уничтожать все в дереве DOM, поэтому он должен остановиться, пока вы не закончите.
По сути, загрузка скриптов таким образом заставит браузер прекратить анализ HTML.Если ваш сценарий встроен, браузер также выполнит эти сценарии, прежде чем продолжить.Поэтому, как примечание, всегда рекомендуется отложить загрузку сценариев до после анализа вашей страницы и показа пользователю разумного пользовательского интерфейса.
Если ваши сценариизагружаются из отдельных файлов в атрибуте "src", поэтому сценарии могут выполняться не одинаково во всех браузерах.
Потеря оптимизации и предсказуемости скорости браузера
Таким образом, вы теряете многооптимизация производительности, сделанная современными браузерами.Кроме того, когда ваши скрипты выполняются, это может быть непредсказуемо.
Например, некоторые браузеры будут выполнять скрипты сразу после того, как вы их «напишите».В таких случаях вы теряете параллельные загрузки скриптов (потому что браузер не видит второй тег скрипта, пока не загрузит и не выполнит первый).Вы теряете параллельные загрузки сценариев, таблиц стилей и других ресурсов (многие браузеры могут загружать ресурсы, таблицы стилей и сценарии одновременно).
Некоторые браузеры откладывают выполнение сценариев до конца после их завершения.
Браузер не может продолжать анализировать HTML во время работы document.write и, в некоторых случаях, когда выполняемые сценарии выполняются из-за поведения блокировки document.write
, поэтому ваша страница отображается намного медленнее.
Другими словами, ваш сайт стал настолько медленным, насколько он загружался в браузере, которому уже несколько десятилетий, без каких-либо оптимизаций.
Зачем кому-то делать это так?
Причина, по которой вы можете захотеть использовать что-то подобное, обычно заключается в удобстве обслуживания.Например, у вас может быть огромный сайт с тысячами страниц, каждая из которых загружает один и тот же набор скриптов и таблиц стилей.Однако, когда вы добавляете файл сценария, вы не хотите редактировать тысячи файлов HTML, чтобы добавить теги сценария.Это особенно проблематично при загрузке библиотек JavaScript (например, Dojo или jQuery) - вам необходимо изменить каждую HTML-страницу при обновлении до следующей версии.
Проблема в том, что в JavaScript нет @include или@import для вас, чтобы включить другие файлы.
Некоторые решения
Решение этого, вероятно, не путем введения сценариев через document.write
, а с помощью:
- Использование директив @import в таблицах стилей
- Использование языка сценариев сервера (например, PHP) для управления вашей "главной страницей" и создания всех других страниц (однако, если вы не можете использовать это и должны поддерживать много HTMLстраницы по отдельности, это не решение)
- Избегайте
document.write
, но загрузите файлы JavaScript через XHR, а затем eval () их - хотя это может иметь проблемы с безопасностью, хотя - Используйте JavaScriptБиблиотека (например, Dojo), которая имеет функции загрузки модулей, так что вы можете сохранить основной файл JS, который загружает другие файлы.Вы не сможете избежать необходимости обновлять номера версий файла библиотеки, хотя ...