如何在 HTML5 中异步执行脚本?

htmlhtml5front end technology更新于 2024/11/24 17:48:17

Script 标签用于使网页动态化,然而繁重的脚本会导致网页渲染缓慢,最终导致用户体验不佳。为了解决这个问题,我们异步执行网页中的脚本,即 JavaScript 与其他网站元素并行下载,并在下载完成后立即开始执行。

异步加载脚本有两种常用方法:

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

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

如果没有这些属性,脚本会在下载后立即开始执行,这同样会导致解析过程阻塞。

方法 1:async 属性

在本例中,我们将研究如何使用 JavaScript 中提供的 async 标签异步执行脚本。 JavaScript。

语法

<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>

使用 async 时需要注意以下几点:

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

  • 具有 async 属性的脚本在 HTML 文件中的运行顺序事先是未知的。如果执行顺序很重要,而一个脚本依赖于另一个脚本,则可能会出现问题。

  • 具有 async 属性的脚本不会阻止页面的渲染。虽然页面的加载时间有所改善,但这也可能导致内容样式不完整或其他视觉问题。

为了消除这些问题,HTML5 提供了一个 defer 属性,允许脚本异步下载,并确保依赖于其他资源的脚本按正确的顺序执行,从而降低出现错误或故障的可能性。

方法 2:Defer 属性

在此示例中,我们将展示如何使用设置为 true 的 defer 属性来加载脚本。

语法

<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> 内容加载之后需要一段时间,这是由于脚本执行导致的。然而,当脚本标签使用 async 和 defer 属性时,则不会出现此类问题。

结论

HTML5 中的 async/defer 属性支持脚本的异步加载。当遇到具有 async 属性的脚本时,浏览器会在页面仍在渲染时在后台下载该脚本。

HTML5 中的 async/defer 属性支持脚本的异步加载。当遇到具有 async 属性的脚本时,浏览器会在页面仍在渲染时在后台下载该脚本。


相关文章


有用资源