当JavaScript在1995年首次出现时,它的主要目的还只是处理一些输入的有效性验证,而在此之前这个工作是留给诸如Perl之类的服务器端语言来完成的。之前,要确定一个特定的字段是否空缺或者输入的值是否无效,必须与服务器进行往返的交互。Netscape Navigator 通过引入JavaScript 来试图改变这种情况。这种直接在客户端处理一些基本的有效性验证的能力,在刚普及使用电话线调制解调器(28.8kbit/s的速率)的时代,可是一个令人振奋的新特性。但以如此慢的速度与服务器往返交互,对耐性是一种考验。
从那以后,JavaScript便成长为市面上每一个主要Web浏览器都具备的重要特性。同时JavaScript不仅仅局限于简单的数据有效性验证,现在几乎可以与浏览器窗口及其内容的每一个方面进行交互。微软公司在早期版本的浏览器中仅支持自己的客户端脚本语言——VBScript,但最后也不得不加入了自己的JavaScript实现。
从本章中你可以了解到JavaScript是如何以及为何出现的,从它简陋的开始到如今涵盖各种特性的实现。为了能充分发挥JavaScript全部的潜力,了解它的本质、历史及局限性是十分重要的。确切地说,本章着重讲解:
一.JavaScript和客户端脚本编程的起源;
二. JavaScript语言的不同部分;
三. 与JavaScript相关的标准;
四. 主流Web浏览器中的JavaScript支持。
1.1 历史简述
![](https://i-blog.csdnimg.cn/blog_migrate/6a585ff683c999e21e7771c49efca464.png)
当网上冲浪越来越流行时,对于开发客户端脚本的需求也逐渐增大。此时,大部分因特网用户还仅仅通过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的全新脚本语言。
![](https://i-blog.csdnimg.cn/blog_migrate/473b07b2c320690e543da7e1107142ce.png)
尽管ECMAScript是一个重要的标准,但它并不是JavaScript唯一的部分,当然,也不是唯一被标准化的部分。实际上,一个完整的JavaScript实现是由以下3个不同部分组成的(见图1-1):
1.. 核心(ECMAScript)
2. 文档对象模型(DOM)
3. 浏览器对象模型(BOM)
![](https://i-blog.csdnimg.cn/blog_migrate/9f4627ef547d0970266c9eb2186731a3.png)
图 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描述了以下内容:
-语法;
- 类型;
- 语句;
- 关键字;
- 保留字;
- 运算符;
-对象。
![](https://i-blog.csdnimg.cn/blog_migrate/6ad9de4e120c95776d5aa2d13708bbfb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1fce89e9075073c72bad1c87e40d9a79.png)
图 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页面:
![](https://i-blog.csdnimg.cn/blog_migrate/c1eda8d7d342303dcfa31c0c725f1349.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c28b292cda493ae4ce0c8888f3a5d647.png)
这段代码可以用DOM绘制成一个节点层次图(如图1-3所示)。
![](https://i-blog.csdnimg.cn/blog_migrate/4ee78beb3c6a77495e76fff469ab2607.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a269b9491b59b0aede2921624192c820.png)
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新模块,用于处理新的接口类型:
- DOM视图——描述跟踪文档的各种视图(即CSS样式化之前和CSS样式化之后的文档)的接口;
- DOM事件——描述事件的接口;
- DOM样式——描述处理基于CSS样式的接口;
- DOM遍历和范围——描述遍历和操作文档树的接口。
![](https://i-blog.csdnimg.cn/blog_migrate/85c902b6de4c37b151f57038adce2583.png)
在学习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都给对应语言添加了特有的方法和接口:
-可缩放矢量图形(SVG)1.0;
-数学标记语言(MathML)1.0;
- 同步多媒体集成语言(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(部分)
|
![]() |
Level 1
|
1.2.3 BOM
IE 3.0和Netscape Navigator 3.0提供了一种特性——BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作。使用BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。使BOM独树一帜且又常常令人怀疑的地方在于,它只是JavaScript实现的一部分,没有任何相关的标准。
BOM主要处理浏览器窗口和框架,不过通常浏览器特定的JavaScript扩展都被看作BOM的一部分。这些扩展包括:
-弹出新的浏览器窗口;
-移动、关闭浏览器窗口以及调整窗口大小;
- 提供Web浏览器详细信息的导航对象;
- 提供装载到浏览器中页面的详细信息的定位对象;
-提供用户屏幕分辨率详细信息的屏幕对象;
- 对cookie的支持;
-IE扩展了BOM,加入了ActiveXObject类,可以通过JavaScript实例化ActiveX对象。
由于没有相关的BOM标准,每种浏览器都有自己的BOM实现。有一些事实上的标准,如具有一个窗口对象和一个导航对象,不过每种浏览器可以为这些对象或其他对象定义自己的属性和方法。本书第5章详细介绍了这些实现的不同之处。
1.3 小结
本章介绍了JavaScript这种客户端Web浏览器脚本语言。你已经了解了构成JavaScript完整实现的各个部分:
- JavaScript的核心ECMAScript描述了该语言的语法和基本对象;
-DOM描述了处理网页内容的方法和接口;
-BOM描述了与浏览器进行交互的方法和接口。
此外,本章还探讨了JavaScript的历史,使你了解到该语言的各个部分是如何发展而来的,以及历史上浏览器是如何处理各种标准的实现的。