`
java虫
  • 浏览: 532491 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)JavaScript高级程序设计---第1章: 历史简述

阅读更多
      当JavaScript在1995年首次出现时,它的主要目的还只是处理一些输入的有效性验证,而在此之前这个工作是留给诸如Perl之类的服务器端语言来完成的。之前,要确定一个特定的字段是否空缺或者输入的值是否无效,必须与服务器进行往返的交互。Netscape Navigator 通过引入JavaScript 来试图改变这种情况。这种直接在客户端处理一些基本的有效性验证的能力,在刚普及使用电话线调制解调器(28.8kbit/s的速率)的时代,可是一个令人振奋的新特性。但以如此慢的速度与服务器往返交互,对耐性是一种考验。
      从那以后,JavaScript便成长为市面上每一个主要Web浏览器都具备的重要特性。同时JavaScript不仅仅局限于简单的数据有效性验证,现在几乎可以与浏览器窗口及其内容的每一个方面进行交互。微软公司在早期版本的浏览器中仅支持自己的客户端脚本语言——VBScript,但最后也不得不加入了自己的JavaScript实现。
从本章中你可以了解到JavaScript是如何以及为何出现的,从它简陋的开始到如今涵盖各种特性的实现。为了能充分发挥JavaScript全部的潜力,了解它的本质、历史及局限性是十分重要的。确切地说,本章着重讲解:
一.JavaScript和客户端脚本编程的起源;
二. JavaScript语言的不同部分;
三. 与JavaScript相关的标准;
四. 主流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):
1.. 核心(ECMAScript)
2. 文档对象模型(DOM)
3. 浏览器对象模型(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描述了以下内容:
-语法;
- 类型;
- 语句;
- 关键字;
- 保留字;
- 运算符;
-对象。
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新模块,用于处理新的接口类型:
- DOM视图——描述跟踪文档的各种视图(即CSS样式化之前和CSS样式化之后的文档)的接口;
- DOM事件——描述事件的接口;
- DOM样式——描述处理基于CSS样式的接口;
- 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.0Netscape 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(部分)
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的一部分。这些扩展包括:
-弹出新的浏览器窗口;
-移动、关闭浏览器窗口以及调整窗口大小;
- 提供Web浏览器详细信息的导航对象;
- 提供装载到浏览器中页面的详细信息的定位对象;
-提供用户屏幕分辨率详细信息的屏幕对象;
- 对cookie的支持;
-IE扩展了BOM,加入了ActiveXObject类,可以通过JavaScript实例化ActiveX对象。
由于没有相关的BOM标准,每种浏览器都有自己的BOM实现。有一些事实上的标准,如具有一个窗口对象和一个导航对象,不过每种浏览器可以为这些对象或其他对象定义自己的属性和方法。本书第5章详细介绍了这些实现的不同之处。
1.3  小结
本章介绍了JavaScript这种客户端Web浏览器脚本语言。你已经了解了构成JavaScript完整实现的各个部分:
- JavaScript的核心ECMAScript描述了该语言的语法和基本对象;
-DOM描述了处理网页内容的方法和接口;
-BOM描述了与浏览器进行交互的方法和接口。
此外,本章还探讨了JavaScript的历史,使你了解到该语言的各个部分是如何发展而来的,以及历史上浏览器是如何处理各种标准的实现的。
分享到:
评论

相关推荐

    python入门到高级全栈工程师培训 第3期 附课件代码

    第1章 01 计算机发展史 02 计算机系统 03 小结 04 数据的概念 05 进制转换 06 原码补码反码 07 物理层和数据链路层 08 网络层和arp协议 09 传输层和应用层 第2章 01 上节课复习 02 arp协议复习 03 字符编码 第3...

    asp.net知识库

    Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把...

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    第1章 服务器控件概述及开发环境部署 .1 1.1 自定义服务器控件 1 1.2 服务器控件在软件开发过程中的作用 1 1.3 在控件开发中提升自己 2 1.4 可继承控件基类介绍 2 1.5 运行一个简单的控件 7 1.5.1 开发一个...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    第1章 服务器控件概述及开发环境部署 .1 1.1 自定义服务器控件 1 1.2 服务器控件在软件开发过程中的作用 1 1.3 在控件开发中提升自己 2 1.4 可继承控件基类介绍 2 1.5 运行一个简单的控件 7 1.5.1 开发一个...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    第1章 服务器控件概述及开发环境部署 .1 1.1 自定义服务器控件 1 1.2 服务器控件在软件开发过程中的作用 1 1.3 在控件开发中提升自己 2 1.4 可继承控件基类介绍 2 1.5 运行一个简单的控件 7 1.5.1 开发一个...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

    第1章 服务器控件概述及开发环境部署.1 1.1 自定义服务器控件1 1.2 服务器控件在软件开发过程中的作用1 1.3 在控件开发中提升自己2 1.4 可继承控件基类介绍2 1.5 运行一个简单的控件7 1.5.1 开发一个简单控件7...

    Java面试宝典-经典

    1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...

    从入门到精通HTML5——PDF——网盘链接

     第1章 HTML基础 3  教学录像:22分钟  1.1 HTML的基本概念 4  1.2 HTML发展史 4  1.3 HTML的基本结构 5  1.3.1 HTML文件的编写方法 5  1.3.2 文件开始标签<html> 7  1.3.3 文件头部标签<head> ...

    最新Java面试宝典pdf版

    1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...

    Java面试笔试资料大全

    1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...

    java面试题大全(2012版)

    1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...

    JAVA面试宝典2010

    1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...

    java面试宝典2012

    1. 判断第二个日期比第一个日期大 89 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 90 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...

    Java面试宝典2012版

    1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字...

    Java面试宝典2010版

    1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...

    Java面试宝典2012新版

    1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...

Global site tag (gtag.js) - Google Analytics