script 标签放在 HTML 文档的 body 内底部

news/2025/1/5 21:34:05/文章来源:https://www.cnblogs.com/zsnhweb/p/18646205

以下是将 <script> 标签放在 HTML 文档的 <body> 内底部的几个重要原因:

1. 页面加载顺序和性能优化

  • 原理

    • 当浏览器解析 HTML 文档时,它会按顺序执行遇到的元素。如果 <script> 标签位于 <head> 中或 <body> 的顶部,浏览器会在下载和执行脚本时暂停 HTML 文档的解析和渲染,因为脚本可能会修改 DOM 元素或依赖于某些 DOM 元素。将 <script> 标签放在 <body> 的底部可以确保在执行脚本之前,大部分的 HTML 内容已经被解析和渲染,页面的主要部分可以更快地显示给用户,提供更好的用户体验。
  • 示例

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Page Title</title>
    </head>
    <body><h1>Hello, World!</h1><p>This is a paragraph.</p><script src="script.js"></script>
    </body>
    </html>
    

    在这个例子中,用户会先看到 <h1><p> 元素,然后才会执行 script.js

2. 避免阻塞 DOM 解析和渲染

  • 原理

    • <script> 包含在 <head> 中时,它会阻塞后续的 HTML 元素的解析和渲染,因为浏览器需要先下载并执行脚本。对于较大的脚本文件或外部依赖的脚本,这可能会导致页面显示延迟,用户可能会看到一个空白页面,直到脚本执行完成。将 <script> 放在 <body> 底部可以避免这种情况,因为此时页面的主要结构已经解析和渲染,用户可以看到部分页面内容。
  • 示例

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Page Title</title>
    </head>
    <body><div id="content"><p>Some content here</p></div><script src="largeScript.js"></script>
    </body>
    </html>
    

    这里,在 largeScript.js 下载和执行之前,用户可以看到 div#content 中的内容,因为脚本的执行不会阻塞页面的初始渲染。

3. 脚本对 DOM 的操作

  • 原理

    • 很多脚本需要操作 DOM 元素,如果 <script> 标签放在 <head> 中,可能会出现找不到 DOM 元素的情况,因为这些元素还未被解析。将 <script> 放在 <body> 底部可以确保在脚本执行时,它需要操作的 DOM 元素已经存在。
  • 示例

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Page Title</title>
    </head>
    <body><div id="content"><p>Some content here</p></div><script>// 这个脚本可以安全地操作 #content 元素const content = document.getElementById('content');content.style.backgroundColor = 'red';</script>
    </body>
    </html>
    

    在这个例子中,script 标签中的代码可以安全地操作 idcontent 的元素,因为该元素已经在页面中被解析。

4. 异步和延迟脚本的替代方案

  • 原理

    • 虽然 asyncdefer 属性可以用来控制脚本的执行时间,但将 <script> 放在 <body> 底部是一种更简单的方式,可以达到类似的效果,尤其适用于不熟悉这些属性或在不支持这些属性的旧浏览器中。
  • 示例

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Page Title</title>
    </head>
    <body><h1>Hello, World!</h1><p>This is a paragraph.</p><script src="script.js"></script><script src="anotherScript.js"></script>
    </body>
    </html>
    

    在这里,script.jsanotherScript.js 会按顺序依次执行,且不会阻塞页面的初始渲染。

5. 页面资源加载优化

  • 原理

    • <script> 放在 <body> 底部可以确保页面的主要资源(如样式表、图片)先加载,而不是等待脚本下载和执行,从而优化页面的整体加载顺序,提高页面的加载速度。
  • 示例

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Page Title</title><link rel="stylesheet" href="style.css">
    </head>
    <body><img src="image.jpg" alt="An image"><script src="script.js"></script>
    </body>
    </html>
    

    在这个例子中,style.cssimage.jpg 会先于 script.js 加载,使页面的样式和图片能够更快地显示。

总结

<script> 标签放在 <body> 内的底部是一种优化页面性能和用户体验的有效方式,它可以避免阻塞页面的初始渲染,确保 DOM 元素在脚本执行前已经解析,同时优化页面资源的加载顺序,提高页面的整体加载速度。对于一些需要操作 DOM 的脚本,这种方式可以保证它们在操作时 DOM 元素已经存在,避免出现找不到元素的错误。然而,对于一些不依赖于 DOM 的脚本或需要尽快执行的脚本(如统计脚本),也可以使用 asyncdefer 属性,根据具体情况灵活选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/862394.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

折腾笔记[4]-cuda的hello-world

在window11上搭建cuda开发环境并编译hello world程序;摘要 在window11上搭建cuda开发环境并编译hello world程序; 关键信息编译器:cuda nvcc 12.4.131 平台:windows11原理简介 cuda简介 CUDA(Compute Unified Device Architecture,统一计算架构)是由英伟达所推出的一种集成技术…

13. 滑块控件

一、抽象滑块QScrollBar、QSlider 和 QDail 都是从 QAbstractSlider 类继承而来的,因此它们的多数方法是相同的。我们可以在终端中使用 pip 安装 pyside6 模块。 pip install pyside6QAbstractSlider 类的常用方法如下: # 实例方法 orientation() -> Qt.Orientation …

3.数据类型

3.1字符串1.正常字符串使用 或 "" 包裹起来2.注意转义字符 \ \ 显示’ \n 换行 \t tab \u4e2d \u### Unicode字符3.多行字符串编写 4.模板字符串5.字符串长度 str(变量名).length6.字符串的可变性,不可变String Buffer和StringBuilder都是可变的,String…

h5如何解决移动端适配问题

使用响应式布局(Responsive Layout)原理:通过CSS媒体查询(Media Queries)根据设备的屏幕尺寸、分辨率等属性来动态调整页面的布局和样式。媒体查询允许您针对不同的媒体类型(如屏幕、打印等)和条件(如屏幕宽度、高度、设备方向等)应用不同的CSS规则。 示例代码:例如,…

第15章 流与IO

第15章 流与IO 15.1 .NET 流的架构 .NET 流的架构主要包含三个概念:** 后台存储 、 装饰器 以及 流适配器 **,如图所示: C7.0 核心技术指南 第7版.pdf - p655 - C7.0 核心技术指南 第 7 版-P655-20240216192328 ​​ 其中** 后台存储 和 装饰器 **为流。后台存储流:负责处理…

超全性能调优标准制定指南,你一定不能错过!

0 前言 我有个朋友说他们国企的系统从未性能调优,功能测试完就上线,线上也没性能问题,何必还做性能调优? 本文搞清:为什么要做性能调优? 啥时开始做? 做性能调优是不是有标准?1 为啥做性能调优?有些性能问题是慢慢产生,到了时间就自爆 更多性能问题是由访问量波动导致…

第16章 网络

第16章 网络 纲要 .NET Framework 在 System.Net.*命名空间中包含了支持各种网络标准的类,支持的标准包括 HTTP、TCP/IP 以及 FTP 等。以下列出了其中的主要组件:​Webclient​ 类 支持通过 HTTP 或者 FTP 执行简单的下载/上传操作。​WebRequest​ 和 WebResponse​ 类 可以…

第13章 诊断

第13章 诊断 13.1 条件编译 预编译的指令见 4.16 预处理指令,我们这里的条件编译用到的指令有:​#if​​、#else​​、#endif​​、#elif​​ 条件编译指令可以进行 与 ​&&​ ​、 或 ​||​ ​、 非 ​!​ 运算。预定义指令可以通过三种方式定义:在文件中通…

第14章 并发与异步

第14章 并发与异步 14.2 线程 进 程提供了程序执行的独立环境, 进 程持有 线 程,且至少持有一个 线 程。这些 线 程共享 进 程提供的执行环境。 14.2.1 创建线程 创建线程的步骤为:实例化 ​Thread​ ​ 对象,通过构造函数传入 ​ThreadStart​ ​ 委托。 调用 ​Thread…

Sqlserver With as 实现循环递归

一、脚本示例declare @Separator varchar(10), @str varchar(100) declare @l int, @i int select @Separator=,,@str=111,22,777,99,666 select @i = len(@Separator), @l = len(@str); with cte7 as ( select 0 a, 1 b union all select b, charindex(@Separator, @str, b)+@…

JAVA 分布式锁

分布式锁 JVM 自带的 synchronized 及 ReentrantLock 锁都是单进程内的,不能跨进程,如下,同时来个两个请求被分配到不同的tomcat,这种锁将失效:REDIS 实现分布式锁 可以借助 REDIS 的setnx 命令实现: https://blog.csdn.net/T_Y_F_/article/details/144238022 注:redis …

java8--类Scanner--文件内容输入--windows路径分隔符转义

try { Scanner in = new Scanner(Paths.get("C:\Users\Administrator\IdeaProjects\untitled2\src\test\myfile.txt"),"UTF-8"); } catch (IOException ioException) { ioException.printStackTrace(); }ps: 1.打印当前工…