HTML中script标签中的那些属性
myzbx 2024-12-02 22:38 51 浏览
HTML中的<script>标签详解
在HTML中,<script> 标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用 <script> 标签及其属性,可以优化网页的加载性能,提升用户体验。本文将深入探讨 <script> 标签的各种属性,包括 src、type、async、defer、charset 等,并通过示例代码和详尽解释,帮助你全面掌握这些属性的用法和最佳实践。
目录
- <script> 标签概述
- 常用属性详解src 属性type 属性async 属性defer 属性charset 属性其他属性
- <script> 标签的最佳实践
- async 与 defer 的对比分析
- <script> 标签的工作流程 ?
- 示例代码详解
- 总结
- 附录:<script> 标签示意图
<script>标签概述
<script> 标签用于在HTML文档中嵌入或引用JavaScript代码。它可以放置在HTML文档的任意位置,通常位于 <head> 或 <body> 标签内。合理使用 <script> 标签及其属性,可以显著优化网页的加载和执行效率。
基本语法:
<script src="path/to/script.js" type="text/javascript"></script>
说明:
- <script> 标签可以包含内联JavaScript代码,也可以通过 src 属性引用外部JavaScript文件。
- 默认情况下,<script> 标签会阻塞页面的解析,直到脚本下载和执行完成。
常用属性详解
src属性
作用: 指定外部JavaScript文件的URL,通过该属性可以引入外部的JavaScript文件。
示例:
<script src="script.js"></script>
详细解释:
- 当浏览器解析到带有 src 属性的 <script> 标签时,会停止解析HTML,下载并执行指定的JavaScript文件。
- 外部脚本文件有助于代码的模块化和复用,提升代码维护性。
注意事项:
- 相对路径与绝对路径都可以使用。
- 使用外部脚本可以减少HTML文件的大小,加快初始加载速度。
type属性
作用: 指定脚本的内容类型,通常使用 text/javascript 来表示JavaScript代码。
示例:
<script type="text/javascript">
console.log('Hello, World!');
</script>
详细解释:
- type 属性用于告诉浏览器脚本的类型,默认值为 text/javascript,因此在现代浏览器中可以省略。
- 适用于引入非JavaScript脚本,如 TypeScript 或 JSONP,需要明确指定类型。
示例:
<script type="application/json" id="config">
{
"apiKey": "12345",
"theme": "dark"
}
</script>
注意事项:
- 如果不需要指定非默认类型,可以省略 type 属性,简化代码。
async属性 ?
作用: 指示浏览器在下载脚本时是否异步执行脚本。当设置为 async 时,脚本会在下载过程中并行执行,不会阻塞页面的渲染。
示例:
<script src="script.js" async></script>
详细解释:
- 异步加载:脚本下载和页面解析是并行进行的,脚本下载完成后立即执行,可能会在页面解析完成之前执行。
- 适用于独立的脚本,不依赖于其他脚本或页面内容。
优点:
- 提高页面加载速度,减少阻塞。
- 用户体验更佳,因为页面可以更快地显示。
缺点:
- 执行顺序不确定:多个 async 脚本的执行顺序不固定,可能导致依赖问题。
适用场景:
- 广告脚本、分析脚本等独立脚本,不依赖于页面内容或其他脚本。
defer属性 ?
作用: 指示浏览器在解析完整个文档后再执行脚本。当设置为 defer 时,脚本会在文档解析完毕后按照顺序执行,但在 DOMContentLoaded 事件触发之前执行。
示例:
<script src="script.js" defer></script>
详细解释:
- 延迟执行:脚本下载和页面解析是并行进行的,但脚本执行会被延迟到文档解析完成后。
- 保持执行顺序:多个 defer 脚本会按照它们在HTML中的顺序依次执行。
优点:
- 保持脚本执行顺序,适用于依赖关系明确的脚本。
- 不阻塞页面渲染,提高加载性能。
缺点:
- 仅在HTML文档完全解析后执行,可能导致脚本执行稍有延迟。
适用场景:
- 依赖DOM元素的脚本,如页面初始化、交互功能等。
charset属性
作用: 指定脚本的字符编码。
示例:
<script src="script.js" charset="UTF-8"></script>
详细解释:
- 确保浏览器以正确的字符编码解析和执行脚本,避免乱码问题。
- 在引入非ASCII字符的脚本时尤为重要。
注意事项:
- 在现代开发中,建议统一使用 UTF-8 编码,并在HTML文档中通过 <meta charset="UTF-8"> 设置全局编码,通常无需单独为 <script> 标签设置 charset。
其他属性
除了上述主要属性外,<script> 标签还支持其他一些属性:
- crossorigin:用于指定CORS请求的模式,支持 anonymous 和 use-credentials。
- 示例:
- <script src="script.js" crossorigin="anonymous"></script>
- integrity:用于子资源完整性检查,通过哈希值验证脚本的完整性,防止脚本被篡改。
- 示例:
- <script src="script.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxB1ZrZ5u8G8H3M3mZUqG3yN5Jw5bK" crossorigin="anonymous"></script>
- nomodule:用于指定脚本不应在支持ES6模块的浏览器中加载,常用于加载传统脚本与模块脚本的兼容。
- 示例:
- <script src="legacy-script.js" nomodule></script>
<script>标签的最佳实践
为了优化网页性能和提升用户体验,以下是使用 <script> 标签的一些最佳实践:
- 将 <script> 标签放置在页面底部:
- 将 <script> 标签放在 <body> 结束标签之前,可以避免阻塞页面的渲染,提升首屏加载速度。
- 示例:
- <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>最佳实践示例</title> </head> <body> <h1>欢迎访问</h1> <!-- 页面内容 --> <!-- 将脚本放在这里 --> <script src="script.js"></script> </body> </html>
- 使用 async 和 defer 属性:
- 根据脚本的依赖关系和执行时机,合理选择 async 或 defer 属性,优化脚本的加载和执行。
- 避免使用全局变量:
- 尽量减少全局命名空间的污染,使用模块化开发(如ES6模块)来管理变量和函数,提升代码的可维护性和可复用性。
- 利用子资源完整性(SRI):
- 使用 integrity 属性确保引入的外部脚本未被篡改,增强安全性。
- 压缩和合并脚本文件:
- 通过压缩和合并脚本文件,减少HTTP请求次数和文件大小,提升加载速度。
- 按需加载脚本:
- 根据用户的操作或页面的需要,动态加载脚本,避免一次性加载所有脚本,提升初始加载性能。
async与defer的对比分析
async 和 defer 是 <script> 标签中用于控制脚本加载和执行行为的重要属性。它们都可以在一定程度上优化脚本的加载性能,但适用场景和行为有所不同。
特性 | async | defer ? |
加载方式 | 异步加载,下载与页面解析并行 | 异步加载,下载与页面解析并行 |
执行时机 | 下载完成后立即执行,可能在页面解析前执行 | 页面解析完成后,DOMContentLoaded 事件前执行 |
执行顺序 | 不保证顺序,取决于脚本下载完成的先后 | 按照HTML中出现的顺序执行 |
适用场景 | 独立脚本,不依赖其他脚本或页面内容 | 依赖DOM元素或其他脚本,需保持执行顺序 |
阻塞页面渲染 | 不阻塞 | 不阻塞 |
浏览器支持 | 大部分现代浏览器支持 | 大部分现代浏览器支持 |
详细对比
- 加载和执行顺序:
- async:脚本下载完成后立即执行,不保证执行顺序。如果有多个 async 脚本,谁先下载完就先执行,可能导致依赖问题。
- defer:所有 defer 脚本按照在HTML中出现的顺序执行,即使某个脚本下载较慢,也会等待其他脚本执行完毕。
- 适用场景:
- async 适用于那些独立的脚本,如广告代码、统计代码等,不依赖于页面内容或其他脚本。
- defer 适用于那些需要操作DOM或依赖其他脚本的脚本,确保脚本在页面完全解析后执行。
图示对比
HTML解析开始
遇到
遇到
异步下载脚本
脚本下载完成
async脚本立即执行
defer脚本等待页面解析完成
继续HTML解析
页面解析完成后按顺序执行defer脚本
DOMContentLoaded事件触发
解释:
- 当浏览器解析到带有 async 属性的 <script> 标签时,会异步下载脚本,下载完成后立即执行,不影响后续的HTML解析。
- 当浏览器解析到带有 defer 属性的 <script> 标签时,同样异步下载脚本,但执行会延迟到HTML文档解析完毕后,按顺序执行所有 defer 脚本,然后触发 DOMContentLoaded 事件。
<script>标签的工作流程 ?
理解 <script> 标签的工作流程,有助于优化网页的加载性能和用户体验。以下是 <script> 标签在浏览器中的加载和执行流程:
- HTML解析开始
- 浏览器开始解析HTML文档,从上到下逐行解析。
- 遇到 <script> 标签
- 当解析器遇到 <script> 标签时,根据属性决定加载和执行方式。
- 根据属性决定行为 ??
- 无 async 和 defer 属性:浏览器会立即停止HTML解析,下载并执行脚本,执行完成后继续解析HTML。
- async 属性:浏览器会异步下载脚本,下载完成后立即执行,可能在HTML解析完成前执行。
- defer 属性:浏览器会异步下载脚本,等待HTML解析完成后按顺序执行脚本。
- 脚本执行
- 脚本执行可能会影响页面的DOM操作和其他脚本的执行。
- 继续HTML解析 ?♂?
- 脚本执行完成后,浏览器继续解析HTML文档,直至完成。
- 触发事件
- 完成HTML解析后,触发 DOMContentLoaded 事件,表示文档已完全加载和解析。
工作流程示意图
无 async & defer
async
defer
HTML解析开始
遇到
立即下载并执行脚本
异步下载脚本,下载完成后立即执行
异步下载脚本,等待HTML解析完成后执行
继续HTML解析
HTML解析完成后执行脚本
触发DOMContentLoaded事件
解释:
- <script> 标签的属性决定了脚本的加载和执行方式,影响页面解析的顺序和性能。
示例代码详解
以下通过几个示例,详细说明 <script> 标签及其属性的使用方法和效果。
示例 1:引入外部脚本
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>外部脚本示例</title>
<script src="external-script.js"></script>
</head>
<body>
<h1>欢迎访问</h1>
</body>
</html>
解释:
- 在 <head> 部分引入了一个外部脚本 external-script.js。
- 默认情况下,浏览器会在解析到 <script> 标签时,暂停HTML解析,下载并执行脚本,然后继续解析HTML。
示例 2:使用async属性
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Async脚本示例</title>
<script src="async-script.js" async></script>
</head>
<body>
<h1>欢迎访问</h1>
</body>
</html>
解释:
- async 属性指示浏览器异步下载脚本 async-script.js。
- 脚本下载完成后立即执行,不会阻塞HTML解析。
- 适用于独立脚本,不依赖其他脚本或DOM元素。
示例 3:使用defer属性
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Defer脚本示例</title>
<script src="defer-script.js" defer></script>
</head>
<body>
<h1>欢迎访问</h1>
</body>
</html>
解释:
- defer 属性指示浏览器异步下载脚本 defer-script.js,并在HTML解析完成后按顺序执行。
- 脚本执行不会阻塞HTML解析,适用于依赖DOM元素或其他脚本的情况。
示例 4:内联脚本与type属性
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>内联脚本示例</title>
<script type="text/javascript">
console.log('这是一个内联脚本');
</script>
</head>
<body>
<h1>欢迎访问</h1>
</body>
</html>
解释:
- 在 <head> 部分使用内联脚本,指定了 type="text/javascript"。
- 在现代浏览器中,type 属性可以省略,因为默认值为 text/javascript。
示例 5:使用charset属性
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Charset脚本示例</title>
<script src="script-with-charset.js" charset="UTF-8"></script>
</head>
<body>
<h1>欢迎访问</h1>
</body>
</html>
解释:
- 指定脚本文件 script-with-charset.js 的字符编码为 UTF-8。
- 确保脚本内容以正确的编码方式解析,避免乱码。
示例 6:使用crossorigin和integrity属性
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>SRI示例</title>
<script src="https://example.com/script.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxB1ZrZ5u8G8H3M3mZUqG3yN5Jw5bK"
crossorigin="anonymous"></script>
</head>
<body>
<h1>欢迎访问</h1>
</body>
</html>
解释:
- 子资源完整性(SRI):integrity 属性提供了脚本文件的哈希值,浏览器会在下载脚本后验证其完整性,防止脚本被篡改。
- CORS:crossorigin="anonymous" 属性指定CORS请求模式,确保脚本请求不携带用户凭证(如Cookies),增强安全性。
总结
<script> 标签在HTML文档中扮演着至关重要的角色,通过合理配置其属性,可以显著优化网页的加载性能和用户体验。以下是关键要点:
- src 属性:用于引入外部脚本,促进代码复用和模块化。
- type 属性:指定脚本类型,现代浏览器默认 text/javascript,可省略。
- async 属性:适用于独立脚本,异步加载和执行,不阻塞页面渲染。
- defer 属性:适用于依赖DOM或其他脚本的脚本,延迟执行,保持执行顺序。
- charset 属性:指定脚本字符编码,确保正确解析脚本内容。
- 其他属性:如 crossorigin 和 integrity,增强脚本的安全性和跨域能力。
通过掌握这些属性的用法和最佳实践,开发者可以编写出高效、稳定且安全的前端代码,提升整体应用性能和用户体验。
以下流程图展示了不同属性对 <script> 标签加载和执行流程的影响:
解释:
- 当浏览器遇到不同属性的 <script> 标签时,加载和执行脚本的行为会有所不同。
- 无 async 和 defer:脚本会立即下载并执行,阻塞HTML解析。
- async:脚本异步下载,下载完成后立即执行,不保证执行顺序。
- defer:脚本异步下载,等待HTML解析完成后按顺序执行。
通过本文的详尽解析,相信你已经对HTML中的 <script> 标签及其属性有了全面的了解。合理运用这些属性,可以有效优化网页的加载性能,提升用户体验,同时确保脚本的安全性和稳定性。在实际开发中,根据具体需求和场景,选择合适的 <script> 标签属性,是编写高效、可靠前端代码的关键一步。
相关推荐
- 如何设计一个优秀的电子商务产品详情页
-
加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...
- 怎么在JS中使用Ajax进行异步请求?
-
大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...
- 中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革
-
前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...
- 前端监控 SDK 开发分享_前端监控系统 开源
-
一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...
- Ajax 会被 fetch 取代吗?Axios 怎么办?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...
- 前端面试题《AJAX》_前端面试ajax考点汇总
-
1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...
- Ajax 详细介绍_ajax
-
1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...
- 6款可替代dreamweaver的工具_替代powerdesigner的工具
-
dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...
- 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
-
接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...
- 福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光
-
时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...
- 2021年超详细的java学习路线总结—纯干货分享
-
本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...
- 不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!
-
Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...
- 2025 年 Python 爬虫四大前沿技术:从异步到 AI
-
作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...
- 最贱超级英雄《死侍》来了!_死侍超燃
-
死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...
- 停止javascript的ajax请求,取消axios请求,取消reactfetch请求
-
一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)
