1.<script>标签中的aysnc和defer
1.1.async
表示应该立即开始下载脚本,但不能阻止其他页面动作,比如下载其他资源或等待其他脚本下载。只对外部脚本文件有效。
1.2.defer
表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。(但在IE7以及更早版本上,对行内脚本也可以指定这个属性)。
1.3.区别:
\ | async | defer |
---|---|---|
叫法 | 异步执行脚本 | 推迟执行脚本 |
执行时间 | 保证在页面的load 事件前触发,但可能会在DOMContentLoaded 之前或之后执行,无法预测 |
脚本会被延迟到整个页面解析完毕执行,在DOMContentLoaded 前触发 |
执行顺序 | 标记为async的脚本并不能按照它们出现的顺序执行,第二个脚本可能先于第一个脚本执行,它们之间并没有依赖关系,谁先下载完成谁就开始执行 | HTML5规范要求脚本应该按照它们出现的顺序执行,因此第一个推迟的脚本会在第二个推迟脚本之前执行 |
使用场景 | 脚本并不关心页面中的DOM 元素(文档是否解析完毕),并且也不会产生其他脚本需要的数据 |
脚本代码依赖于页面中的DOM 元素(文档是否解析完毕),或者被其他脚本文件依赖 |
2.<script>标签的执行:
如果没有使用在<script>中使用defer或ansync,浏览器会按照<script>在页面中出现的顺序依次解释它们。第二个<script>元素的代码必须在第一个<script>元素的代码解释完毕才能执行,第三个则必须等待第二个解释完,以此类推。
3.<script>标签的位置:
放在<head>内,和外部css和javascript文件集中在一起利于管理,但这会意味着必须把所有javascript代码下载,解析和解释完成后,才能渲染页面,若js代码很多,会导致页面渲染有明显延迟,此时浏览器窗口完全空白。所以通常将javascript引用放在<body>元素中的页面内容后面。
4.<noscript>元素
<noscript>元素可以出现在<body>中的HTML元素,只要存在以下两种情况之一,浏览器将显示包含在<noscript>内的内容,其他情况都不会渲染:
1.浏览器不支持脚本
2.浏览器对脚本的支持被关闭
<!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>Document</title>
</head>
<body>
<noscript>
<p>This page requires a Javascript-enabled browser.</p>
</noscript>
</body>
</html>
在浏览器禁用js,才可以显示noscript内的内容。
点个赞再走吧(_)