Неожиданный JavaScript-бесконечный цикл при проверке тега body
Я собирался как можно скорее сценарий, который проверяет, загружен ли тег body, но это приводит к зависанию всей страницы.
Вот:
while (!document.body)
if (document.body) console.log('loaded');
Это, конечно, не будет работать должным образом во всех случаях, но я озадачен, почему это превращается в бесконечный цикл и останавливает страницу.
2 ответа
Javascript является однопоточным. Пока этот цикл работает, больше ничего не запускается, поэтому тело не может быть загружено. В теле цикла нет ничего, что изменило бы значение document.body
, так что если он не установлен при запуске, он никогда не будет.
Этот код выполняется синхронно, поэтому, если document.body сначала не определен, он не позволяет браузеру заполнять его между итерациями. использование setTimeout
или же setImmediate
чтобы сделать это, или, что еще лучше, прослушайте событие DOMContentLoaded или используйте jQuery's $(document).ready()
,
(function ready() {
if (document.body) console.log('loaded');
else setTimeout(ready, 500); // delay 1/2 second
})();