详解JS异步加载的三种方式

详解JS异步加载的三种方式

JS异步加载指的是JavaScript代码在浏览器中执行时,通过非阻塞IO的方式,使得代码的执行不会阻塞页面的渲染和交互,从而提升用户体验。而JS异步加载的方式主要有以下三种:

1. defer

使用 defer 属性可以将脚本的加载推迟到文档的解析和显示完成之后再执行。这个过程会是解析 HTML 文档和执行 JS 脚本并行进行的,因此当 JS 脚本被执行时,整个 DOM 树仍然是完整的,可以立即操作。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>defer demo</title>
    <script defer src="main.js"></script>
</head>
<body>
    <h1>defer demo</h1>
    <p>Some content</p> 
</body>
</html>

上述代码中,main.js 的加载和执行被推迟到了整个 HTML 文档加载完毕后,也就是在 DOMContentLoaded 事件触发前。在这个时候,DOM 树已经构建完毕,main.js 可以操作文档中的元素。

2. async

与 defer 不同,使用 async 属性可以让脚本异步加载并执行。当浏览器遇到 async 属性时,会在文档加载和渲染的同时,异步加载并执行脚本,从而不会阻塞页面的渲染和交互。但与此同时,由于 JavaScript 的异步执行特性,脚本的加载和执行顺序不能保证,因此使用 async 属性的脚本一般不能依赖于页面的其他元素。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>async demo</title>
</head>
<body>
    <h1>async demo</h1>
    <p>Some content</p> 
    <script async src="main.js"></script>
</body>
</html>

在上述示例中,main.js 异步加载并执行,不会阻塞页面的渲染。但是需要注意的是,如果页面上还存在其他 JS 脚本,那么它们的加载和执行也是异步的,且顺序不可预知,可能会造成一些难以预料的问题。

3. 动态插入

动态插入 JavaScript 脚本是一种常见的异步加载方式。在页面上预留好一个 script 标签,然后使用 JavaScript 动态插入具体的脚本路径,即可实现异步加载。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>dynamic load demo</title>
</head>
<body>
    <h1>动态加载 JavaScript</h1>
    <p>使用JS动态加载main.js文件</p>
    <script>
        var script = document.createElement('script');
        script.src = 'main.js';
        document.body.appendChild(script);
    </script>
</body>
</html>

在上述示例中,通过 JavaScript 动态地创建一个 script 元素,并将其 src 属性设置为 main.js 的路径。然后通过 document.body.appendChild 方法将该元素插入到文档中即可实现异步加载。需要注意的是,这种方式也是无法保证多个脚本的执行顺序的。

综上所述,以上三种方式都能实现 JS 的异步加载。需要根据具体场景的要求,选择适合的一种方式来使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JS异步加载的三种方式 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • Js获取当前日期时间及格式化代码

    下面是关于”Js获取当前日期时间及格式化代码”的完整攻略: 获取当前日期时间 在JavaScript中,我们可以使用new Date()来获取当前日期时间对象。 例如,以下代码段可以获取当前日期时间: const now = new Date(); 上述代码中,now就是当前的日期时间对象。 格式化当前日期时间 虽然new Date()可以让我们获取到当前日…

    JavaScript 2023年5月27日
    00
  • springboot项目如何防止XSS攻击

    在SpringBoot项目中防止XSS攻击可以采取以下措施: 使用HTML转义库 在应用中使用HTML转义库比如jsoup、owasp-esapi、htmlentities等,可以过滤掉HTML标签并且转义掉敏感字符,这样可以有效避免XSS攻击。 例如,在Spring Boot项目中,我们可以使用前面提到的jsoup库来进行HTML转义: String sa…

    JavaScript 2023年6月11日
    00
  • Listview的异步加载性能优化

    Listview的异步加载性能优化是一个比较复杂的问题,需要从多个方面进行思考和优化。下面给出一个详细的攻略,希望对大家能够有所帮助。 1.分析性能瓶颈 Listview的性能瓶颈主要集中在两个方面:数据加载和UI绘制。对于数据加载,我们可以通过异步加载数据的方式来解决;对于UI绘制,我们可以通过减少UI绘制的操作,减少UI控件的复杂度等方式来解决。 2.异…

    JavaScript 2023年5月28日
    00
  • ES6新特性之类(Class)和继承(Extends)相关概念与用法分析

    下面是关于ES6中类(class)和继承(extends)的详细讲解: 什么是类(class) 类(class)是ES6中的一个新特性,是一种对象构造器,它可以通过类来创建对象,其语法定义如下: class MyClass { // 类的构造方法,当通过new关键字实例化类对象时,会调用这个方法来初始化对象的属性 constructor(args) { //…

    JavaScript 2023年5月28日
    00
  • js操作时间(年-月-日 时-分-秒 星期几)

    下面是JS操作时间的完整攻略。 获取当前时间 要获取当前时间,可以使用Date对象。该对象提供的方法可以获取当前时间的年、月、日、时、分、秒等信息。 const now = new Date(); console.log(now); // 输出当前时间的完整信息 const year = now.getFullYear(); // 获取当前年份 const …

    JavaScript 2023年5月27日
    00
  • JS实现导出Excel和CSV文件操作

    JS实现导出Excel和CSV文件是前端开发中经常遇到的需求之一。在这里,我将给出完整的操作步骤和两个示例。 准备工作 在实现导出Excel和CSV文件前,需要先引入相关的依赖库。常用的依赖库有FileSaver.js和xlsx.js。 <!– 导入FileSaver.js –> <script src="https://cd…

    JavaScript 2023年5月27日
    00
  • javascript模拟实现ajax加载框实例

    以下是使用 JavaScript 模拟实现 ajax 加载框的完整攻略: 实现思路 创建一个遮罩层,并设置其 z-index 值为一个比较大的数字,遮罩整个页面; 在遮罩层中添加一个加载框元素,并使用 CSS 进行设置和样式定制; 使用 JavaScript 编写一个可以请求服务器数据的对象,以及在请求过程中显示遮罩层及加载框的方法; 在处理完请求后,隐藏遮…

    JavaScript 2023年6月11日
    00
  • JavaScript类和继承 constructor属性

    JavaScript类和继承是面向对象编程的主要概念之一。构造函数是类的重要组成部分之一,通过构造函数我们可以创建新的实例,同时constructor属性则是描述类的属性之一。以下是完整攻略: 一、JS类的创建 JS 类的创建可以使用ES5和ES6进行定义。 在ES5 中,使用构造函数和原型算法来定义类,而在ES6 中,使用class和constructor…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部