【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响

这篇具有很好参考价值的文章主要介绍了【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🐱 个人主页:不叫猫先生,公众号:前端舵手
🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫优质专栏:vue3+vite+typeScript从入门到实践
📢 资料领取:前端进阶资料可以找我免费领取
🔥 摸鱼学习交流:我们的宗旨是在「工作中摸鱼,摸鱼中进步」,期待大佬一起来摸鱼(文末有我wx或者私信)

【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响,前端面试专栏,前端,link,javaScript,原力计划

script脚本对DOM的影响

当HTML解析器解析HTML,如果遇到script标签,普通的script标签会暂停对DOM解析渲染,因为该脚本可能会修改DOM。
这里有三种情况:普通脚步、defer、async。 defer、async只对外联script脚本文件有效, 内联script脚本设置无效。

问: script标签总是会触发Paint吗?

回答:
script标签时,会触发一次Paint,浏览器会将script标签之前的元素渲染出来。但也并不是所有的script标签都会触发Paint。

  • head中的script标签是不会触发的,毕竟此时body还没有解析,触发Paint也看不到任何内容。
  • inline(内联:将代码直接嵌入到HTML文档的元素中,而不是通过外部文件引用的方式) 的 script也不会触发Paint。

因此,建议script标签放在body结束标签之前,这样不会不会阻塞页面整体内容的DOM解析和渲染。

1、普通脚本

  • 文档解析过程中,如果遇到普通脚本就会直接下载脚本,下载会阻止DOM的解析渲染
  • 如果是多个脚本,则并行下载,不论哪个先下载完,都要按HTML中的顺序执行,即使后面的比前面的先下载完,也要等前面的执行完才能执行
  • 执行脚本会阻止页面的解析渲染
  • 执行完脚本继续页面的解析渲染
  • 执行完script脚本和页面解析渲染完, 才会依此触发DOMContentLoadedloaded事件

2、defer,

  • 文档执行时,当遇到有defer属性的script标签时,则脚本的下载则在后台运行,下载不会阻止DOM解析渲染
  • 多个defer属性的script标签,则在后台并行下载
  • 脚本的执行需要等到页面解析完成才能进行
  • 当页面解析渲染完毕后, 会等到所有的defer脚本下载完毕并按照顺序执行,执行完毕后会触发DOMContentLoaded事件。
  • 如果defer脚本下载较慢,在下载完前, 页面解析渲染已完毕; 等所有的defer脚本下载完后, 才按照顺序执行defer脚本。执行完毕后会触发DOMContentLoaded事件。

3、async

  • 文档解析时,当遇到有async属性的script标签时,则脚本的下载则在后台运行,下载不会阻止DOM解析渲染
  • 多个async属性的script标签,则在后台同时并行下载
  • async脚本的执行会阻止页面的解析渲染
  • 遵循先下载完先执行,执行不按照HTML页面的中脚本顺序
  • async脚本的下载和执行不计入DOMContentLoaded事件统计。

link标签对DOM的影响

1、link标签不会阻塞DOM解析但会阻塞DOM渲染

link标签并不阻塞DOM的解析,但会阻塞DOM的渲染。浏览器并行解析生成DOM Tree 和 CSSOM Tree,当两者都解析完毕,才会生成render tree,页面才会渲染。所以应尽量减小引入样式文件的大小,提高首屏展示速度。
注意:案例中CSS资源为外网资源,所以并不会直接就加载出来,可以在页面看到渲染的过程,当然可以直接开vpn,css资源几乎秒加载,页面也秒渲染


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<script>
		setTimeout(() => {
			console.log(document.getElementById('num'));
		}, 0);
		document.addEventListener('DOMContentLoaded', () => {
			console.log('dom parse done');
		})
	</script>
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.css">
</head>
<body>
	<div id="num">
		i am content a.
	</div>
	<div>
		i am content b.
	</div>
</body>
</body>
</html>

初始加载页面的时候,控制台打印出来两条数据,但是页面并没渲染,此时CSS资源正在加载中
【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响,前端面试专栏,前端,link,javaScript,原力计划
之后CSS资源一直加载,直到加载失败,页面才渲染完成,说明,link标签加载CSS资源时阻止了页面渲染
【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响,前端面试专栏,前端,link,javaScript,原力计划

2、link标签会阻塞JS执行

JS运行时,有可能会请求样式信息,如果此时还没有加载和解析样式,js就有可能会得到错误的回复,产生很多问题。因此浏览器在link标签的加载和解析过程中,会禁止脚本运行。

案例一

<!DOCTYPE html>
<html lang="en">
<head>
	<tilte>title</title>
		<script>
			console.log(Date.now());
		</script>
		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.css">
		<script>
			console.log(Date.now());
		</script>
</head>
<body>
	<div id="num">
		i am content a.
	</div>
	<div>
		i am content b.
	</div>
</body>
</body>
</html>

初始页面加载,此时CSS资源正在加载中,所以body中的内容还没渲染出来,并且link标签下的script中的console也还未执行,所以说,link标签加载CSS资源时也阻塞的JS的执行
【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响,前端面试专栏,前端,link,javaScript,原力计划
之后,因为CSS资源加载失败,所以开始执行下面的script,并且打印出console内容-当前时间。
【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响,前端面试专栏,前端,link,javaScript,原力计划

案例二

<html>
<head>
    <tilte>title</title>
    <!--大文件,加载时间长-->
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.css">
</head>
<body>
    <div>
        i am content a.
    </div>
    <!--js小文件,加载时间短-->
    <script src='test.js'></script>
    <div>
        i am content b.
    </div>
</body>
</html>

页面初始加载时,CSS资源一直在加载,body中的script一直没有加载出来,可以看到控制台并没有打印任何东西。所以说link标签会阻止JS执行

【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响,前端面试专栏,前端,link,javaScript,原力计划
当CSS资源加载完成或者加载失败后就执行了script脚本,可以看到控制台打印出来js执行完毕,且此时页面已经渲染出来
【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响,前端面试专栏,前端,link,javaScript,原力计划文章来源地址https://www.toymoban.com/news/detail-524971.html

3、link和@import的区别

  • 用法:
<link href="a.css" rel="stylesheet" type="text/css">

<style>
@import url('b.css');
</style>
  • 功能上:link功能较多,可以定义 RSS、Rel 等,而@import只能用于加载 css;
  • 加载顺序:
    • link标签让浏览器知道这是个样式表文件,html的解析和渲染不会暂停,css文件的加载是同时进行的,这不同于在style标签里面的内置样式;@import添加的样式是在页面载入之后再加载,这可能会导致页面因重新渲染而闪烁。
    • @import会影响浏览器的并行下载,使得页面在加载时增加额外的延迟,增添了额外的往返耗时,而且多个@import可能会导致下载顺序紊乱。比如:
      一个css文件index.css包含了以下内容:@import url(“reset.css”),那么浏览器就必须先把index.css下载、解析和执行后,才下载、解析和执行第二个文件reset.css
  • DOM操作:link支持DOM操作改变样式,由于 DOM 方法是基于文档的,无法使用@import的方式插入样式
  • 兼容性:@import是 CSS2.1提出的语法,老版本的浏览器可能不支持;link标签作为 HTML 元素,不存在兼容性问题。

到了这里,关于【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端面试:【浏览器与渲染引擎】Web APIs - DOM、XHR、Fetch、Canvas

    嗨,亲爱的读者!当我们在浏览器中浏览网页时,我们常常会与各种Web API打交道。这些API允许我们与网页内容、服务器资源和图形进行交互。本文将深入探讨一些常见的Web API,包括DOM、XHR、Fetch和Canvas,以帮助你了解它们的用途和如何使用它们。 1. DOM(文档对象模型): 用

    2024年02月11日
    浏览(33)
  • Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

    Vue3前端开发,借助Ref来获取组件内dom对象,借助defineExpose编译宏可以获取到子组件的属性和方法。 app入口文件,我们作为父组件,在里面调用了自定义组件TestCom.vue。 先做了一个测试,借助于ref来访问自身的dom对象。如图所示是可以拿到的。 ref又称谓钩子函数,在vue2版本中

    2024年01月22日
    浏览(47)
  • 前端面试:【HTML】语义化标签、表单、媒体元素

    HTML(超文本标记语言)是构建网页内容的基础,它通过一系列标签来描述页面的结构和内容。在这篇文章中,我们将探讨HTML的基础知识,包括语义化标签、表单和媒体元素。 语义化标签:赋予内容更多意义 语义化标签是指在编写HTML代码时,使用具有实际含义的标签,以便

    2024年02月12日
    浏览(47)
  • 开发安全之:Cross-Site Scripting: DOM

    Overview 方法 setDestination() 向 Web 浏览器发送非法数据,从而导致浏览器执行恶意代码。 Details Cross-Site Scripting (XSS) 漏洞在以下情况下发生: 1. 数据通过一个不可信赖的数据源进入 Web 应用程序。对于基于 DOM 的 XSS,将从 URL 参数或浏览器中的其他值读取数据,并使用客户端代码

    2024年01月25日
    浏览(27)
  • HTML <script> 标签

    在 HTML 页面中插入一段 JavaScript: (在本页底部可以找到更多实例) script 标签用于定义客户端脚本,比如 JavaScript。 script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件。 必需的 type 属性规定脚本的 MIME 类型。 JavaScript 的常见应用时图像操作、表单验证以

    2024年02月14日
    浏览(56)
  • 【JavaScript】script 标签的使用

    script 标签之间共享顶层对象。 但是全局变量作用域的提升机制在这些边界中不适用: 但是下面的两段代码则没问题: 如果 script 中的代码(无论是内联代码还是外部代码)发生错误,它会像独立的 JS 程序那样停止,但是后续的 script 中的代码依然会接着运行,不会受影响。

    2024年02月06日
    浏览(26)
  • HTML中script 标签中的那些属性

    在HTML中, script 标签用于嵌入或引用JavaScript代码。 在 script 标签中,有两个属性可以用来控制脚本的加载和执行方式: async 和 defer 。 当然这也是常见的一道面试题, async   和  defer 的作用和区别。 async 和 defer 属性都可以用于异步加载脚本,从而避免了在加载脚本时阻塞浏

    2024年02月01日
    浏览(40)
  • script标签4种的四种用法,你知道几种?

    本文为HTML标准解读系列文章,其他文章详见这里。 在一个HTML页面中执行js脚本有很多方式,包括但不限于以下几种: 使用script标签执行脚本; 使用 javascript:URL 的导航; 使用DOM上的事件监听机制; 使用svg相关技术中的脚本能力; 在这些方式中,使用最多的无疑是第一种。

    2024年02月05日
    浏览(25)
  • 前端面试题---HTTP/HTTPS以及XSS攻击

    HTTP(Hypertext Transfer Protocol)是一种用于在网络上传输超文本的协议。它基于客户端-服务器模型,客户端发起请求,服务器响应请求并返回相应的数据。以下是 HTTP 的基本工作原理: 1. 客户端发起请求:客户端(通常是浏览器)向服务器发送 HTTP 请求。请求包括请求行、请求

    2024年02月09日
    浏览(38)
  • vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然后使用插件将生成的图片放入pdf中,再实现pdf文件的下载 涉及框架以及插件:vue、echar

    2024年01月25日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包