HTML5 如何异步执行脚本

HTML5 如何异步执行脚本

脚本标签用于使网页动态化,但是较重的脚本可能导致网页呈现缓慢,进而影响用户体验。为解决这个问题,我们可以异步执行网页中的脚本,即javascript在完成下载后与其他网站元素并行下载并开始执行。

加载脚本异步执行的两种常用方法如下:

  • Async 属性 :脚本并行下载,并在下载完成后立即开始执行。

  • Defer 属性 :脚本并行下载,并在页面解析过程完成后开始执行。

如果没有使用这些属性的话,脚本将在下载完成后立即开始执行,这也会阻止解析过程。

方法一:Async属性

在这个例子中,我们将使用JavaScript中提供的async标签来异步执行脚本。

语法

<script src="..." async></script>

async是一个布尔属性,当在<>内定义时为true,否则默认为false。

步骤

步骤1: 使用HTML标签定义网页骨架

步骤2: 使用<script>标签导入脚本

步骤3:<script>标签中添加async属性

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Async Javascript</title>
</head>
<body>
    <h1>Tutorials Point</h1>
    <script type="text/javascript"
    src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" async></script>

    <!-- Loaded after sometime if aysnc attribute is removed -->
    <h3>Welcome to Tutorials point</h3>
    <p>
        Lorem ipsum dolor sit amet consectetur, adipisicing elit. Nulla debitis deleniti harum perferendis quisquam,
        cum dignissimos ex laborum saepe pariatur sapiente dolores possimus autem quam voluptates commodi a eveniet facere!
    </p>
    <button onclick="window.location.reload()">Reload</button>
</body>
</html>

在使用异步时需要记住几个重要的事情:

  • 无论它们在HTML文件中的位置如何,具有异步属性的脚本在下载完成后立即开始运行。这意味着,如果脚本依赖于其他资源(例如图片或样式表)尚未完成加载,则可能导致问题或意外行为。

  • 具有异步属性的脚本在HTML文件中的执行顺序是不确定的。如果执行顺序很重要,当一个脚本依赖于另一个脚本时,可能会引发问题。

  • 具有异步属性的脚本不会阻塞页面的渲染。尽管页面的加载时间得到了改善,但也可能导致内容无样式或其他视觉故障的情况。

为了解决这些问题,HTML5提供了延迟属性(defer attribute),它允许脚本异步下载,并确保依赖其他资源的脚本按正确顺序执行,减少错误或故障的可能性。

方法二:延迟属性

在这个例子中,我们将展示如何使用设置为true的延迟属性来加载脚本。

语法

<script src="..." defer></script>

defer是一个布尔属性,如果在<>中定义,则为true;否则默认为false。

步骤

步骤1: 使用HTML标签定义网页的骨架

步骤2: 使用<script>标签导入脚本

步骤3:<script>标签中添加defer属性

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Async Javascript</title>
</head>
<body>
    <h1>Tutorials Point</h1>
    <script type="text/javascript"
    src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" defer></script>

    <!-- Loaded after sometime if defer attribute is removed -->
    <h3>Welcome to Tutorials Point</h3>
    <p>
        Lorem ipsum dolor sit amet consectetur, adipisicing elit. Nulla debitis deleniti harum perferendis quisquam,
        cum dignissimos ex laborum saepe pariatur sapiente dolores possimus autem quam voluptates commodi a eveniet facere!
    </p>
    <button onclick="window.location.reload()">Reload</button>
</body>
</html>

从输出结果可以看出,<h1> 标题内容在加载网页后立即加载,但是 <h3><p> 内容需要一段时间才会加载,这是由于脚本执行而被阻塞。然而,在使用 script 标签的 async 和 defer 属性时,并没有遇到这样的问题。

总结

HTML5 中的 async/defer 属性使得脚本可以异步加载。当遇到带有 async 属性的脚本时,浏览器会在页面仍在渲染的同时后台下载脚本。

HTML5 中的 async/defer 属性使得脚本可以异步加载。当遇到带有 async 属性的脚本时,浏览器会在页面仍在渲染的同时后台下载脚本。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程