第二章 在HTML中使用JavaScript
问题:如何做到让JavaScript既能与HTML页面共存,又不影响页面在浏览器中的呈现效果?
answer:为Web增加统一的脚本支持。
向HTML页面中插入JavaScript的主要办法,就是使用<script>元素。
HTML4.01为<script>定义了下列5个属性:
-charset:可选。表示通过src属性指定的代码的字符集。由于大多数浏览器会忽略它的值,因此这个属性很少有人用。
-defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。
-language:已废弃。原来用于表示编写代码中使用的脚本语言,大多数浏览器会忽视这个属性。
-src:可选。表示包含要执行代码的外部文件。
-type:必需。可以看成是language的代替属性,表示编写代码使用的脚本语言的内容类型。
1.包含在<script>元素内部的JavaScript代码将被从上至下依次解析。解析器会解析到一个函数的定义,然后将该定义保存在自己的环境中。在解析器对<script>元素内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载或显示。
2.在解析外部嵌入式JavaScript代码时,页面的处理会暂时停止。
3.浏览器会按照<script>元素在页面中出现的先后顺序对他们依次解析,即等第一个<script>元素包含的代码解析完成后,第二个<script>元素包含的代码才会被解析,然后才是第三个、第四个……
<script>的src属性可以指向当前HTML页面所在域之外的某个域中的URL,即可以通过不同的域来提供JavaScript文件。但是,在访问自己不能控制的服务器上的JavaScript文件时则要多加小心,可能会遇到恶意程序员替换该文件中的代码。因此,如果想包含来自不同域的代码,要么你是那个域的owner,要么那个域的所有者值得信赖。
标签的位置
如果在文档的<head>元素中包含所有JavaScript文件,就必须等全部的JavaScript代码都被下载。解析和执行完成以后,才能开始呈现页面的内容,导致在浏览器在呈现页面时出现明显的延迟,则浏览器窗口中将是一片空白。为了避免这个问题,Web应用程序都会把全部JavaScript引用放在<body>元素中,放在页面内容后面。
延迟脚本(defer属性)
<script>标签定义了defer属性,用途是表明在执行时不会影响页面的构造(JavaScript文件放在文档的<head>元素中),即脚本会被延迟到整个页面都解析完毕后再运行,与把<script>元素放在页面最底部的效果一样。
但是虽然我们把<script>元素放在了文档的<head>元素中,其中包含的脚本延迟到浏览器遇到</html>标签后再执行,不过,问题是并非所有的浏览器都支持defer属性,可能会被浏览器忽略这个属性。
在XHTML中的用法
可扩展超文本标记语言,即XHTML(Extensible HyperText Markup Language),是将HTML作为XML的应用而重新定义的一个标准。
在HTML中,有特殊的规则用以确定<script>元素中的哪些内容可以被解析,但是这些特殊的规则在XHTML中不适用,会在XHTML中出现类似的语法错误,例如语句中的小于号(<),会在XHTML中被当作开始一个新标签来解析。解决办法有两,一是用相应的HTML实体(<;)替换代码所有的小于号(<);二是用CData片段来包含JavaScript代码。
在XHTML中,CData片段是文档中的一个特殊区域,这个区域可以包含不需要解析的任意格式的文本内容。因此,在CData片段中就可以使用任意字符——小于号当然也没问题。
<script type="text/javascript">
//<![CDATA[
……(JavaScript代码)
//]]>
</script>
文档模式
文档模式概念是通过使用文档类型(doctype)切换实现的。
最初的两种文档模式是:混杂模式和标准模式。
HTML5的标准模式为<!DOCTYPE html>;如果在文档开始处没有发现文档声明,则所有浏览器都会默认开启混杂模式,一般不推荐这种做法,因为不同浏览器在这种文档模式下的行为差异非常大,不使用hack技术,跨浏览器的行为根本就没有一致性。
这两种模式主要影响CSS内容的呈现,但在某些情况下也会影响到JavaScript的解析执行。
<noscript>元素
问题:当浏览器不支持JavaScript时如何让页面平稳地退化。
解决方案是创造一个<noscript>元素,用以在不支持JavaScript浏览器中显示替代的内容。
使用<noscript>元素可以指定在不支持脚本的浏览器中显示的替代内容。但在启用了脚本的情况下,浏览器不会显示<noscript>元素中的任何内容。
网友评论