首页 前端开发 Web前端入门第 54 问:JavaScript 3 种书写位置及 script 标签的正确存放位置

Web前端入门第 54 问:JavaScript 3 种书写位置及 script 标签的正确存放位置

JS 的代码并没有强制规定放在 HTML 中的某个位置,如果您有使用过开发者工具查看过网页源码,那么您会看到很多 JS 代码都以 .js 文件的形式存放,并且放在了 HTML 文件最后,也就是 </body> 结束标签之前。

但如果仔细观察,在 <head> 标签中,也会找到很多 script 标签引入的 JS 代码。

那么您是否好奇过他们都有哪些区别??

3 种书写位置
与 CSS 一样,JS 的脚本算起来也有三种书写方式,分别为行间 JS 代码、内联脚本、外部脚本。

1、事件处理

直接在 HTML 元素的事件属性中写代码,此方式一般多用于编写 demo 测试程序,正常的项目开发不推荐这种写法。

原因:onclick 中的方法名必须全局声明,导致污染全局变量,并且混合了 HTML 结构和 JS 事件行为代码,不利于项目维护。

<p onclick="alert('Hello World!')">点击我</p>

<a href="javascript:alert('Hello World!')">点击我</a>
2、内联脚本

<script>
console.log('Hello World!')
</script>
3、外部脚本

<script src="script.js"></script>
ES6 模块化引入,此方式必须要有一个服务器环境!比如:本地安装一个 nginx。

<script type="module" src="module.js"></script>
内联脚本应用场景
内联脚本一般多用于页面初始化、临时代码调试、首屏渲染必需的初始化逻辑等场景,比如三方插件初始化:

<script src="https://cdn.bootcdn.net/ajax/libs/vConsole/3.15.1/vconsole.min.js"></script>
<script>
new VConsole();
</script>
外部脚本应用场景
外部脚本适合复杂、复用性高的场景,是现代 Web 开发的主流选择,使用外部脚本可以降低 HTML 代码的复杂度,有利于项目的维护。

<!-- 所有页面引入公共工具代码 -->
<script src="utils.js"></script>
<!-- 所有页面引入公共代码 -->
<script src="common.js"></script>
<!-- 页面独立的 JS 代码 -->
<script src="index.js"></script>
模块化引入方式:

<script type="module" src="index.js"></script>
index.js:

import { a } from './utils.js';
import { b } from './common.js';
a();
b();

document.querySelect('#button').addEventListener("click", async () => {
// 按需加载模块
const module = await import("./test-module.js"); // test-module.js 中导出 run 方法
module.run();
console.log('Hello World!');
});
script 标签属性
script 标签除了常见的 type 和 src 外,还有两个控制脚本异步加载的属性,分别为 async 和 defer,区别如下:

1、无 async/defer
HTML 解析 → 遇到 <script> → 停止解析 → 下载脚本 → 执行脚本 → 继续解析 HTML
2、async
HTML 解析(并行下载脚本) → 脚本下载完成 → 立即执行(可能中断 HTML 解析)
有多个 async 无法保证执行顺序,谁先下载完、谁先执行,所以 async 不适合于依赖顺序的脚本。脚本执行可能发生在 DOMContentLoaded 事件之前或之后,取决于下载速度。

<!-- 无法保证执行顺序,谁先下载完谁先执行 -->
<script async src="script1.js"></script>
<script async src="script2.js"></script>
应用场景:脚本完全独立,不依赖其他脚本或 DOM,比如:统计代码、广告代码等。

3、defer
HTML 解析(并行下载脚本) → HTML 解析完成 → 按顺序执行所有 `defer` 脚本
多个 defer 脚本严格按文档顺序执行,无论下载速度。所有 defer 脚本执行完毕后,才会触发 DOMContentLoaded 事件。

<!-- script1.js 一定在 script2.js 前执行。 -->
<script defer src="script1.js"></script>
<script defer src="script2.js"></script>
应用场景:脚本需要访问完整的 DOM 或依赖其他脚本,比如:页面初始化逻辑。

script 标签位置
首先要明白,存放在 head 中的 script 标签,会阻塞页面加载,如果这个文件超大,那么页面白屏时间就会很长。

如果是内联脚本,放在哪儿其实影响不大,主要看其内容中有没有耗时的操作。

如果您的脚本需要尽早执行,那么建议放在 head 中。比如:vconsole调试工具,尽早加载有利于捕获代码错误。

如果您的脚本需要访问完整的 DOM,那么建议放在 body 的最后,这样可以确保 DOM 已解析完成。

虽然可以使用 defer 控制脚本延迟加载,但某些兼容原因,还是建议 JS 脚本后置兼容旧版本浏览器。

写在最后
JS 代码应该首先考虑放在外部文件中,HTML 结构应该永远保持简洁。

除非您真的有需求,才建议将 JS 代码放在 head 中,否则 JS 代码应该永远放在 </body> 结束标签之前。

站星网

JS 的代码并没有强制规定放在 HTML 中的某个位置,如果您有使用过开发者工具查看过网页源码,那么您会看到..

为您推荐

Web前端入门第 76 问:JavaScript 鼠标事件(mouse) enter/leave 和 over/out 区别

题外话在考察事件基础的时候,会经常被问及 click、mousedown、mouseup 它们三者执行的先后顺序是怎样的?如果平时没太注意,这细节可能就会忽略,毕竟很少会在同一个元素上面同时绑定这三个事件~~直接上示例:<div ..

Web前端入门第 67 问:JavaScript 中的面向对象编程

此 对象 非彼对象啊,不要理解错了哦~~面向对象编程 这个概念在 Java 编程语言中用得比较多,JS 同时支持 面向对象编程 和 函数式编程。像大名鼎鼎的 React 和 Vue 他们都有两种开发风格,比如:Vue 中的 组合式API ..

Web前端入门第 57 问:JavaScript 数据类型与类型转换

在程序语言中,数据类型是基础,一切程序都是建立在基础数据之上。如果说程序如同万丈高楼平地起,那么数据类型就像沙、石、钢筋、水泥等等最基础的原料。一样的高楼,不同的人,用相同的原料,造的方法也会有千般变..

Web前端入门第 60 问:JavaScript 各种数组定义与数组取值方法

数组可以算是程序里面最常用的数据结构了,但凡网页上任何一个列表数据,基本都是以数组的形式存在,像表格、banner图、菜单列表、商品列表,分类列表等等,在前端领域都是以数组处理。数组的定义JS 的数组花样很多..

Web前端入门第 55 问:JavaScript 严格模式与非严格模式区别

JavaScript 默认是非严格模式的,可以通过 "use strict"; 启用严格模式。此声明语句可以放在 JS 文件顶部,也可以放在函数内部。启用严格模式1、外部脚本在 JS 文件开头声明,内部脚本在 <script> 标签开头声明,声..

Web前端入门第 53 问:JavaScript 的各种调试方法

任何一门编程语言,在学习之前都应该先弄清楚它的调试方法,毕竟没有不挖坑的人类!程序一旦出现问题,第一时间就是找到问题出在哪儿,其次才是拿出解决办法。如果都找不到问题原因,那又何从谈起解决办法呢?如何排..

Web前端入门第 52 问:JavaScript 的应用领域

截至目前,您应该对前端的 HTML + CSS 应该有了很清楚的认知,至少实现一个静态网页已经完全不在话下了。当然,CSS 功能绝不止这些,一些不太常用的 CSS 相关知识,后续将通过案例进行分享。那么咱们接下来看看 Java..

SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 这个错误通常表示客户端在尝试连接到服务器时,服务器没有及时响应,导致连接超时。以下是一些可能的原因和解决方法:可..

ASP.NET Core使用partial标签报错

在 ASP.NET Core 新增了 <partial> 标签支持,用于在 Razor 视图中简化渲染部分视图的语法。这一标签的用法直接写在 HTML 代码中即可,不需要使用 @Html.PartialAsync 语法,这样代码结构会更加清晰。<partial> 标签..

appendformat 输入字符串的格式不正确。

使用StringBuilder的appendFormat方法拼接json的时候出现了输入字符串的格式不正确这样的异常,一开始很莫名,以为是变量为null导致。真实原因是因为拼接内容里存在{}花括号导致的。 例如: sb.appendFormat("[{name..

深入浅出Oracle-DBA入门、进阶与诊断案例免费下载

目前市场上的Oracle书籍普遍存在的问题是模式单一,要么只讲基础知识,要么侧重代码编程实例,要么针对具体的版本特性(Oracle8i/Oracle9i/Oracle10g等),要么缺少实践应用检验,很少能对Oracle相关知识进行全面深..

严澜:数据挖掘入门—分词

谷歌4亿英镑收购人工智能公司DeepMind,百度目前正推进“百度大脑”项目,腾讯、阿里等各大巨头也在积极布局深度学习。随着社会化数据大量产生,硬件速度上升、成本降低,大数据技术的落地实现,让冷冰冰..

Roslyn脚本化C#代码CSharpScript使用方法

Roslyn 是微软公司开源的 .NET 编译器。编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。Roslyn不仅仅可以直接编译输出,难能可贵的就是上述描述中的开放了编译的API,使得代码脚本化成为了可能..

通过css设置a标签锚点页面顶部padding距离

通过#hash值可以跳转到页面锚点位置,这样可以方便用户浏览页面内容。但是滚动到锚点元素位置时,他会紧贴着页面上方顶部。如果网站有固定在顶部的header导航,那么锚点内容会被header导航遮挡。尝试了一些解决方法..

如何正确安装IIS服务器

工具原料:操作系统版本:Windows 10软件版本:IIS 10.0一、下载和安装IIS服务器1、打开控制面板,点击“程序”。2、在“程序和功能”下点击“打开或关闭Windows功能”。3、在“Windows功能”窗口中找到“Internet I..

在线文档生成工具Docusaurus入门:如何安装

Docusaurus简介Docusaurus是一个静态网站生成器,它是用 React 写的源代码,然后编译成静态的 HTML + CSS + JS。支持 Markdown语法,并且Markdown 是用的mdx,也就是支持 jsx 语法的Markdown,无缝结合 React, 还可..

Git正确的提交代码流程

Git 提交代码的流程主要包括以下几个步骤:创建分支在开始开发新功能或修复错误之前,需要创建一个新的分支。分支可以帮助我们将工作与主分支隔离开来,以免影响主分支的稳定性。开发代码在分支上进行开发,完成新功..

progress标签修改颜色

要修改 <progress> 标签的颜色,可以使用 CSS 样式来实现。你可以使用 ::-webkit-progress-value 和 ::-webkit-progress-bar 伪元素来分别控制进度条的前景色和背景色(在支持 WebKit 内核的浏览器中有效)。以下是..

推荐一个python入门学习可以在线可视化测试的网站工具

前言学习一门编程语言,最好的方法就是边学边练习,通过练习来理解编程语言的执行过程和结果,Python是这两年来比较流行的编程语言,初学Python最主要是要弄清楚语法和Python程序的执行过程,下面就推荐一个可视化的..

谷歌站点地图可读取,但存在错误 命名空间不正确

在使用谷歌Google search console提交站点地图sitemap.xml时,报错了:站点地图可读取,但存在错误命名空间不正确 1处您的站点地图或站点地图索引文件未能正确声明命名空间。示例第 1行标记:urlset虽然有报错,但是..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制