javascript - DOM 加载被后续脚本阻止

标签 javascript html dom

考虑以下代码:

<head>
 <style>
 .box{
   background-color:red;
   height:150px;    
   width:150px;
 }
 </style>
</head>
<body>
  <div class="box"></div> 

  <script>
  var start = new Date();
  while(true) { 
   var now = new Date(); 
   if (now-start > 10000) 
     break; 
  }
  console.log('main thread finished');
  </script>
</body>

令我惊讶的是 DOM 延迟了 10 秒加载(.box 矩形在 10 秒后出现!)。因为它排在第一位( <div class="box"></div> ) ,为什么要等待后面的脚本?有什么合理的解释吗?

谢谢

最佳答案

"Scripts without async or defer attributes, as well as inline scripts, are fetched and executed immediately, before the browser continues to parse the page." -- from MDN.

因此您的脚本将停止解析 10 秒。更不用说渲染页面了。基本上这样做是为了支持从执行脚本中立即修改 html。例如,如果您的脚本调用 document.write('More html'),它将影响解析。

顺便说一句,执行脚本可以访问已经解析的DOM结构。考虑以下示例。

<div class="box">Affected</div>
<script>
	[].forEach.call(document.querySelectorAll('.box'), function(box){
  	    box.innerText += '... modified';
    });
</script>
<div class="box">Not</div>

关于javascript - DOM 加载被后续脚本阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35500115/

相关文章:

javascript - Mathjax - 当有顶部固定菜单时,为方程的目标 "\eqref"链接添加偏移量

JavaScript 帮助(编写/编辑 HTML)

html - 基于电子应用程序的类似于 Wiki 的表格排序

javascript - 当用户到达页面末尾以加载新内容时,您如何调用 JavaScript (AJAX) 函数?

java - 在java中分割一个包含/的字符串

javascript - 在 JavaScript 中转义字符串

javascript - 如何通过JavaScript爬到特定的父元素?

javascript - 如何从 Kendo View 模型获取 DOM 元素?

javascript - 单页应用程序?登录页面

javascript - addEventListener 无故激活?