1.属性:
async与defer的区别:async,defer
之前放在必须放置在head标签里,这样会导致页面渲染延迟(只有解析到body标签才开始渲染),现在也可以放置到body后面了
设置了defer属性的script元素,虽然包含在页面的head中,但它们会在浏览器解析到结束的html标签后才会执行。
对 defer 属性的支持是从 IE4、Firefox 3.5、Safari 5 和 Chrome 7 开始的。其他所有浏览器则会忽略这个属性,按照通常的做法来处理脚本。考虑到这一点,还是把要推迟执行的脚本放在页面底部比较好。
延迟执行的脚本都会在 DOMContentLoaded 事件之前执行
对于 XHTML 文档,指定 defer 属性时应该写成 defer=“defer”。
async 属性的目的是告诉浏览器,不必等脚本下载和执行完后再加载页面,同样也不必等到该异步脚本下载和执行后再加载其他脚本。正因为如此,异步脚本不应该在加载期间修改 DOM。
异步脚本保证会在页面的 load 事件前执行,但可能会在 DOMContentLoaded之前或之后
对于 XHTML 文档,指定 async 属性时应该写成 async=“async”。
const srcipt = document.createElement('srcipt');
srcipt.src = "demo.js"
document.appendChild(srcipt)
默认情况下,以这种方式创建的script元素是以异步方式加载的,相当于添加了 async 属性。不过这样做可能会
有问题,因为所有浏览器都支持 createElement()方法,但不是所有浏览器都支持 async 属性。因此,如果要统一动态脚本的加载行为,可以明确将其设置为同步加载。
script.async = false;
以这种方式获取的浏览器预加载器是不可见的,这会严重影响它们在资源获取队列中的优先级,要想让预加载器知道这些
动态请求文件的存在,可以在文档头部显式声明它们:
<Link rel="preload" ref="demo.js">
可扩展超文本标记语言(XHTML,Extensible HyperText Markup Language)是将 HTML 作为 XML的应用重新包装的结果。与 HTML 不同,在 XHTML 中使用 JavaScript 必须指定 type 属性且值为"text/javascript"
xhtml会把所有的<解析成标签的开始,并且作为标签开始的小于号后面不能有空格,所以以下模块在xhtml中会有语法错误
<script type="text/javascript">
function compare(a, b) {
if (a < b) {
console.log("A is less than B");
} else if (a > b) {
console.log("A is greater than B");
} else {
console.log("A is equal to B");
}
}
</script>
解决方法1:将所有的小于号换成<
解决方法2:把所有代码都包含到一个 CDATA 块中。CDATA 块表示文档中可以包含任意文本的区块,其内容不作为标签来解析
<script type="text/javascript"><![CDATA[
function compare(a, b) {
if (a < b) {
console.log("A is less than B");
} else if (a > b) {
console.log("A is greater than B");
} else {
console.log("A is equal to B");
}
}
]]></script>
在兼容 XHTML 的浏览器中,这样能解决问题。但在不支持 CDATA 块的非 XHTML 兼容浏览器中则不行。为此,CDATA 标记必须使用 JavaScript 注释来抵消:
<script type="text/javascript">
//<![CDATA[
function compare(a, b) {
if (a < b) {
console.log("A is less than B");
} else if (a > b) {
console.log("A is greater than B");
} else {
console.log("A is equal to B");
}
}
//]]>
</script>
2.1.6废弃的语法
使用这种格式,Mosaic 等浏览器就可以忽略
<script><!--
function sayHi(){
console.log("Hi!");
}
//--></script>
推荐使用外部js文件
最初的文档模式有两种:混杂模式(quirks mode)和标准模式(standards mode)。前者让 IE 像 IE5 一样(支持一些非标准的特性),后者让 IE 具有兼容标准的行为。随着浏览器的普遍实现,又出现了第三种文档模式:准标准模式(almost standards mode)。这种模式下的浏览器支持很多标准的特性,但是没有标准规定得那么严格。主要区别在于如何对待图片元素周围的空白(在表格中使用图片时最明显)
准标准模式与标准模式非常接近,很少需要区分。人们在说到“标准模式”时,可能指其中任何一
个。而对文档模式的检测(本书后面会讨论)也不会区分它们。本书后面所说的标准模式,指的就是除
混杂模式以外的模式。
noscript元素可以包含任何可以出现在body中的 HTML 元素,script除外。在下列两种情况下,浏览器将显示包含在noscript中的内容:
本章的重点可以总结如下。