【JavaScript】script 标签的使用

这篇具有很好参考价值的文章主要介绍了【JavaScript】script 标签的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

script 标签

script 标签之间共享顶层对象。

<script>
    var a = 1;
</script>

<script>
    console.log(a); // 1
</script>

但是全局变量作用域的提升机制在这些边界中不适用:

<script>
    foo();
</script>

<script>
    function foo() {
        console.log('foo');
    }
</script>

但是下面的两段代码则没问题:

<script>
    foo();
    function foo() {
        console.log('foo');
    }
</script>
<script>
    function foo() {
        console.log('foo');
    }
</script>

<script>
    foo();
</script>

如果 script 中的代码(无论是内联代码还是外部代码)发生错误,它会像独立的 JS 程序那样停止,但是后续的 script 中的代码依然会接着运行,不会受影响。


内联代码和外部文件中的代码之间有一个区别,即在内联代码中不可以出现 </script> 字符串,一旦出现即被视为代码块结束。因此对于下面这样的代码需要非常小心:

<script>
    var code = "<script>alert('Hello World')</script>";
</script>

上述代码看似没什么问题,但是字符串常量中的 </script> 将会被当作结束标签来处理,因此会导致错误。

常用的变通方法是:

'</' + 'script>';

使用转义字符 \ 也可:

<script>
    function sayScript() {
        console.log('<\/script>'); // 使用转义字符
    }
</script>

另外需要注意的一点是,我们是根据代码文件的字符集属性来解析外部文件中的代码,而内联代码则使用其所在页面文件的字符集。

内联代码的 script 标签没有 charset 属性。



script 标签的属性

  1. src:可选。指定外部脚本文件。
  2. async:可选。表示异步加载脚本,加载完成后立即执行。只对外部脚本文件有效。
  3. defer:可选。表示异步加载脚本,等到文档完全被解析和显示之后再执行。只对外部脚本文件有效。
  4. crossorigin:可选。配置相关请求的 CORS(跨源资源共享)设置。默认不使用 CORS。crossorigin="anonymous" 表示文件请求不会设置凭据标志。crossorigin="use-credentials" 表示文件请求会设置凭据标志,意味着出站请求会包含凭据。
  5. integrity:可选。允许比对接收到的资源和指定的加密签名以验证子资源完整性(SRI,Subresource Integrity)。如果接收到的资源的签名与这个属性指定的签名不匹配,则页面会报错,脚本不会执行。这个属性可以用于确保内容分发网络(CDN, Content Delivery Network)不会提供恶意内容。



script 标签的使用

使用了 src 属性的 <script> 元素不应该再在 <script></script> 标签中包含其他 JS 代码。如果两者都提供的话,则浏览器只会下载并执行外部脚本文件,从而忽略行内代码。


<img> 元素很像,<script> 元素的 src 属性可以是一个完整的 URL,而且这个 URL 指向的资源可以跟包含它的 HTML 页面不在同一个域中。

浏览器在解析这个资源时,会向 src 属性指定的路径发送一个 GET 请求,以取得相应资源,假定是一个 JS 文件。这个初始的请求不受浏览器同源策略限制,但返回并被执行的 JS 则受限制。当然,这个请求仍然受父页面 HTTP/HTTPS 协议的限制。

来自外部域的代码会被当成加载它的页面的一部分来加载和解释。这个能力可以让我们通过不同的域分发 JS。不过,引用了放在别人服务器上的 JS 文件时要格外小心,因为恶意的程序员随时可能替换这个文件。在包含外部域的 JS 文件时,要确保该域是自己所有的,或者该域是一个可信的来源。<script> 标签的 integrity 属性是防范这种问题的一个武器。


不管包含的是什么代码,浏览器都会按照 <script> 在页面中出现的顺序依次解释它们,前提是它们没有使用 deferasync 属性。第二个 <script> 元素的代码必须在第一个 <script> 元素的代码解释完毕才能开始解释,第三个则必须等第二个解释完,以此类推。



script 标签位置

script 标签会阻塞 HTML 的解析,所以尽量放在 HTML 的底部,以免影响页面的首屏渲染。

当浏览器遇到 script 标签时,它会暂停解析 HTML 文档,先去执行 script 标签中的 JS 代码,因为 JS 代码可能会修改 HTML 的结构或内容。这样就会导致页面的渲染被延迟,用户看到的是一个空白的页面,直到 script 标签执行完毕,浏览器才会继续解析 HTML 文档,并渲染页面。所以,为了提高用户体验,我们应该尽量把 script 标签放在 HTML 的底部,这样就可以让浏览器先解析和渲染页面的首屏内容,再去执行 script 标签中的 JS 代码。

假设我们有一个内联的 JS 代码,它会在页面加载时执行一些耗时的逻辑,我们把它放在 head 标签内,比如:

<html>
    <head>
        <!-- 内联 JS 放在 head 标签内, 会阻塞 HTML 的解析和页面的渲染 -->
        <script>
            // 一些耗时的逻辑
            for (var i = 0; i < 1000000000; i++) {}
        </script>
    </head>
    <body>
        <!-- 页面内容 -->
        <h1>Hello World</h1>
    </body>
</html>

这样的话,用户打开这个页面时,会看到一个空白的页面,直到内联 JS 执行完毕,才会看到 “Hello World”。

如果我们把内联 JS 放在 body 标签的底部,比如:

<html>
    <head> </head>
    <body>
        <!-- 页面内容 -->
        <h1>Hello World</h1>

        <!-- 内联 JS 放在 body 标签的底部, 不会阻塞 HTML 的解析和页面的渲染 -->
        <script>
            // 一些耗时的逻辑
            for (var i = 0; i < 1000000000; i++) {}
        </script>
    </body>
</html>

这样的话,用户打开这个页面时,会先看到 “Hello World”,然后再等待内联 JS 执行完毕。这样就可以提高用户体验。



推迟执行脚本

<script> 元素上设置 defer 属性,相当于告诉浏览器立即下载,但延迟执行defer 属性表示脚本会被延迟到整个页面都解析完毕后再运行。

<!DOCTYPE html>
<html>
    <head>
        <title>Example HTML Page</title>
        <script defer src="example1.js"></script>
        <script defer src="example2.js"></script>
    </head>
    <body>
        <!-- 这里是页面内容 -->
    </body>
</html>

虽然这个例子中的 <script> 元素包含在页面的 <head> 中,但它们会在浏览器解析到结束的 </html> 标签后才会执行。HTML5 规范要求脚本应该按照它们出现的顺序执行,因此第一个推迟的脚本会在第二个推迟的脚本之前执行,而且两者都会在 DOMContentLoaded 事件之前执行。不过在实际当中,推迟执行的脚本不一定总会按顺序执行或者在 DOMContentLoaded 事件之前执行,因此最好只包含一个这样的脚本。

如前所述,defer 属性只对外部脚本文件才有效。



异步执行脚本

<script> 元素上设置 async 属性,会告诉浏览器立即开始下载。不过,与 defer 不同的是,标记为 async 的脚本并不保证能按照它们出现的次序执行,比如:

<!DOCTYPE html>
<html>
    <head>
        <title>Example HTML Page</title>
        <script async src="example1.js"></script>
        <script async src="example2.js"></script>
    </head>
    <body>
        <!-- 这里是页面内容 -->
    </body>
</html>

在这个例子中,第二个脚本可能先于第一个脚本执行。因此,重点在于它们之间没有依赖关系。给脚本添加 async 属性的目的是告诉浏览器,不必等脚本下载和执行完后再加载页面,同样也不必等到该异步脚本下载和执行后再加载其他脚本。正因为如此,异步脚本不应该在加载期间修改 DOM。

异步脚本保证会在页面的 load 事件前执行,但可能会在 DOMContentLoaded 之前或之后。



动态加载脚本

const script = document.createElement('script');
script.src = 'gibberish.js';
document.head.appendChild(script);

在把 HTMLElement 元素添加到 DOM 且执行到这段代码之前不会发送请求。

默认情况下,动态创建的 <script> 元素是以异步方式加载的,相当于添加了 async 属性。如果要统一动态脚本的加载行为,可以明确将其设置为同步加载:

const script = document.createElement('script');
script.src = 'gibberish.js';
script.async = false;
document.head.appendChild(script);

以这种方式获取的资源对浏览器预加载器是不可见的。这会严重影响它们在资源获取队列中的优先级。根据应用程序的工作方式以及怎么使用,这种方式可能会严重影响性能。要想让预加载器知道这些动态请求文件的存在,可以在文档头部显式声明它们:文章来源地址https://www.toymoban.com/news/detail-735813.html

<link rel="preload" href="gibberish.js" />

到了这里,关于【JavaScript】script 标签的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web前端 Javascript笔记3

     内存中的生命周期         1、内存分配         2、内存使用(读写)         3、内存回收,使用完毕之后,垃圾回收器完成         内存泄漏:该回收的,由于某些未知因素,未释放,叫做内存泄漏 栈:数据存在其中会自动释放 堆:对象,根据程序员的操作来决定释

    2024年04月15日
    浏览(34)
  • 【JavaScript】3.4 JavaScript在现代前端开发中的应用

    JavaScript 是现代前端开发的核心。无论是交互效果,还是复杂的前端应用,JavaScript 都发挥着关键作用。在本章节中,我们将探讨 JavaScript 在现代前端开发中的应用,包括如何使用 JavaScript 来处理用户交互、动态内容、前端路由、API 请求等。 JavaScript 是处理用户交互的主要工

    2024年02月04日
    浏览(47)
  • 前端开发——Javascript知识(介绍)

    目录 有关JavaScript的知识  JavaScript的优点   JavaScript的领域 JavaScript的组成 JavaScript的特点 第一个JavaScript程序 在 HTML 文档中嵌入 JavaScript 代码 在脚本文件中编写 JavaScript 代码 JavaScript内容  Html内容  JavaScript 代码执行顺序 JavaScript中的几个重要概念 标识符 保留字 区分

    2024年02月01日
    浏览(37)
  • web前端javascript笔记——(13)事件(1)

    鼠标/键盘属性 altKey               返回当事件被触发时,“ALT”是否被按下。 button               返回当事件被触发时,哪个鼠标按钮被点击 clientX               返回当事件被触发时,鼠标指针的水平坐标。 clientY               返回当事件被触

    2024年01月25日
    浏览(42)
  • web前端javaScript笔记——(11)DOM

    属性                                     此事件发生在何时 onabort 图像的加载被中断。 onblur                                   元素失去焦点。 anchange                                 域的内容被改变 onclick  当用户点击某

    2024年01月19日
    浏览(41)
  • 前端学习心得笔记之三(JavaScript篇)

    JavaScript一种运行在客户端(浏览器)上的解释性弱语言,是前端的重中之重,在计算机刚刚兴起的那个时代,这个由十天仓促编成的语言发展到现在也是令人吹嘘。 文件引用 在一个单独的js文件中也可以编写JavaScript代码,然后在HTML文件使用script标签进行引用以下为演示 m

    2024年04月23日
    浏览(39)
  • 前端学习笔记:JavaScript基础语法(ECMAScript)

    此博客参考b站:【黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程】https://www.bilibili.com/video/BV1Y84y1L7Nn?p=76vd_source=06e5549bf018e111f4275c259292d0da 这份笔记适用于已经学过一门编程语言(最好是C语言)的同学,如果你没有

    2024年02月16日
    浏览(32)
  • 前端开发——JavaScript的条件语句

      世界不仅有黑,又或者白 世界而是一道精致的灰  ——Lungcen     目录 条件判断语句 if 语句 if else 语句 if else if else 语句  switch语句 break case 子句 default语句 while循环语句 do while循环语句 for循环语句 for 循环中的三个表达式 for 循环嵌套 for 循环变体——for in for 循环

    2023年04月21日
    浏览(33)
  • 【JavaEE初阶】前端第四节.JavaScript入门学习笔记

    作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Java测试开发 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 前言 一、前置知识  1、JS 和 HTML 和 CSS 之间的关系 1.2 JS 的书写形式 1.2.1 内嵌式 1.2.2 行内式  1.2.3 外部式 1.2.4 扩展 1.2

    2024年02月08日
    浏览(39)
  • 30个前端开发中常用的JavaScript函数

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 在前端开发中通常会用到校验函数,检验是否为空、手机号格式、身份证格式等等。现按照用途分类整理出了30个常用的方法,在V

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包