用 ECMAscript 寫網頁
阿恆
ECMAscript,很多人對這個名字感到陌生,說穿了它其實即是 JavaScript。JavaScript 在 1995 年由 Netscape 和 Sun 聯合推出,儘管技術上來說 JavaScript 和 Java 語言毫無關係,但是從當年發布 JavaScript 的新聞公告中,不難看出兩間公司蓄意暗示伺服器端的 Java 語言與瀏覽器端的 JavaScript 有某些聯繫,顯然這是基於市場推廣的考慮,但無論如何,JavaScript 就是這樣誕生了。
當年 Netscape 仍然佔有瀏覽器市場大部分的份額,微軟的 IE 被逼開發與 JavaScript 相容的 JScript 來抗衡,嚴格來說 JScript 大部分情況下都與 JavaScript 相容,但兩者從未真正完全相容。
由於兩間公司的競爭性質,它們每次推出新版本的瀏覽器都會新增一些對方沒有的功能,目的是要網頁編寫人員為了製造炫目的網頁效果而不得不使用它們專有的功能,情況便與差不多同期發生的 Java 和 J++ 如出一轍,JavaScript 和 JScript 的衝突無非是 Netscape 和微軟兩件公司為了爭奪經濟利益而作出的,除了對這兩件公司之外,整件事對任何人都沒有好處。其實這兩間公司為了保持與對手兼容,又要不斷創造新的功能,開發成本也有增無減。
這時一個很明顯的出路就是把 JavaScript 標準化,1996 年 Netscape 把 JavaScript 的語言規格呈交給 ECMA 國際,並於 1997 年 6 月被接納成為業界的標準。現時最新的版本已經發展到 ECMAScript 第三版(1999),編號是 ECMA-262,也稱為 JavaScript 1.5,在 ISO 的編號是 ISO/IEC 16262。
規範化的工作很遺憾地未能停止戰爭,JavaScript 和 JScript 固然與 ECMAScript 兼容,但是兩者仍然不斷新增獨有的功能,兩種語言背後的公司也藉著兩者的差異鼓動開發人員在他們的頁面中加上「本網頁在 XXX 瀏覽器上觀看可得出最佳效果」的標語。
開發人員為了使自己的網頁可以在最多的瀏覽器上觀看,被逼透過檢測瀏覽器的版本來決定發送甚麼資料到瀏覽器,他們最主要的方法就是在伺服器檢查 user-agent 的字串:
|
|
這個字串由瀏覽器送給伺服器,很多開發人員藉著檢查這個字串是否「Mozilla/X.0」來判斷用戶是否使用 Netscape,不是的話很多特殊的功能便會被移除或者關閉,結果是很多網頁在非 Netscape 的瀏覽器上不是排版出錯就是根本無法顯示,作為一個弱勢的瀏覽器,IE 試圖變更 user-agent 字串來冒充 Mozilla!其他較新的瀏覽器如 Opera、iCab、Konqueror 等都採取同一個策略來欺騙伺服器,有些甚至容許用戶選擇想冒充哪一個牌子的瀏覽器。
這種情況產生了一個必然的後果,就是網頁的內容很大部分用來判斷不同牌子的瀏覽器,然後根據結果執行相對應的程式,即使是同一個牌子的瀏覽器,但不同版本的也會支援不同的功能,網頁中充斥了做著相同的工作,但針對不同瀏覽器的程式片段,令下載的時間延長,也浪費了頻寬。
除了使用 user-agent 字串外,有些程式藉著檢查某些特定的語言功能來決定瀏覽器的牌子和版本,例如用:
|
|
來判斷 Netscape 4;用:
|
|
來判斷 IE;用:
|
|
來判斷 Mozilla/Firefox。隨著瀏覽器的演進,這些判斷方法也要跟著修改,所以使用這些方法並非長久之計。
展望未來,ECMAScript 第四版,也就是 JavaScript 2.0,將會是下一個推出的標準,JavaScript 2.0 在兼容 ECMAScript 第四版之餘相信會有額外的功能。
在當前這個瀏覽器戰國時代,作為一個開發人員最大的保障就是編寫符合 ECMAScript 第三版的網頁,為了應付不同的瀏覽器而加入一大堆專門的函式,不啻是自找麻煩,更大的問題是我們連一個判斷瀏覽器的可靠方法也沒有。