第二章 在HTML中使用JavaScript

《JavaScript高级程序设计》(第3版)学习笔记及心得。写于入门JS第9个月。

2.1 <script>元素

属性javascript

  • async: 可选。是否当即下载脚本,仅对外部脚本文件有效。html

  • charset: 可选。经过src属性指定代码的字符集。(不多用)java

  • defer: 可选。是否延迟到DOM彻底被解析和显示以后再执行。仅对外部脚本文件有效。浏览器

  • language: 已废弃。缓存

  • src: 可选。包含要执行代码的外部文件。带有此属性的<script>元素,浏览器不会再解析其<script>之间的代码。能够是外部域的地址,但要当心使用。app

  • type: 可选。编写代码使用的脚本语言的内容类型(MIME类型),默认text/javascript.less

  • 不少地方将async描述为“是否异步执行”,但毕竟还得看defer,因此我感受仍是《高程》里的描述准确些。异步

截取runoob.com中关于async属性的解释(http://www.runoob.com/tags/att-script-async.html):async

clipboard.png

使用<script>元素方式学习

  1. 直接在页面中嵌入JavaScript代码
    注意不要在代码中的任何位置出现</script>, 若是必定须要,能够用转义字符"\", 如"<\/script>".

  2. 包含外部JavaScript文件
    XHTML文档中能够省略关闭标签</script>, 但不符合HTML规范(得不到某些浏览器尤为是IE的正确解析).

2.1.1 标签的位置

传统的作法是把全部<script>元素放在<head>内,这样作意味着,必须等到所有JavaScript代码都被下载、解析和执行完成以后,才开始加载页面内容。因此对于JavaScript比较多的页面来讲,会致使浏览器在呈现页面时出现明显延时。

因此现代Web应用程序通常把JavaScript所有放在<body>最后。或者经过defer设置什么时候加载。

2.1.2 延迟脚本

设置defer="defer"后,当前脚本会优先于DOMContentLoaded事件【详见第十三章】执行)。注意:在现实中,延时脚本并不必定会按照顺序执行,也不必定会在DOMContentLoaded事件出发前执行,所以最好只包含一个延迟脚本。

2.1.3 异步脚本

  1. async属性。是否当即下载文件。亦不保证按照指定他们的前后顺序执行。

  2. 指定async属性的目的通常是:不让页面等待两个脚本下载和执行,从而异步加载页面其余内容。为此,建议异步脚本不要在其加载期间修改DOM.

  3. 异步脚本必定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发以前或以后执行。

  4. 支持的浏览器: Firefox 3.6+, Safari 5+ 和 Chrome.

2.1.4 在XHTML中的用法

可扩展超文本标记语言(XHTML), 是将HTML做为XML的应用而从新定义的饿一个标准。编写XHTML要比HTML严格得多,并且直接影响可否在嵌入JavaScript代码是使用<script/>标签。

<script>
    function compare(a, b){
        if(a < b){ //此处在XHTML中,"<"会被解析为下一个标签的开始
            alert("A is less than B");
        }else if(a > b){ 
            alert("A is greater than B");
        }elss{
            alert("A is equal to B");
        }
    }
</script>

解决方案:

1.用相应的HTML实体(<)替换代码中全部小于号(<), 如:

if(a &lt; b){}

2.用一个CData片断来包含JavaScript代码。在XHTML(XML)中,CData片断是文档中的一个特殊区域,这个区域能够包含不须要解析的任意格式的文本内容。如:

<script type="text/javascript">
<![CDATA[
function compare(a, b){
    if(a < b){ //此处在XHTML中,"<"会被解析为下一个标签的开始
        alert("A is less than B");
    }else if(a > b){ 
        alert("A is greater than B");
    }elss{
        alert("A is equal to B");
    }
}
]]>
//若须要解决有些浏览器不兼容XHTML、不支持CData片断,可使用注释将CData标记注释掉。
</script>

注:将页面的MIME类型指定为"application/xhtml+xml"的状况下会触发XHTML模式。并非全部浏览器都支持以这种方式提供XHTML文档。

2.2 嵌入代码与外部文件

外部文件有如下优势:

  • 可维护性

  • 可缓存

  • 适应将来(经过外部文件来包含JavaScript无需使用前面提到XHTML或注释hack。HTML和XHTML包含外部文件的语法是相同的)