1.<script>元素
在HTML中插入JavaScript的主要方法,就是使用<script>元素
<script>有下列6个属性。
属性 | 描述 |
---|---|
async | 可选。表示应该立即下载脚本,但不妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。只对外部脚本文件有效。 |
charset | 可选。表示通过src属性指定的代码的字符集。由于大多数浏览器会忽略它的值,因此这个属性很少有人用。 |
defer | 可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。IE7及更早版本对嵌入脚本也支持这个属性 |
language | 已废弃。规定脚本语言,用type代替 |
src | 可选。表示包含要执行代码的外部文件。 |
type | 表示编写代码使用的脚本语言的内容类型。MIME类型 |
2.使用<script>元素的方式
2.1.1直接在页面中嵌入
<script type="text/javascript">
alert("hi");
</script>
注意:
- 包含在<script>元素内部的Javascript代码将被从上至下一次解释,解释器会解释一个函数的定义,然后将该 定义保存在自己的环境当中。在解释器对<script>元素内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载或显示。
- 在使用<script>嵌入Javascript代码的时候,记住不要在代码中任何地方出现‘</script>’字符串,浏览器会在加载时出现错误;当浏览器遇到字符串‘</script>’时,就会认为那是结束的</script>标签,可通过转义字符“\”解决这个问题
2.1.2外部Javascript文件
使用src属性,<script src=""></script>
注意:
- 在下载和解析外部Javascript文件时,页面的处理也会暂时暂停。
- 如果是在XHTML文档中,也可以代码结束的</script>标签,但HTML中不能,不符合HTML规范,也得不到浏览器的正确解析。
- 带有src属性的<script>元素不应该在其<script></script>标签之间再包含额外的Javascript代码。如果包含了嵌入的代码,则只会下载并执行外部脚本文件,嵌入的代码被忽略。
- src属性可指向当前HTML页面所在域之外的某个域中的完整的URL。
3.<script>标签的位置
3.1.1放在页面的<head>元素中
<head>
<meta charset="UTF-8">
<title></title>
<script src=""></script>
</head>
这种做法的目的是把所有外部文件(包括CSS文件和Javascript文件)的引用都放在相同的地方。可是,在文档的<head>元素中包含所有Javascript文件,意味着必须等到全部Javascript代码都被下载,解析和执行完成以后,才能开始呈现页面的内容。(浏览器在遇到<body>标签时才开始呈现内容)。所以这种做法会导致 浏览器在呈现页面时出现明显的延迟,而延迟期间的浏览器窗口将是一片空白。
3.1.2把全部的Javascript引用放在<body>标签闭合之前
<body>
<!--这里放内容-->
<script src=""></script>
</body>
在解析包含的Javascript代码之前,页面的内容将完全呈现在浏览器中。提高用户体验。
4.延迟脚本和异步脚本
4.1延迟脚本(defer属性)
这个属性的用途是表明脚本在执行时不会影响页面的构造,也就是说,脚本会被延迟到整个页面都解析完毕后再运行,无论是放在头部或者body的任何位置。
<head>
<meta charset="UTF-8">
<title></title>
<script src="ex1" type="text/javascript" defer="defer" ></script>
<script src="ex2" type="text/javascript" defer="defer" ></script>
</head>
如例子:<script>标签虽然在头部,但是会延迟到浏览器遇到</html>后再执行。
HTML5规范要求脚本按照他们出现的先后顺序执行,因此第一个延迟脚本会先于第二个延迟脚本执行,而这两个脚本都会先于DOMContentLoaded事件触发前执行。
但现实中并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行,因此最好只包含一个延迟脚本。
4.2异步脚本(asycn属性)
- 与defer类似,但不保证按照他们的先后顺序执行
- 确保脚本之间不互相依赖,指定asycn属性的目的是不让页面等待两个脚本的下载和执行,从而异步加载页面其他内容。建议异步脚本不要在 加载期间修改DOM。
- 异步脚本一定会在load事件前执行,但可能DOMContentLoaded事件触发之前或之后执行。IE不支持。