Picses' sky

Picses' sky
posts - 43, comments - 29, trackbacks - 0, articles - 24

从本章中你可以了解到 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 的历史,使你了解到该语言的各个部分是如何发展而来的,以及历史上浏览器是如何处理各种标准的实现的。


只有注册用户登录后才能发表评论。


网站导航: