Отложенный от имени MDN говорит:
Этот логический атрибут устанавливается для указания браузеру, что сценарий должен выполняться после анализа документа, но до запуска DOMContentLoaded. Атрибут defer должен использоваться только для внешних скриптов.
На DOMContentLoaded
MDN также говорится:
Событие DOMContentLoaded наступает, когда исходный HTML-документ полностью загружен и проанализирован, без ожидания таблиц стилей...
Поэтому DOMContentLoaded
запускается до того, как CSSOM
будет готов. Это означает, что отложенные сценарии выполняются до того, как CSSOM
будет готов. Но если это так, сценарии не должны иметь возможность получать правильные значения свойств CSS и не должны корректно применять CSS. Но это не так, мы знаем, что все отложенные сценарии работают хорошо.
- Так что документация MDN технически неверна?
- Где я могу найти официальную документацию DOMContentLoaded '? Я искал в https://dom.spec.whatwg.org/, но не смог найти его.
PS: пожалуйста, не говорите, что Google говорит, что CSSOM собирается перед выполнением любого встроенного JavaScript
Но гугл технически неверен. Встроенный JavaScript выполняется до того, как CSSOM будет готов. И из моих тестов я обнаружил, что MDN верен, и если js файлы (как отложенные, так и не отложенные) загружаются до css файлов (или js встроен), то js выполняется до готовности CSSOM. Так что js может некорректно обрабатывать стили. Чтобы избежать этого, нам нужна принудительная перекомпоновка перед всей логикой js.
Таким образом, если пользователь посещает наш веб-сайт со всеми необходимыми js, уже кэшированными и css не кэшированными, ИЛИ js загружается до css, тогда он может увидеть неправильно отображенную страницу. Чтобы избежать этого, мы должны добавить принудительный рефлоу во всех файлах js наших сайтов.