0
点赞
收藏
分享

微信扫一扫

javascript高级程序设计(第四版)懒阅读: 第二章

阎小妍 2022-02-18 阅读 86

(36-第二章20220219+a0816

<script>标签

“script”标签元素有八个属性:

  • async:表示立即开始下载脚本,但是但是不会阻止其他页面动作,只对外部脚本有效。[可省略]

  • charset:规定代码的字符集,但是几乎没有浏览器在乎它的值。[可省略]

  • crossorigin:配置相关请求的CORS(跨资源共享)设置,有两个值:

    • 当设置为crossorigin=“anonymous”时,配置文件请求不必设置凭据标志。
    • 当设置为crossorigin=“use-credentials”时,设置凭据标志,意味着出战请求会包含凭据。[可省略]
  • defer:等页面文档被解析完了并且显示出来之后,再解析脚本,只对外部脚本文件有效。(IE7以前,对网页中的代码也可以生效)[可省略]

  • integrity:用于比对签名的一个属性,比对失败则脚本不执行。[可省略]

  • language:浏览器都不用了,我懒得写了。

  • src:引入外部文件[可省略]

  • type:表示代码块中脚本语言的内容类型(也叫它MIME类型)。当出现type=“module“,就会把当前代码当为ES6模块,这个时候代码中才能使用import和export关键字![可省略]

”script“标签就俩用:要么在网页里写代码;要么就引入外部js文件。

出现了第一段代码->是在网页(.html文件)里面写个js函数;

 <script>
        function SayHi(){
            console.log("Hi");
            console.log("<\/script>");//这里不能直接写script结束标签,需要在斜杠之前写个转义字符
        }
        SayHi()
    </script>

不能直接写script结束标签,会报错,解析器会提前结束script代码,需要加个\转义字符。

第二段代码->在网页中引入外部js文件。

   <script src="./example.js"></script>

解释外部文件也会消耗一定的时间。

原文用的阻塞时间:阻塞时间包括下载外部js的时间+解释外部js文件代码的时间;

在XHTML文件里可以不用写结束标签。

懒,自己看注意事项。

值得一提的是:如果script标签如果用了src属性,则标签内代码会被忽略;

script的src可以引用外部域的JS文件,所以src文件内容可以是以一个完整URL。URL指向的资源可以和HTML页面不在同一个域中如:

    <script src="http://www.somewhere.com/afile.js"></script> 

解析过程:

  • 首先会想url发送get请求
  • 如果是js文件,则刚开始的请求不受浏览器同源策略的限制
  • 但是返回被执行的JS会受限制。
  • 该请求依旧会受父页面HTTP/HTTPS协议的限制。

引入外部域代码会被当成自己页面的一部分来加载和解释;所以就可以引入不同域分发的JS。但是注意外域js文件是别人的,所以别人可以替换掉文件。所以前面的integrity属性就有用了,虽然这个属性不是所有浏览器支持。

如果script标签没有defer和async属性。则会逐行解释。

标签位置

就是讲了个:把script标签放body标签结束位置就行了。

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

推迟执行脚本

当script标签定义了defer属性。这时候:

  • 浏览器会先下载文件
  • 然后接着解析并加载页面
  • 当页面被加载和解析完了,再回来执行js代码。

设置了defer虽然会在页面加载后再读取js文件代码,但他们也会在事件DOMContentLoaded事件之前执行,只适用于外部脚本。

异步脚本

当script标签定义了async属性,async与defer类似:

  • 都会立即开始下载

但是不同的是ansync的脚本并不能保证按次序执行。异步脚本保证会在页面的load事件前执行。其他不保证……

动态加载脚本

通过DOM API,向DOM中动态添加script 然后通过dom操作实现加载脚本:

  • 首先创建script元素,然后将它添加到DOM里
  <script>
        let script = document.createElement('script');
         script.src = './example.js';
        document.head.appendChild(script); 
    </script>

默认情况下,以上代码创建的script标签是以异步方式加载的,就像加了个async属性。所以可以这样写:

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

这样可以统一动态脚本的加载行为。

XHTML中的变化

可扩展超文本标记语言(XHTML,Extensible HyperText Markup Language)是将 HTML 作为 XML的应用重新包装的结果。

与 HTML 不同,在 XHTML 中使用 JavaScript 必须指定 type 属性且值为text/javascript,HTML 中则可以没有这个属性。

(因为不是重点,略。其实主要因为我懒,不想总结。)

废弃的语法

我也将它废弃了,又不用了。学它干嘛?

行内代码与外部文件

先讲了使用外部js文件的好处:

  • 可维护性 :一个窗口专门写HTML另一个窗口专门写JS不香嘛?而且写完JS还能应用到多个HTML文件里。
  • 缓存:如果俩页面引用一个js文件,浏览器就利用缓存少加载一次文件,这不更快了?起飞!
  • 适应未来:也没啥,我这个小白看了纯属扯淡。

具体讲了个SPDY/HTTP2的好处与实现,首先了解一下SPDY:

然后书讲到SPDY这个东西,会将可能会加载到的js文件都放入到浏览器的缓存内。这样会提高加载速度。

文档模式

IE5.5产生了文档模式的概念,使用doctype可以切换文档模式;

开始文档模式分两种:

  • 混杂模式(quirks mode)

    混杂模式可以让IE像IE5一样不标准。
    
  • 标准模式(standards mode)

    标准模式可以让IE有兼容标准的行为
    

但是主要区别在于CSS渲染方面,JS只是有一些关联的副作用。

开启混杂模式:不写<DOCTYPE>就开了。

开启标准模式:

  • 在HTML文件开头加下列代码开启HTML4.0标准模式:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
    
  • 在XHTML文件开头加下列代码开启XHTML标准模式:

    <!DOCTYPE html PUBLIC
    "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
    
  • 在HTML文件开头加下列代码开启HTML5标准模式:

    <!DOCTYPE html> 
    

还有个准标准模式,因为没看见HTML5的代码。懒得搬运了。可以当作只有混杂模式标准模式两种。

<noscript>元素

首先它解释的是:这个标签被用于不支持JavaScript的浏览器提供代替内容。

然后现在的情况是:所有浏览器都100%支持JavaScript。

懂吧……

测试代码(可以在chrome浏览器关闭javascript脚本实现)

<!DOCTYPE html>
<html>
 <head>
 <title>Example HTML Page</title>
 </head>
 <body>
 <noscript>
 <p>This page requires a JavaScript-enabled browser.</p>
 </noscript>
 </body>
</html> 

好了这一小章节纯粹浪费时间……靠呗啦!

小结

JavaScript要么用<script>标签要么写个js文件然后用<script src="">引入js文件。

本章总结如下(开始搬运)

  • 要包含外部 JavaScript 文件,必须将 src 属性设置为要含文件的 URL。文件可以跟网页在同一台服务器上,也可以位于完全不同的域。

  • 所有<script>元素会依照它们在网页中出现的次序呗解释。在不使用defer和async属性的情况下,包含在<script>元素中的代码必须严格按次序解释。

  • 对不推迟执行的脚本,浏览器必须解释完位于<script>元素中的代码,然后才能继续渲染页面的剩余部分。为此,通常应该把<script>元素放到页面末尾,介于主内容之后及</body>标签之前。

  • 可以使用 defer 属性把脚本推迟到文档渲染完毕后再执行。推迟的脚本原则上按照它们被列出的次序执行。

  • 可以使用 async 属性表示脚本不需要等待其他脚本,同时也不阻塞文档渲染,即异步加载。异
    步脚本不能保证按照它们在页面中出现的次序执行。

  • 通过使用<noscript>元素,可以指定在浏览器不支持脚本时显示的内容。如果浏览器支持并启用脚本,则<noscript>元素中的任何内容都不会被渲染。

举报

相关推荐

0 条评论