CH02:Browser 中的 JS

P.23
JS 是一種語言,但同時也是 web 開發的工具。所以你必須知道 JS 如何與 browser 互動。所以接下來會介紹 DOM 與 JS 操作 HTML。

JS 已經有一些年紀了,所以決大多數的 browser(IE、FX、Opera、Safari、Chrome)在執行 JS 的運作方式都相同。當然啦,如果仔細鑽研的話,還是有一卡車不同的地方。不過,普遍來說,browser 們還是嘗試用同樣的方式運作。嵌入頁面的 ECMAScript 語法、以及 DOM 的結構或多或少地趨向一致,這是好事,不然 JS 開發會非常難學。

DOM

CH1 已經介紹了 DOM 的概念,不過現在要更深入到細節,這樣你才能了解 script 的運作原理。DOM 提供 object 的表示法來操作所有 element 與頁面的 layout。技術上來說,browser 不需要 DOM 也可以呈現一個頁面,不過如果藥用 JS 來存取頁面上的資訊,就需要 DOM。在過去的歲月裡,browser 實做 DOM 的方式都不太相同,但這幾年在 W3C 的努力下,已經建立出標準(http://www.w3.org/DOM)。

P.24
一個沒有內文、僅有最基本結構的 HTML 文件會長得像這樣:

<html>
<head></head>
<body></body>
</html>

<html> 表示接下來會是 HTML 的內容,接著的 <head> 內會有這分文件的一些資訊,例如 title、搜尋關鍵字、以及其他與內容無關的 meta data。layout 與內文是放在後頭的 <body> 中。在 JS 中,你可以用一個 global 的 object document 來存取 DOM。例如:要存取 body 這個 element 就用 document.body、而要用字串的方式存取 <body> 內的 HTML 就用 document.body.innerHTML。這就是 DOM 的能耐,只要你把頁面想像成一個階層式的 object model,它就可以轉變成 JS 中的 object。

把上述的程式碼轉成 object 階層圖,就會是:

為了教學目的,我們加上 <h1> 這個 element:

<html>
<head></head>
<body>
    <h1>Hello World</h1>
</body>
</html>

重新把上面的程式碼轉換成下面這張圖:

雖然只加了一個 <h1> 跟一些字,但 object 階層圖多了一些結構上的變化:像 <h1> 有一個 #text 的 child node。在 CH13 你還會看到一卡車這樣的東西。

p.25

SCRIPT element

<script> 是一個 HTML 的 element,可以用下列兩種方式將 JS 嵌入到網頁中:
  • 直接寫在網頁內
  • 指向(引入)外部的 script 文件
下面這張表包括了這個 element 普遍支援的 attribute;
 property 名稱 瀏覽器支援 描述
typeCH1+, FX1+, IE5+, NN4+, O5+, SF1+指定 script 的語言。值通常為 text/ecmascript text/javascript application/ecmascript application/javascript text/vbscript。技術上來說,text/javascript 這個值簡直就是廢話,但是在還沒有支援 application/javascript 的早期 IE 中還是有點用。在 XHTML 當中,這個 attribute 是必備的。
charsetCH1+, FX1+, IE5+, NN4+, O5+, SF1+指定顯示的字元編碼。預設值為 ISO-8859-1,常見值為 UTF-8。這只有在引用外部 JS 檔(src 這個 attribute)時才有用。
deferIE5+ 是否要在 DOM 載入完畢之後才執行 script。例如:defer="defer"
languageCH1+, FX1+, IE5+, NN4+, O5+, SF1+另一個只應 script 語言的方式,常見值為 Javascript JavaScript1.1 JavaScript1.2 JavaScript1.3 JScript VBScript vbs。這個 attribute 已經不建議繼續使用了,你應該改用 type
srcCH1+, FX1+, IE5+, NN4+, O5+, SF1+指定外部 script 檔案的 URL。當你需要在很多頁面中執行同一個 script 就很有用,因為這樣就不用重複寫相同的 script。絕對路徑(http://psmonkey.org/script.js)跟相對路徑(../js/script.js)的寫法都可以。

p.26
下面是 script 直接寫在網頁上的範例:

<html>
<head></head>
<body>
    <h1>Hello World</h1>
    <script type="text/javascript">
        alert('PS is 87 monkey!);
    </script>
</body>
</html>

如果是用外部檔案,那會長得像這樣:

<html>
<head>
    <script src="/js/script.js" type="text/javascript"></script>
</head>
<body></body>
</html>

你可以把程式碼放在 <head><body> 裡頭。通常如果用 src 來引用外部 script,我們就會放在 <head> 當中。如果你擔心下載外部 script 會拖慢頁面載入的速度,那你可以改放在 </body> 前。

src 將 JavaScript 嵌入頁面有很多優點,其一是程式碼會被存入 cache。正常來說,當 browser 下載過一次後就會存在儲存裝置內,下次有需要時就可以直接拿來用——也就是說,不用每次載入頁面時都再下載一次 script。對於特大的 script 而言,這可以大幅改善頁面載入效能。

多年來,browser 會支援其中一種 script 格式,而語言之間的差異很少。M$ 甚至支援另一種叫做 VBScript 的 script 語言。上頭已經教過如何強制指定 browser 用哪種語言來解讀 script 的方法。現在所有先進的 browser 會預設語言是 JavaScript(預設相容於 ES3)

稍後將會提到使用 GZIP 壓縮外部 script 來節省下載時湮的議題。在舊版的 FX 跟 NN,只有在 <head> 引用外部 script 才能使用這個功能。1.2 版以後的 JavaScript 就沒這個限制了。


p.27
Comments