Я безуспешно пытался сформулировать этот вопрос в Google et al.Даже не уверен, что название этого вопроса отражает нюанс проблемы.Я постараюсь объяснить, а затем показать эксперимент.Я надеюсь, что кто-то (ы) сможет указать на некоторые объяснения того, что происходит.
Учитывая:
- до окончания ТЕЛА, у вас естьскрипт (A), который программно вставляет элемент скрипта (используя мой предпочтительный метод document.createElement) в документ, который ссылается на remote-script (B)
- remote-script B, выполняет document.write любогоcontent (например, «hello, world»)
- до конца BODY и сразу после сценария A у вас есть сценарий (C), который ссылается на удаленный сценарий, загрузка которого занимает некоторое время (например, 1 с)
Что произойдет, если A выполнит, вставит B в документ и начнет загружать ресурс.Пока B загружает, C будет выполняться и ждать из-за задержки.Пока C ожидает, B загружается и выполняется;мы еще не нажали DOMContentLoaded;document.readyState все еще "загружается".Document.write из B игнорируется;сожрал, как будто мы пост-DOMContentLoaded.C завершает загрузку и выполняет.
Эксперимент:
Я использую Cuzillion для созданиязадержка.Если вы посмотрите на изображение водопада, вы также увидите сообщение console.log, в котором показано, что все выполняется до того, как DOM выполнит «интерактивный» readyState (т. Е. DOMContentLoaded).
То, что я ожидаю в качестве вывода вбраузер:
TOP
hello, world
hello again, world
BOTTOM
В результате я получаю:
TOP
hello, world
BOTTOM
В моем эксперименте вы заметите, что я добавил еще один скрипт между тем, что мы определяем как A иC. Назовите это, я полагаю;это показывает, что если вы динамически добавляете сценарий с текстом (т.е. не удаленный сценарий), который содержит document.write, doc.write в A 'будет работать.
Кроме того, dummy.js и CSSфайлы приходят из JSFiddle.Они не преступники;Я могу воссоздать эту проблему в любом месте.
Вещи, которые я знаю:
- , если вы замените C на IMG, проблема не будет
- , если вы замените C наIFRAME, нет проблемы
- , если вы переместите A после C, нет проблемы
Сейчас:
Возможно, естьсовершенно веская причина для этого.Должно быть, так как все браузеры, в которых я тестировал, ведут себя примерно одинаково.Что я хотел бы знать, почему?Любые объяснения, подсказки и / или указатели приветствуются.Даже намеки, как "Это в спецификации, тупой :)" У меня толстая кожа;Я могу справиться с этим.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я ненавижу document.write.Я не намерен поддерживать или поддерживать его использование каким-либо образом.Однако, учитывая характер моей работы, я должен сейчас обойти это, и эта странность возникла на мне.Таким образом, я хотел бы избегать комментариев вдоль линии «Вы не должны использовать document.write», потому что это, я уже верю в:)