使用<script>元素的方式有2種javascript
一、直接在頁面嵌入JavaScript代碼 <script type="text/javascript"> function sayHi() { alert("Hello!"); } </script> 包含在<script>元素內部的JavaScript代碼將被從上至下依次解釋,在解釋器<script>元素內部全部代碼求值完畢之前,頁面中的其他內容都不會被瀏覽器加載或顯示 在使用<script>嵌入JavaScript代碼時,記住不在要代碼中任何地方出現」</script>」字符串,例如,瀏覽器在加載下面所示代碼時就會產生一個錯誤 <script type="text/javascript"> function sayScript() { alert("</script>"); } </script> 由於瀏覽器遇到字符串"</script>"時,會認爲那是結束的</script>標籤,而經過把字符串分割爲2部分能夠解決這個問題,如: <script type="text/javascript"> function sayScript() { alert("</scr"+"ipt>"); } </script> 二、經過<script>元素包含外部的JavaScript文件 <script type="text/javascript" src="js/login.js"></script> 注:帶有src屬性的<script>元素不該該在其<script>和</script>標籤之間再包含額外的JavaScript代碼 另外,經過<script>元素的src屬性還能夠包含來自外部域的JavaScript文件,這一點既使<script>元素倍顯強大,又讓它備受爭議。<script>與<img>元素很是類似,即它的src屬性能夠指入當前HTML頁面所在的域以外的某個域中的URL,例如 <script type="text/javascript" src="http://www.somewhere.com/afile.js"></script> 這樣,位於外部域中的代碼也會被加載和解析,就像這些代碼位於加載它們的頁面中同樣。利用這一點能夠在必要時經過不一樣的域來提供JavaScript文件,不過,在訪問本身不能控制的服務器上的JavaScript文件則要多加當心,不然文件中的代碼隨時有可能被替換 不管如何包含代碼,瀏覽器都會按照<script>元素在頁面中出現的前後順序對它們依次進行解析,在第一個<script>元素包含的代碼解析完成後,第二個<script>包含的代碼纔會被解析…… 標籤的位置 習慣放於HTML頁面的<head>標籤中 但這樣作有時會引發如<head></head>中的外部JS文件沒解析完,延遲期間瀏覽器窗口空白,或者是JS在執行中,出現空對象異常(緣由是HTML元素未加載到頁面中),所以如今的WEB應用程序通常都把所有的JS引用放在<body>元素中,放在頁面內容的後面。 延遲腳本 <script type="text/javascript" src="js/login.js" defer=」defer」></script> Defer這個屬性表示腳本會被延遲到整個頁面都解析完畢再運行。實際上與上面介紹的把JS放在頁面最底部的效果是同樣的。 但不是全部瀏覽器都支持defer屬性,所以 建議使用「把JS引用放在<body>元素中,放在頁面內容的後面」這個方法 在XHTML中的用法 可擴展超文本標記語言,即XHTML(Extensible HyperText Markup Language),是將HTML做爲XML的應用而從新定義的一個標準,編寫XHTML代碼的規則要比編寫HTML嚴格得多,並且直接影響可否在嵌入JavaScript代碼時使用<script />標籤。如下面的代碼塊爲例,雖然它們在HTML中是有效的,但在XHTML中則是無效的 <script type="text/javascript"> function compare(a,b) { if(a<b){ alert("a is less than b"); }else if(a>b){ alert("a is greater than b"); }else{ alert("a is equal to b"); } } </script> 這是因爲a<b中的小於號在XHTML中被看成一個標籤的開始,做爲標籤來說,小於號後面不能跟空格,所以致使語法錯誤 解決方法: 一、 用相應的HTML實體(<)替換代碼中全部的小於號(<),替換後代碼以下 <script type="text/javascript"> function compare(a,b) { if(a < b){ alert("a is less than b"); }else if(a>b){ alert("a is greater than b"); }else{ alert("a is equal to b"); } } </script> 二、 用一個CData片斷來包含JavaScript代碼,在XHTML(XML)中,CData片斷是文檔中一個特殊區域,這個區域中能夠包含不須要解析的任意格式的文本內容, <script type="text/javascript"> function compare(a,b)<![CDATA[ { if(a<b){ alert("a is less than b"); }else if(a>b){ alert("a is greater than b"); }else{ alert("a is equal to b"); } } ]]> </script> 在兼容XHTML的瀏覽器中,這個方法能夠解決問題,實際上很多瀏覽器不兼容XHTML,於是不支持CData片斷,怎麼辦呢?再使用JavaScript註釋將CData標記註釋掉就能夠了: <script type="text/javascript"> function compare(a,b) //<![CDATA[ { if(a<b){ alert("a is less than b"); }else if(a>b){ alert("a is greater than b"); }else{ alert("a is equal to b"); } } //]]> </script> 這種格式在全部現代瀏覽器均可以正常使用,它能經過XHTML驗證,並且對XHTML以前的瀏覽器也會平穩退化 不推薦使用的語法 <script><!-- function sayHi(){ alert("Hello!"); } //--></script> 讓不支持<script>元素的瀏覽器可以隱藏嵌入javascript代碼。 因爲如今全部瀏覽器都支持javascript,所以不必再用這種格式了 嵌入代碼與外部文件 在HTML嵌入javascript代碼雖然沒有問題,但通常認爲最好的作法仍是儘量使用外中文件,優勢以下 可維護性-遍佈不一樣HTML頁面的javascript代碼會形成維護問題,但把全部javascript文件都放在一個文件夾中,維護起來就輕鬆多了,開發人員所以也可以在不觸及HTML標記的狀況下,集中精力編輯javascript代碼 可緩存-瀏覽器可以根據具體的設置緩存連接的全部外部JS文件,也就是說,若是有2個頁面都使用同一JS文件,這個文件只須下載一次,最終結果就是可以加快頁面加載的速度 可適應將來-經過外部文件來包含javascript無須使用前面提到的XHTML或註釋hack,HTML和XHTML包含外部文件的語法是相同的 2、文檔模式 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 最初的2種文檔模式是:混雜模式(quirks mode)和標準模式(standards mode),這2種模式主要影響CSS內容的呈現,但在某些狀況也會影響JavaScript的解釋執行。 若是在HTML文檔開始處沒有文檔類型聲明,瀏覽器會默認開啓混雜模式,但採用混雜模式不是值得推薦的作法,由於不一樣瀏覽器的混雜模式行爲差別很是大,若是不使用某些hack技術,跨瀏覽器的一致性就沒法實現 3、<noscript>元素 當瀏覽器不支持JS時,使用<noscript>元素顯示替代的內容 <noscript>元素能夠包含可以出如今<body>中的任何HTML元素-<script>元素除外 包含在<noscript>元素中的內容只有在 瀏覽器不支持腳本或 瀏覽器支持腳本,但腳本被禁用這2種狀況下才會顯示出來,除此外的其餘狀況下,瀏覽器都不會呈現<noscript>中的內容 4、小結 把JavaScript插入到HTML頁面中要使用<script>元素,使用這個元素能夠把JavaScript嵌入到HTML頁面中,讓腳本與標記混合在一塊兒;也能夠包含外部的JavaScript文件,而咱們須要注意的地方有: 一、這2種方式都須要把type屬性設置爲 text/javascript,以代表使用的腳本語言是JavaScript 二、在包含外部JavaScript文件時,必須將src屬性設置爲指定相應文件的URL,而這個文件便可以是同一服務器上的文件,也能夠是其餘任何域中的文件 三、全部<script>元素會按照它們在頁面中出現的前後順序依次被解析,只有在解析完前面<script>元素的代碼以後,纔會開始解析<script>元素中的代碼 四、瀏覽器在呈現後面的頁面內容以前,必須先解析前面的<script>元素中的代碼,爲此,通常將<script>元素放在頁面內容以後和</body>標籤以前 五、在IE中,經過defer屬性可讓瀏覽器呈現完文檔以後再執行腳本,雖然defer屬性是HTML4.01規定的,但只有IE支持該屬性 六、<noscript>元素能夠指定在不支持腳本或禁用腳本的瀏覽器中顯示的替代內容,但在啓用了腳本的狀況下,瀏覽器不會顯示<noscript>元素中的任何內容