检查body标签时出现意外的JavaScript无限循环

时间:2014-06-07 17:32:04

标签: javascript infinite-loop preloader document-body

我打算使用ASAP脚本检查是否加载了body标签,但它会导致整个页面冻结。

这是:

while (!document.body)
    if (document.body) console.log('loaded');

这当然在所有情况下都无法正常工作,但我很困惑为什么这会成为无限循环并冻结页面。

2 个答案:

答案 0 :(得分:7)

Javascript是单线程的。当该循环正在运行时,没有其他任何东西运行,因此无法加载正文。循环体中没有任何东西可以改变document.body的值,所以如果它在你开始时没有设置,它就永远不会。

答案 1 :(得分:2)

此代码同步执行,因此如果document.body最初未定义,则它不允许浏览器在迭代之间填充它。使用setTimeoutsetImmediate来执行此操作,或者更好的是,听取DOMContentLoaded事件或使用jQuery' $(document).ready()

(function ready() {
  if (document.body) console.log('loaded');
  else setTimeout(ready, 500); // delay 1/2 second
})();