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


script标签用于使网页动态化,但是大量的脚本可能会导致网页渲染缓慢,最终导致用户体验差。为了解决这个问题,我们异步执行网页中的脚本,即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>

使用async时,有一些重要事项需要注意

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

  • HTML文件中具有async属性的脚本的运行顺序是未知的。如果执行顺序很重要,当一个脚本依赖于另一个脚本时,这可能会很麻烦。

  • 具有async属性的脚本不会阻塞页面的渲染。虽然提高了页面的加载时间,但这也会导致内容未设置样式或其他视觉故障的情况。

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

方法二: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>内容加载稍后才加载,这是由于脚本执行而阻塞的。但是,当在script标签中使用async和defer属性时,不会遇到此类问题。

结论

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

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

更新于:2023年8月9日

浏览量:332

开启你的职业生涯

完成课程获得认证

开始学习
广告