從本章中你可以了解到
JavaScript
是如何以及為何出現的,從它簡陋的開始到如今涵蓋各種特性的實現。為了能充分發揮
JavaScript
全部的潛力,了解它的本質、歷史及局限性是十分重要的。確切地說,本章著重講解:
q?
JavaScript
和客戶端腳本編程的起源;
q?
JavaScript
語言的不同部分;
q?
與
JavaScript
相關的標準;
q?
主流
Web
瀏覽器中的
JavaScript
支持。
當JavaScript
在
1995
年首次出現時,它的主要目的還只是處理一些輸入的有效性驗證,而在此之前這個工作是留給諸如
Perl
之類的服務器端語言來完成的。之前,要確定一個特定的字段是否空缺或者輸入的值是否無效,必須與服務器進行往返的交互。
Netscape Navigator
通過引入
JavaScript
來試圖改變這種情況。這種直接在客戶端處理一些基本的有效性驗證的能力,在剛普及使用電話線調制解調器(
28.8kbit/s
的速率)的時代,可是一個令人振奮的新特性。但以如此慢的速度與服務器往返交互,對耐性是一種考驗。
從那以后,
JavaScript
便成長為市面上每一個主要
Web
瀏覽器都具備的重要特性。同時
JavaScript
不僅僅局限于簡單的數據有效性驗證,現在幾乎可以與瀏覽器窗口及其內容的每一個方面進行交互。微軟公司在早期版本的瀏覽器中僅支持自己的客戶端腳本語言——
VBScript
,但最后也不得不加入了自己的
JavaScript
實現。
從本章中你可以了解到
JavaScript
是如何以及為何出現的,從它簡陋的開始到如今涵蓋各種特性的實現。為了能充分發揮
JavaScript
全部的潛力,了解它的本質、歷史及局限性是十分重要的。確切地說,本章著重講解:
q?
JavaScript
和客戶端腳本編程的起源;
q?
JavaScript
語言的不同部分;
q?
與
JavaScript
相關的標準;
q?
主流
Web
瀏覽器中的
JavaScript
支持。
1.1?
歷史簡述
大概在
1992
年,一家稱作
Nombas
的公司開始開發一種叫做
C
減減(
C-minus-minus
,簡稱
Cmm
)的嵌入式腳本語言。
Cmm
背后的理念很簡單:一個足夠強大可以替代宏操作(
macro
)的腳本語言,同時保持與
C
(和
C++
)足夠的相似性,以便開發人員能很快學會。這個腳本語言捆綁在一個叫做
CEnvi
的共享軟件產品中,它首次向開發人員展示了這種語言的威力。
Nombas
最終把
Cmm
的名字改成了
ScriptEase
,原因是后面的部分(
mm
)聽起來過于“消極”,同時字母
C
“令人害怕”(
http://www.nombas.com/us/scripting/history.htm
)。現在
ScriptEase
已經成為了
Nombas
產品背后的主要驅動力。當
Netscape Navigator
嶄露頭角時,
Nombas
開發了一個可以嵌入網頁中的
CEnvi
的版本。這些早期的試驗稱為
Espresso Page
(濃咖啡般的頁面),它們代表了第一個在萬維網上使用的客戶端腳本語言。而
Nombas
絲毫沒有料到它的理念將會成為因特網的一塊重要基石。
當網上沖浪越來越流行時,對于開發客戶端腳本的需求也逐漸增大。此時,大部分因特網用戶還僅僅通過
28.8kbit/s
的調制解調器來連接到網絡,即便這時網頁已經不斷地變得更大和更復雜。而更加加劇用戶痛苦的是,僅僅為了簡單的表單有效性驗證,就要與服務器端進行多次的往返交互。設想一下,用戶填完一個表單,點擊提交按鈕,等待了
30
秒鐘的處理后,看到的卻是一條告訴你忘記填寫一個必要的字段。那時正處于技術革新最前沿的
Netscape
,開始認真考慮一種開發客戶端腳本語言來解決簡單的處理問題。
當時工作于
Netscape
的
Brendan Eich
,開始著手為即將在
1995
年發行的
Netscape Navigator 2.0
開發一個稱之為
LiveScript
的腳本語言,當時的目的是同時在瀏覽器和服務器(本來要叫它
LiveWire
的)端使用它。
Netscape
與
Sun
公司聯手及時完成
LiveScript
實現。就在
Netscape Navigator 2.0
即將正式發布前,
Netscape
將其更名為
JavaScript
,目的是為了利用
Java
這個因特網時髦詞匯。
Netspace
的賭注最終得到回報,
JavaScript
從此變成了因特網的必備組件。
因為
JavaScript 1.0
如此成功,
Netscape
在
Netscape Navigator 3.0
中發布了
1.1
版。恰巧那個時候,微軟決定進軍瀏覽器,發布了
IE 3.0
并搭載了一個
JavaScript
的克隆版,叫做
JScript
(這樣命名是為了避免與
Netscape
潛在的許可糾紛)。微軟步入
Web
瀏覽器領域的這重要一步雖然令其聲名狼藉,但也成為
JavaScript
語言發展過程中的重要一步。
在微軟進入后,有
3
種不同的
JavaScript
版本同時存在:
Netscape Navigator 3.0
中的
Java- Script
、
IE
中的
JScript
以及
CEnvi
中的
ScriptEase
。與
C
和其他編程語言不同的是,
JavaScript
并沒有一個標準來統一其語法或特性,而這
3
種不同的版本恰恰突出了這個問題。隨著業界擔心的增加,這個語言標準化顯然已經勢在必行。
1997
年,
JavaScript 1.1
作為一個
草案提交
給歐洲計算機制造商協會(
ECMA
)。第
39
技術委員會(
TC39
)被委派來“標準化一個通用、跨平臺、中立于廠商的腳本語言的語法和語義”(
http://www.ecma-international.org/memento/TC39.htm
)。由來自
Netscape
、
Sun
、微軟、
Borland
和其他一些對腳本編程感興趣的公司的程序員組成的
TC39
錘煉出了
ECMA-262
,該標準定義了叫做
ECMAScript
的全新腳本語言。
在接下來的幾年里,國際標準化組織及國際電工委員會(
ISO/IEC
)也采納
ECMAScript
作為標準(
ISO/IEC-16262
)。從此,
Web
瀏覽器就開始努力(雖然有著不同程度的成功和失敗)將
ECMAScript
作為
JavaScript
實現的基礎。
盡管
ECMAScript
是一個重要的標準,但它并不是
JavaScript
唯一的部分,當然,也不是唯一被標準化的部分。實際上,一個完整的
JavaScript
實現是由以下
3
個不同部分組成的(見圖
1-1
):
q?
核心(
ECMAScript
);
q?
文檔對象模型(
DOM
);
q?
瀏覽器對象模型(
BOM
)。
圖
? 1-1
1.2.1
? ECMAScript
ECMAScript
并不與任何具體瀏覽器相綁定,實際上,它也沒有提到用于任何用戶輸入輸出的方法(這點與
C
這類語言不同,它需要依賴外部的庫來完成這類任務)。那么什么才是
ECMAScript
呢?
ECMA-262
標準(第
2
段)的描述如下:
“ECMAScript
可以為不同種類的宿主環境提供核心的腳本編程能力,因此核心的腳本語言是與任何特定的宿主環境分開進行規定的……”
Web
瀏覽器對于
ECMAScript
來說是一個宿主環境,但它并不是唯一的宿主環境。事實上,還有不計其數的其他各種環境(例如
Nombas
的
ScriptEase
和
Macromedia
同時用在
Flash
與
Director MX
中的
ActionScript
)可以容納
ECMAScript
實現。那么
ECMAScript
在瀏覽器之外規定了些什么呢?簡單地說,
ECMAScript
描述了以下內容:
q?
語法;
q?
類型;
q?
語句;
q?
關鍵字;
q?
保留字;
q?
運算符;
q?
對象。
ECMAScript
僅僅是一個描述,定義了腳本語言的所有屬性、方法和對象。其他的語言可以實現
ECMAScript
來作為功能的基準,
JavaScript
就是這樣(見圖
1-2
)。
圖
? 1-2
每個瀏覽器都有它自己的
ECMAScript
接口的實現,然后這個實現又被擴展,包含了
DOM
和
BOM
(在以下幾節中再討論)。當然還有其他實現并擴展了
ECMAScript
的語言,例如
Windows
腳本宿主(
Windows Scripting Host
,
WSH
)、
Macromedia
的
Flash
與
Director MX
中的
ActionScript
,以及
Nombas ScriptEase
。
1
.
ECMAScript
的版本
ECMAScript
分成幾個不同的版本,它是在一個叫做
ECMA-262
的標準中定義的。和其他標準一樣,
ECMA-262
會被編輯和更新。當有了主要更新時,就會發布一個標準的新版。最新
ECMA-262
的版本是第三版,于
1999
年
12
月發布。
ECMA-262
的第一個版在根本上是和
Netscape
的
JavaScript 1.1
一樣的,只是把所有與瀏覽器相關的代碼刪除了,不過有一些小的調整。首先,
ECMA-262
要求對
Unicode
標準的支持(以便支持多語言)。第二,它要求對象是平臺無關的(
Netscape
的
JavaScript 1.1
事實上有不同的對象實現,例如
Date
對象,是依賴于平臺的)。這也是
JavaScript 1.1
和
1.2
為什么不符合
ECMA-262
規范第一版的主要原因。
ECMA-262
的第二版大部分更新本質上是編輯性的。這次標準的更新是為了與
ISO/IEC- 16262
的嚴格一致,也并沒有特別添加、更改和刪除內容。
ECMAScript
實現一般不會遵守第二版。
EMCA-262
第三版是該標準第一次真正的更新。它提供了對字符串處理、錯誤定義和數值輸出的更新。同時,它還增加了正則表達式、新的控制語句、
try...catch
異常處理的支持,以及一些為使標準國際化而做的小改動。一般來說,它標志著
ECMAScript
成為一種真正的編程語言的到來。
2
.何謂
ECMAScript
符合性
在
ECMA-262
中,
ECMAScript
符合性(
conformance
)有明確的定義。一個腳本語言必須滿足以下四項基本原則:
q?
符合的實現必須按照
ECMA-262
中所描述的支持所有的“類型、值、對象、屬性、函數和程序語法及語義”(
ECMA-262
,第
1
頁);
q?
符合的實現必須支持
Unicode
字符標準(
UCS
);
q?
符合的實現可以增加沒有在
ECMA-262
中指定的“額外的類型、值、對象、屬性和函數”。
ECMA-262
將這些增加描述為規范中未給定的新對象或對象的新屬性;
q?
符合的實現可以支持沒有在
ECMA-262
中定義的“程序和正則表達式語法”(意思是可以替換或者擴展內建的正則表達式支持)。
所有的
ECMAScript
實現必須符合以上標準。
3
.
Web
瀏覽器中的
ECMAScript
支持
含有
JavaScript 1.1
的
Netscape Navigator 3.0
在
1996
年發布。然后,
JavaScript 1.1
規范被作為一個新標準的草案提交給
ECMA
。有了
JavaScript
轟動性的流行,
Netscape
十分高興地開始開發
1.2
版。但有一個問題:
ECMA
并未接受
Netscape
的草案。在
Netscape Navigator 3.0
發布后不久,微軟就發布了
IE 3.0
。該版本的
IE
含有
JScript 1.0
(微軟自己的
JavaScript
實現的名稱),原本計劃可以與
JavaScript 1.1
相提并論。然而,由于文檔不全以及一些不當的重復特性,
JScript 1.0
遠遠沒有達到
JavaScript 1.1
的水平。
在
ECMA-262
第一版定稿之前,發布含有
JavaScript 1.2
的
Netscape Navigator 4.0
是在
1997
年,在那年晚些時候,
ECMA-262
標準被接受并標準化。因此,
JavaScript 1.2
并不和
ECMAScript
的第一版兼容,雖然
ECMAScript
應該基于
JavaScript 1.1
。
JScript
的下一步升級是
IE 4.0
中加入的
JScript 3.0
(
2.0
版是隨微軟的
IIS 3.0
一起發布的,但并未包含在瀏覽器中)微軟大力宣傳
JScript 3.0
是世界上第一個真正符合
ECMA
標準的腳本語言。而那時,
ECMA-262
還并沒有最終定稿,所以
JScript 3.0
也遭受了和
JavaScript 1.2
同樣的命運——它還是沒能符合最終的
ECMAScript
標準。
Netscape
選擇在
Netscape Navigator 4.06
中升級它的
JavaScript
實現。
JavaScript 1.3
使
Netscape
終于完全符合了
ECMAScript
第一版。
Netscape
加入了對
Unicode
標準的支持,并讓所有的對象保留了在
JavaScript 1.2
中引入的新特性的同時實現了平臺獨立。
當
Netscape
將它的源代碼作為
Mozilla
項目公布于眾時,本來計劃
JavaScript 1.4
將會嵌入到
Netscape Navigator 5.0
中。然而,一個冒進的決定——要完全從頭重新設計
Netscape
的代碼,
破壞了這個工作。
JavaScript 1.4
僅僅作為一個
Netscape Enterprise Server
的服務器端腳本語言發布,以后也沒有被放入瀏覽器中。
如今,所有的主流
Web
瀏覽器都遵守
ECMA-262
第三版。下面的表格列出了大部分流行
Web
瀏覽器中的
ECMAScript
支持:
??????????
瀏
?
覽
?
器
|
ECMAScript
符合性
|
Netscape Navigator 2.0
|
–
|
Netscape Navigator 3.0
|
–
|
Netscape Navigator 4.0–4.05
|
–
|
Netscape Navigator 4.06–4.79
|
Edition 1
|
Netscape 6.0+ (Mozilla 0.6.0+)
|
Edition 3
|
Internet Explorer 3.0
|
–
|
Internet Explorer 4.0
|
–
|
Internet Explorer 5.0
|
Edition 1
|
Internet Explorer 5.5+
|
Edition 3
|
Opera 6.0–7.1
|
Edition 2
|
Opera 7.2+
|
Edition 3
|
Safari 1.0+/Konqueror ~2.0+
|
Edition 3
|
1.2.2? DOM
DOM
(文檔對象模型)是
HTML
和
XML
的應用程序接口(
API
)。
DOM
將把整個頁面規劃成由節點層級構成的文檔。
HTML
或
XML
頁面的每個部分都是一個節點的衍生物。請考慮下面的
HTML
頁面:
這段代碼可以用
DOM
繪制成一個節點層次圖(如圖
1-3
所示)。
圖
? 1-3
DOM
通過創建樹來表示文檔,從而使開發者對文檔的內容和結構具有空前的控制力。用
DOM API
可以輕松地刪除、添加和替換節點。
1
.為什么
DOM
必不可少
自從
IE 4.0
和
Netscape Navigator 4.0
開始支持不同形式的動態
HTML
(
DHTML
),開發者首次能夠在不重載網頁的情況下修改它的外觀和內容。這是
Web
技術的一大飛躍,不過也帶來了巨大的問題。
Netscape
和微軟各自開發自己的
DHTML
,從而結束了
Web
開發者只編寫一個
HTML
頁面就可以在所有瀏覽器中訪問的時期。
業界決定必須要做點什么以保持
Web
的跨平臺特性,他們擔心如果放任
Netscape
和微軟公司這樣做,
Web
必將分化為兩個獨立的部分,每一部分只適用于特定的瀏覽器。因此,負責制定
Web
通信標準的團體
W3C
(
World Wide Web Consortium
)就開始制定
DOM
。
2
.
DOM
的各個
Level
DOM Level 1
是
W3C
于
1998
年
10
月提出的。它由兩個模塊構成,即
DOM Core
和
DOM HTML
。前者提供了基于
XML
的文檔的結構圖,以方便訪問和操作文檔的任意部分;后者添加了一些
HTML
專用的對象和方法,從而擴展了
DOM Core
。
注意,DOM
不是JavaScript
專有的,事實上許多其他語言都實現了它。不過,Web
瀏覽器中的DOM
已經用ECMAScript
實現了,現在是JavaScript
語言的一個很大組成部分。
DOM Level 1
只有一個目標,即規劃文檔的結構,
DOM Level 2
的目標就廣泛多了。對原始
DOM
的擴展添加了對鼠標和用戶界面事件
(DHTML
對此有豐富的支持
)
、范圍、遍歷(重復執行
DOM
文檔的方法)的支持,并通過對象接口添加了對
CSS
(層疊樣式表)的支持。由
Level 1
引入的原始
DOM Core
也加入了對
XML
命名空間的支持。
DOM Level 2
引入幾種
DOM
新模塊,用于處理新的接口類型:
q?
DOM
視圖——描述跟蹤文檔的各種視圖(即
CSS
樣式化之前和
CSS
樣式化之后的文檔)的接口;
q?
DOM
事件——描述事件的接口;
q?
DOM
樣式——描述處理基于
CSS
樣式的接口;
q?
DOM
遍歷和范圍——描述遍歷和操作文檔樹的接口。
DOM Level 3
引入了以統一的方式載入和保存文檔的方法(包含在新模塊
DOM Load and Save
中)以及驗證文檔(
DOM Validation
)的方法,從而進一步擴展了
DOM
。在
Level 3
中,
DOM Core
被擴展為支持所有的
XML 1.0
特性,包括
XML Infoset
、
XPath
和
XML Base
.
在學習
DOM
時
,
可能會遇到有人引用
DOM Level 0
。注意
,
根本沒有
DOM Level 0
這個標準
,
它只是
DOM
的一個歷史參考點
(
DOM Level 0
指的是
IE 4.0
和
Netscape Navigator 4.0
中支持的原始
DHTML
)
。
3
.其他
DOM
除了
DOM Core
和
DOM HTML
外,還有其他幾種語言發布了自己的
DOM
標準。這些語言都是基于
XML
的,每種
DOM
都給對應語言添加了特有的方法和接口:
q?
可縮放矢量圖形(
SVG
)
1.0
;
q?
數學標記語言(
MathML
)
1.0
;
q?
同步多媒體集成語言(
SMIL
)。
此外,其他語言也開發了自己的
DOM
實現,如
Mozilla
的
XML
用戶界面語言(
XUL
)。不過,只有上面列出的幾種語言是
W3C
的推薦標準。
4
.
Web
瀏覽器中的
DOM
支持
DOM
在被
Web
瀏覽器開始實現之前就已經是一種標準了。
IE
首次嘗試支持
DOM
是在
5.0
版本中,不過其實直到
5.5
版本才具有真正的
DOM
支持,
IE 5.5
實現了
DOM Level 1
。從那時起,
IE
就沒有再引入新的
DOM
功能。
Netscape
直到
Netscape 6
(
Mozilla 0.6.0
)才引入
DOM
支持。目前,
Mozilla
具有最好的
DOM
支持,實現了完整的
Level 1
、幾乎所有的
Level 2
以及一部分
Level 3
。(
Mozilla
開發小組的目標是構造一個與標準
100
%兼容的瀏覽器,他們的工作得到了回報。)
Opera
直到
7.0
版本才加入
DOM
支持,還有
Safari
也實現了大部分
DOM Level 1
。它們幾乎都與
IE 5.5
處于同一水平,有些情況下,甚至超過了
IE 5.5
。不過,就對
DOM
的支持而論,所有瀏覽器都遠遠落后于
Mozilla
。下表列出了常用瀏覽器對
DOM
的支持。
?
瀏
?
覽
?
器
|
???????????? DOM
兼容性
|
Netscape Navigator 1.0-4.x
|
-
|
Netscape 6.0+ (Mozilla 0.6.0+)
|
Level 1
、
Level 2
、
Level 3
(部分)
|
IE 2.0-4.x
|
-
|
IE 5.0
|
Level 1
(最小)
|
IE 5.5+
|
Level 1
(幾乎全部)
|
Opera 1.0-6.0
|
-
|
Opera 7.0+
|
Level 1
(幾乎全部)、
Level 2
(部分)
|
Safari 1.0+/Konqueror ~2.0+
|
Level 1
|
1.2.3
? BOM
IE 3.0
和
Netscape Navigator 3.0
提供了一種特性——
BOM
(瀏覽器對象模型),可以對瀏覽器窗口進行訪問和操作。使用
BOM
,開發者可以移動窗口、改變狀態欄中的文本以及執行其他與頁面內容不直接相關的動作。使
BOM
獨樹一幟且又常常令人懷疑的地方在于,它只是
JavaScript
實現的一部分,沒有任何相關的標準。
BOM
主要處理瀏覽器窗口和框架,不過通常瀏覽器特定的
JavaScript
擴展都被看作
BOM
的一部分。這些擴展包括:
q?
彈出新的瀏覽器窗口;
q?
移動、關閉瀏覽器窗口以及調整窗口大小;
q?
提供
Web
瀏覽器詳細信息的導航對象;
q?
提供裝載到瀏覽器中頁面的詳細信息的定位對象;
q?
提供用戶屏幕分辨率詳細信息的屏幕對象;
q?
對
cookie
的支持;
q?
IE
擴展了
BOM
,加入了
ActiveXObject
類,可以通過
JavaScript
實例化
ActiveX
對象。
由于沒有相關的
BOM
標準,每種瀏覽器都有自己的
BOM
實現。有一些事實上的標準,如具有一個窗口對象和一個導航對象,不過每種瀏覽器可以為這些對象或其他對象定義自己的屬性和方法。本書第
5
章詳細介紹了這些實現的不同之處。
1.3?
小結
本章介紹了
JavaScript
這種客戶端
Web
瀏覽器腳本語言。你已經了解了構成
JavaScript
完整實現的各個部分:
q?
JavaScript
的核心
ECMAScript
描述了該語言的語法和基本對象;
q?
DOM
描述了處理網頁內容的方法和接口;
q?
BOM
描述了與瀏覽器進行交互的方法和接口。
此外,本章還探討了
JavaScript
的歷史,使你了解到該語言的各個部分是如何發展而來的,以及歷史上瀏覽器是如何處理各種標準的實現的。