JavaScript的实现
尽管经常将JavaScript和ECMAScript用作同义词,但JavaScript不仅限于ECMA-262中定义的内容。实际上,完整的JavaScript实现由以下三个不同的部分组成(请参见图1-1):
➤核心(ECMAScript)
➤文档对象模型(DOM)
➤浏览器对象模型(BOM)
ECMAScript
ECMAScript是ECMA-262中定义的语言,与网络浏览器无关。实际上,该语言没有任何输入或输出方法。 ECMA-262将该语言定义为可构建更强大的脚本语言的基础。
Web浏览器只是其中可能存在ECMAScript实现的一种主机环境。
主机环境提供ECMAScript的基本实现以及旨在与环境本身交互的实现扩展。诸如文档对象模型(DOM)之类的扩展使用ECMAScript的核心类型和语法来提供特定于环境的附加功能。
其他主机环境包括NodeJS,服务器端JavaScript平台以及日益陈旧的AdobeFlash。ECMA-262如果不引用网络浏览器,究竟会指明什么?在最基本的级别上,它描述了语言的以下部分:
➤语法
➤类型
➤语句
➤关键字
➤保留字
➤运算符
➤全局 objects
ECMAScript只是对语言的描述,该语言实现了规范中描述的所有方面。 JavaScript实现ECMAScript,Adobe ActionScript也实现。
文档对象模型
文档对象模型(DOM)是XML的应用程序编程接口(API),已扩展为在HTML中使用。 DOM将整个页面映射为节点的层次结构。 HTML或XML页面的每个部分都是一种节点,其中包含不同种类的数据。
考虑下面的HTML页面:
<html>
<head>
<title>Sample Page</title>
</head>
<body>
<p> Hello World!</p>
</body>
</html>
可以使用DOM将这段代码绘制成节点的层次结构(请参见图1-2)。
通过创建代表文档的树,DOM使开发人员可以对其内容和结构进行空前的控制。可以使用DOM API轻松地删除,添加,替换和修改节点。
为什么需要DOM
借助Internet Explorer 4和Netscape Navigator 4分别支持不同形式的动态HTML(DHTML),开发人员首次可以改变外观。和网页内容,而无需重新加载。这代表了网络技术的巨大进步,但同时也是一个巨大的问题。 Netscape和Microsoft在开发DHTML时采取了不同的方式,从而结束了开发人员可以编写可由任何Web浏览器访问的HTML页面的时期。
DOM级别
DOM级别1在1998年10月成为W3C的推荐。它由两个模块组成:DOM核心,它提供了一种映射基于XML的文档的结构的方式,从而可以轻松地访问和操作文档的任何部分。以及DOM HTML,通过添加特定于HTML的对象和方法扩展了DOM Core。
注意:
请注意,DOM不是特定于JavaScript的,实际上已经以多种其他语言实现。但是,对于Web浏览器,已经使用ECMAScript实现了DOM,现在DOM构成了JavaScript语言的很大一部分。
DOM级别1的目标是映射文档的结构,而DOM级别2的目标则要广泛得多。
原始DOM的此扩展增加了对鼠标和用户界面事件(DHTML长期支持),范围和遍历(迭代DOM文档的方法)的支持,并通过对象界面支持级联样式表(CSS)。
在级别1中引入的原始DOM Core也已扩展为包括对XML名称空间的支持。
在级别2中,DOM级别2引入了以下DOM新模块以处理新类型的接口。
➤DOM视图-描述用于跟踪文档的各种视图的接口(例如CSS样式前后的文档)
➤DOM事件-描述用于事件和事件处理的接口
➤DOM样式-描述用于处理基于CSS的元素样式的接口
➤DOM遍历和范围-描述用于遍历和操纵文档树的接口
DOM级别3进一步扩展了DOM,引入了以统一方式加载和保存文档的方法(包含在名为DOM Load and Save的新模块中)和用于验证文档的方法(DOM验证)。
在级别3中,扩展了DOM Core以支持所有XML 1.0,包括XML Infoset,XPath和XML Base。
目前,W3C不再将DOM维护为一组级别,而是将其作为DOM Living Standard快照进行维护。其中的一个称为DOM4。在它的介绍中,添加了诱变观察器以替换诱变事件。
注意在阅读DOM时,您可能会遇到对DOM级别0的引用。请注意,没有称为DOM级别0的标准。它只是DOM历史上的参考点。
DOM级别0被认为 成为Internet Explorer 4.0和Netscape Navigator 4.0支持的原始DHTML。其他DOM除了DOM Core和DOM HTML接口之外,其他几种语言也发布了自己的DOM标准。
下表中的语言是基于XML的,并且每个DOM都添加了特定语言特有的方法和接口:
➤可缩放矢量图形(SVG)1.0
➤数学标记语言(MathML)1.0
➤同步多媒体集成语言(SMIL)
另外,其他语言也开发了自己的DOM实现,例如Mozilla的XML用户界面语言(XUL)。
Web浏览器中的DOM支持在Web浏览器开始实施DOM之前,DOM已经成为标准。
Internet Explorer首次尝试使用版本5,但直到版本5.5才实现,该版本实现了DOM Level 1的大部分,直到版本5.5才实现。 尽管版本8引入了一些错误修复,但是版本6和7中提供了新的DOM功能。对于Netscape,直到引入Netscape 6(Mozilla 0.6.0)之前,不存在DOM支持。
在Netscape 7之后,Mozilla将其开发工作切换到了Firefox浏览器。 Firefox 3+支持所有级别1,几乎所有级别2,以及级别3的某些部分。(Mozilla开发团队的目标是构建100%符合标准的浏览器,并且他们的工作得到了回报。)
浏览器对象模型
Internet Explorer 3和Netscape Navigator 3浏览器具有浏览器对象模型(BOM),该模型允许访问和操纵浏览器窗口。
使用BOM,开发人员可以在显示页面的上下文之外与浏览器进行交互。使BOM真正独特且常常有问题的原因是,它是JavaScript实现中唯一没有相关标准的部分。随着HTML5的引入,这种情况发生了变化,HTML5试图将许多BOM编入正式规范的一部分。多亏了HTML5,BOM周围的许多混乱才得以消除。
首先,BOM处理浏览器的窗口和框架,但通常,任何特定于浏览器的JavaScript扩展都被视为BOM的一部分。
以下是一些此类扩展:
➤弹出新浏览器窗口的功能
➤移动,调整和关闭浏览器窗口的大小的功能
➤导航器对象,提供有关浏览器的详细信息
➤位置对象,该对象提供有关浏览器中加载页面的详细信息
➤屏幕对象,提供有关用户的屏幕分辨率的详细信息
➤性能对象,提供有关浏览器的内存消耗,导航行为和计时统计信息的详细信息
➤支持用于cookie的自定义对象,例如XMLHttpRequest和Internet Explorer的ActiveXObject。
因为很长一段时间以来都没有BOM的标准,所以每个浏览器都有自己的实现。
有一些事实上的标准,例如具有窗口对象和导航器对象,但是每个标准 浏览器为这些和其他对象定义了自己的属性和方法。 随着HTML5现在可用,BOM的实现细节有望以更加兼容的方式增长。
JavaScript版本
Mozilla作为原始Netscape的后代,是唯一延续原始JavaScript版本编号顺序的浏览器供应商。当将Netscape源代码拆分成一个开源项目(称为Mozilla项目)时,JavaScript的最新浏览器版本是1.3。 (如前所述,版本1.4仅在服务器上实现。)随着Mozilla Foundation继续从事JavaScript的工作,添加了新功能,关键字和语法,Java-Script版本号增加了。
编号方案基于Firefox 4将具有JavaScript 2.0的思想,并且在此之前版本号的每次增加都表示JavaScript实施与2.0提案有多接近。尽管这是最初的计划,但是JavaScript的发展是不可能的。
目前尚无Java-Script 2.0的目标实现,并且这种样式化的版本在Firefox 4发行版之后就停止了。注意重要的一点是,只有Netscape / Mozilla浏览器才遵循该版本控制方案。例如,Internet Explorer具有不同的JScript版本号。这些JScript版本与上表中提到的JavaScript版本完全不对应。此外,大多数浏览器都在关于ECMAScript合规性和DOM支持的级别上谈论JavaScript支持。
总结
JavaScript是一种旨在与网页交互的脚本语言,由以下三种语言组成 不同的部分:
➤ECMAScript,在ECMA-262中定义并提供核心功能
➤文档对象模型(DOM),提供用于处理网页内容的方法和界面
➤浏览器对象模型( BOM),它提供了与浏览器进行交互的方法和界面。
在五个主要的Web浏览器(Internet Explorer,Firefox,Chrome,Safari和Opera)中,对JavaScript的三个部分的支持水平各不相同。
通常,在所有浏览器中对ECMAScript 5的支持都很好,并且对ECMAScript 6和7的支持正在增长。
对DOM的支持各不相同,但是3级合规性越来越规范。
尽管假定存在一些共同点,但HTML5中编码的BOM可能因浏览器而异。