Чтобы ответить на ваш ближайший вопрос, поможет документация Script Element для MDN.
Отсрочка:
Скрипты с атрибутом defer предотвратят DOMContentLoadedсобытие от запуска до тех пор, пока скрипт не загрузится и не завершит оценку.
Async:
Это логический атрибут, указывающий, что браузер должен, если возможно, загружать скрипт асинхронно.
Асинхронный сценарий не удерживает событие DOMContentLoaded от запуска.
Существует несколько более эффективных способов заставить контент dom появляться после задержки, который не будет блокировать поток пользовательского интерфейса.как ты делаешь;Это очень плохая практика.
Извлечение из DOMContentLoaded :
Синхронный JavaScript приостанавливает анализ DOM.Если вы хотите, чтобы DOM обрабатывался как можно быстрее после того, как пользователь запросил страницу, вы можете сделать свой JavaScript асинхронным
Обычной практикой будет добавление содержимого DOM после загрузки документа.Вы все еще можете сделать это с таймаутом, но обычно дополнительный контент DOM будет загружен после какого-то другого асинхронного действия , как ответ, полученный от fetch .
Вотпример добавления содержимого dom после задержки:
function wait(ms){
window.setTimeout(function() {
var element = document.createElement("h1")
element.innerText = "Hello World!"
document.body.appendChild(element)
}, ms)
}
wait(5000);
<html>
<head>
<script src="home.js"></script>
</head>
<body>
</body>
</html>