DOM 加载 和 Javascript 的加载与执行顺序

DOM 简介

DOM 是 Document Object Model(文档对象模型)的缩写。HTML 的构成就是DOM,网页就是一个文档,是一个有结构的文档。HTML DOM 定义了访问和操作 HTML 文档的标准方法。DOM 将 HTML 文档表达为树结构。HTML DOM 树如下:

HTML DOM Node Tree

每个元素都可与看做一个对象,每个对象都叫做一个节点(node)

浏览器的渲染步骤:

1、解析HTML

2、加载外部脚本和样式表

3、脚本在文档内解析并执行

4、构造HTML DOM模型

5、加载图片以及外部内容

6、网页加载完毕

因此,外部 js 会在 DOM 构造之前执行,那么显然外部 js 也无法访问 DOM 文档模型。所以一般把可执行的脚本放在页面初始化时间处理函数中。这样的话就能确保文档加载完毕再执行脚本。

JS 加载与执行顺序

对于一个HTML文档,浏览器的解析顺序为:按照文档流,从上到下逐步解析页面的结构。JavaScript代码作为通过标签嵌入或引入的脚本,也HTML文档的组成部分。因此,JavaScript代码在装载时的执行顺序也是根据脚本标签<script>的出现顺序来确定的。

但是,浏览器加载JavaScript时有个特点,那就是载入之后立即就会执行(先编译后执行),因为JavaScript可能会影响DOM树的结构,所以浏览器在执行完后才能继续加载下面的HTML内容。也就是说,浏览器下载并执行JavaScript的过程会阻塞DOM树的继续建立。所以,引入的多个js文件,会按顺序分开执行。同样的,对于不同<script>标签嵌入的JavaScript代码,也会分开执行。同一组<script>标签包括的代码就是一个代码块。后引入的JavaScript文件可以调用先引入的JavaScript文件的资源,下面的代码块可以访问上面代码块的资源,反之则不行。

由于JavaScript通常需要操作DOM,所以,一般把JavaScript放在</body>前或者文档结尾处引入。若需要在<head>中引入,可以通过修改window.onload或者document.ready事件,强制等到DOM加载完成后再执行相关函数。

谈谈 <script> 标签以及其加载顺序问题,包含 defer & async

 

参考文档

  1. JS之DOM是什么
  2. dom加载和js执行的先后顺序
  3. Javascript的加载与执行顺序
  4. 谈谈 <script> 标签以及其加载顺序问题,包含 defer & async

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,JSP DOM元素的事件失效可能与层级或加载顺序有关。 当页面中有多个DOM元素时,它们的事件可能会相互影响,导致事件失效。例如,如果一个元素被另一个元素覆盖,那么它的事件可能会被覆盖,从而导致事件失效。另外,如果元素的层级结构发生变化,也可能导致事件失效。 此外,如果事件绑定的代码在DOM元素加载之前运行,也可能导致事件失效。例如,如果在文档加载之前绑定了一个事件,而该事件绑定的元素在文档加载之后才被创建,那么事件就无法触发。 解决方法: 1. 确保元素层级结构没有被其他元素覆盖。 2. 确保元素在绑定事件之前已被创建并加载。 3. 使用事件委托来绑定事件,这样可以避免元素层级结构改变或者动态创建元素的问题。 以下是一个使用事件委托来绑定事件的代码示例: HTML: ```html <div id="myDiv"> <button>点击我</button> </div> ``` JavaScript: ```javascript document.addEventListener("DOMContentLoaded", function() { var myDiv = document.getElementById("myDiv"); myDiv.addEventListener("click", function(event) { if (event.target.tagName === "BUTTON") { alert("点击事件触发"); } }); }); ``` 在上述代码中,使用了事件委托来绑定click事件,这样可以避免元素层级结构改变或者动态创建元素的问题。事件委托会将事件绑定到父元素上,然后通过event.target属性来判断实际触发事件的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值