经过我的多次测试得出test3每次都是error,这说明了不带这两个属性是一定会先于下面的文档加载执行的。test2每次都是success说明defer的确是有延迟执行的功能,而async有时候会先于文档下载有时候又不会,测试的时候也是两种情况都会发生。但是当我删掉test3的引入只留1,2时,1基本上都是跳success的,这里也解释不清楚。
如果是在HTML(XHTML可以)上面使用<script>元素,就必须有</script>结尾,切记千万不能用<script ……/>的方式,然后内部代码里面也不允许出现</script>字符,如果必须出现,需要用<\/script>来代替。如果带有src属性,又在内部码代码,嵌入的代码会别忽略。小tips,如果将外部文件(css和js文件)的引用都放在<head>元素内部,那么外部文件会先于页面内容被加载。这样会导致如果外部文件过大,那么用户在刷新页面的时候会出现一段时间的空白,造成不好的浏览体验。而将外部文件的引用放在<body>元素的后面能够规避这个问题,给用户带来网页速度变快了的错觉。再谈defer属性:如果一个文档中包含两个延迟执行的<script>元素,在html5中会按照其出现顺序进行执行,并且这两个脚本会先于DOMContentLoaded事件执行,但现实中,不一定会按照这个规则(个人猜测原因可能是其他非html5文档),故最好只包含一个延迟脚本。defer只适用外部脚本文件,意味着嵌入脚本是无法使用延迟执行这个功能的。事实上我稍微改了一下上面test.html的代码。最后的结果是不变且不会输出hello。再我把src去掉,把test2.js的代码嵌入进去后,打开页面的确是报error,这说明了嵌入代码是会忽略defer属性的。但是对于IE7之前的浏览器可能还有支持。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <!--<script src="test2.js" defer> alert("hello"); </script>--> <script defer> if (document.getElementsByTagName("test").length != 0) { alert("test2 success: " + document.getElementsByTagName("test")[0].innerHTML); } else { alert("test2 error"); } </script> <title>Title</title> </head> <body> <test>123456</test> </body> </html> 再谈async属性:只适用外部脚本!这个属性的意思是异步加载文件,意思很明确,额就是有时候比你下面的文件加载的快,有时候又比你慢,看心情,哈哈哈。鉴于这个特点,具有async属性的脚本是不应该去操作页面元素的,因为加载顺序看心情,这样怎么能放心。两个async的外部脚本之间的执行顺序也是未知的,所以async脚本之间需要保持互不依赖。异步脚本一定会在load事件前执行,但可能会在DOMContentLoaded事件触发前或后执行。支持async属性的浏览器有FireFox3.6,Safari5和Chrome。(在XHTML中要写成 async=”async” 但是我没试过)在XHTML中的用法: 可扩展超文本标记语言(Extensible HyperText Markup Language)是将HTML作为XMl的应用而重新定义的一个标准。编写XHTML比编写HTML严格得多。比如在XHTML中是不能直接使用一些字符的(‘<’, ‘>’),在XHTML中得用’<’,’>’来代替’<’, ‘>’的,这样会导致代码不太好理解,故可以用CData片段(<![CDATA[]]>)来包含js代码,如下: <script> <![CDATA[ function compare(a, b) { if (a < b) { alert(-1); } else if (a > b) { alert(1); } else { alert(0); } } ]]> </script>使用嵌入代码和外部文件的比较:嵌入js代码虽然没有问题,但是一般认为最好的做法还是尽可能使用外部文件来包含js代码。主要有以下三个优点:
可维护性:遍及不同HTML页面的js会造成维护问题,但把所有js文件放在同一个文件夹里,维护起来就轻松多了。而且开发人员因此也能够在不触及HTML标记的情况下,集中精力编辑js代码。可缓存:浏览器能够根据具体的设置缓存链接的所有外部js文件。也就是说,如果有两个页面使用同一个文件,那么这个文件只需下载一次。因此,最终结果就是能够加快页面加载的速度。适应未来:通过外部文件来包含js无须使用前面提到XHTML或注释hack。HTML和XHTML包含外部文件的语法是相同的。文档模式:IE5.5引入了文档模式的概念,而这个概念是通过使用文档类型(doctype)切换实现的。最初的两种文档模式是:混杂模式(quirks mode)和标准模式(standards mode)。混杂模式会让IE的行为与IE5相同,而标准模式则让IE的行为更接近标准行为。这两种模式主要影响css的呈现,某些情况下也会影响js的执行。
<noscript>元素:早期浏览器不支持js。这个元素可以包含能够出现在文档<body>中的任何HTML元素(<script>除外)。当浏览器不支持脚本,或者脚本被禁用时,<noscript>的内容才会显示出来。如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <noscript> <p>本页面需要浏览器支持java script</p> </noscript> </body> </html>