前言

献给我的父母,是他们永远给我支持和鼓励。

从驱动全球商业、贸易及管理领域不计其数的复杂应用程序的角度来看,说JavaScript已经成为当今世界上最流行的编程语言一点儿都不为过。

JavaScript是一种非常松散的面向对象语言,也是Web开发中极受欢迎的一门语言。JavaScript,尽管它的语法和编程风格与Java都很相似,但它却不是Java的“轻量级”版本,甚至与Java没有任何关系。JavaScript是一种全新的动态语言,它植根于全球数亿网民都在使用的Web浏览器之中,致力于增强网站和Web应用程序的交互性。

在本书中,我们将对JavaScript追根溯源,从它在最早的Netscape浏览器中诞生谈起,一直谈到今天的它对DOM和Ajax的强大支持。读者将通过本书掌握如何运用和扩展这门语言,从而更好地满足自己的需求,以及如何实现客户端与服务器的无缝通信,而又不必求助于Java或隐藏的网页框架(frame元素)。一言以蔽之,本书将教会你在面对各种常见的Web开发问题时,如何拿出自己的JavaScript解决方案。

本书读者对象

本书将下列三类人员作为目标读者:

(1) 熟悉面向对象编程、经验丰富而又打算学习JavaScript的开发人员,JavaScript毕竟与Java、C++等传统OO语言存在着诸多联系;

(2) 有意提升自己网站和Web应用程序易用性的Web开发人员;

(3) 希望全面深入地理解这门语言的初级JavaScript开发人员。

此外,本书也适合熟悉下列相关技术的读者阅读:

(1) Java

(2) PHP

(3) ASP.NET

(4) HTML

(5) CSS

(6) XML

本书不适合没有计算机基础知识的初学者,也不适合只想为网站添加简单交互功能的读者。建议这些朋友学习阅读Beginning JavaScript,3rd Edition(Wiley,2007)一书本书中文版《JavaScript入门经典(第3版)》已经由清华大学出版社出版。——译者注(以下脚注如无特殊说明,均为译者注)

本书内容

本书提供了JavaScript开发人员必须掌握的内容,全面涵盖了JavaScript的各种高级、有用的特性。

本书首先介绍了JavaScript的起源及其发展现状,随后讨论了构成JavaScript实现的各个组成部分,重点讲解了ECMAScript和DOM标准。此外,还对不同Web浏览器的JavaScript实现之间存在的差异,给出了相应的说明。

在此基础上,本书从讲解JavaScript的基本概念入手,探讨了JavaScript面向对象程序设计和继承的方式,以及如何在HTML等标记语言中使用它。在深入剖析了事件和事件处理之后,又解释了各种浏览器检测技术。本书还探讨了HTML5、Selectors API和File API等一系列新API。

本书最后一部分专门讨论了高级主题,涉及性能和内存优化、最佳实践以及对JavaScript未来的展望。

本书结构

本书共25章,各章简介如下。

第1章“JavaScript简介”,讲述了JavaScript的起源:因何而生,如何发展,现状如何。涉及的概念主要有JavaScript与ECMAScript之间的关系、DOM(Document Object Model,文档对象模型)、BOM(Browser Object Model,浏览器对象模型)。此外,还将讨论ECMA(European Computer Manufacturer's Association,欧洲计算机制造商协会)和W3C(World WideWebConsortium,万维网联盟)制定的一些相关标准。

第2章“在HTML中使用JavaScript”,介绍了如何在HTML中使用JavaScript创建动态网页。这一章不仅展示了在网页中嵌入JavaScript的各种方式,还讨论了JavaScript内容类型(content-type)及其与<script>元素的关系。

第3章“基本概念”,讨论了JavaScript语言的基本概念,包括语法和流控制语句。这一章也分析了JavaScript与其他基于C的语言在语法上的相同和不同之处,还介绍了与内置操作符有关的类型转换问题。

第4章“变量、作用域和内存问题”,探讨了JavaScript如何处理其松散类型的变量。这一章还讨论了原始值和引用值之间的差别,以及与变量有关的执行环境的相应内容。最后,通过介绍JavaScript的垃圾收集机制,解释了变量在退出作用域时释放其内存的问题。

第5章“引用类型”,详尽介绍了JavaScript内置的所有引用类型,如Object和Array。这一章对ECMA-262规范中描述的每一种引用类型既做了理论上的阐释,又从浏览器实现的角度给出了介绍。

第6章“面向对象的程序设计”,讲述了在JavaScript中如何实现面向对象的程序设计。由于JavaScript没有类的概念,因此这一章从对象创建和继承的层面上展示了一些流行的技术。此外,这一章还讲解了函数原型的概念,并对函数原型与整个面向对象方法的关系进行了探讨。

第7章“函数表达式”,集中介绍了JavaScript中最为强大的一个特性——函数表达式。相关的内容涉及闭包、this对象的角色、模块模式和创建私有对象成员等。

第8章“BOM”,介绍BOM(Browser Object Model,浏览器对象模型),即负责处理与浏览器自身有关的交互操作的对象集合。这一章全面介绍了每一个BOM对象,包括window、document、location、navigator和screen。

第9章“客户端检测”,讨论了检测客户端机器及其支持特性的各种手段,包括特性检测及用户代理字符串检测的不同技术。这一章还就每种手段的优缺点及适用情形给出了详细说明。

第10章“DOM”,介绍DOM(Document Object Model,文档对象模型),即DOM1规定的JavaScript中的DOM对象。这一章也简要介绍了XML及其与DOM的关系,为深入探讨所有DOM规范及其定义的操作网页的方式奠定了基础。

第11章“DOM扩展”,介绍了其他API以及浏览器本身为DOM添加的各种功能。涉及内容包括Selectors API、Element Traversal API和HTML5扩展。

第12章“DOM2和DOM3”,在前两章的基础上继续探讨了DOM2和DOM3中新增的DOM属性、方法和对象。这一章还讨论了IE与其他浏览器的兼容性问题。

第13章“事件”,解释了JavaScript中事件的本质,对遗留机制的支持,以及DOM对事件机制的重新定义。这一章讨论了多种设备,包括Wii和iPhone。

第14章“表单脚本”,讲述如何使用JavaScript增强表单的交互性,突破浏览器的局限性。这一章的讨论主要围绕单个表单元素如文本框、选择框,以及围绕数据验证和操作展开。

第15章“使用Canvas绘图”,讨论了<canvas>标签以及如何通过它来动态绘图。不仅涵盖2D上下文,也将讨论WebGL(3D)上下文,可以为创建动画和游戏夯实基础。

第16章“HTML5脚本编程”,介绍了HTML5规定的JavaScript API,涉及跨文档传递消息、拖放API和以编程方式控制<audio>和<video>元素,以及管理历史状态。

第17章“错误处理与调试”,讨论浏览器如何处理JavaScript代码错误,并展示了一些处理错误的方式。这一章针对每种浏览器分别讨论了相应的调试工具和技术,还给出了简化调试工作的建议。

第18章“JavaScript与XML”,展示了JavaScript中用于读取和操作XML(eXtensible Markup Language,可扩展标记语言)的特性。这一章分析了不同浏览器提供的XML支持和对象的差异,给出了编写跨浏览器代码的简易方法。此外,这一章还介绍了用于在客户端转换XML数据的XSLT(eXtensible Stylesheet Language Transformations,可扩展样式表语言转换)技术。

第19章“E4X”,讨论了E4X(ECMAScript for XML,ECMAScript中的XML扩展);设计E4X的出发点是简化XML处理任务。这一章探讨了在处理XML时,使用E4X与使用DOM相比有哪些优势。

第20章“JSON”,介绍了作为XML替代格式的JSON,包含浏览器原生支持的JSON解析和序列化,以及使用JSON时要注意的安全问题。

第21章“Ajax与Comet”,讲解了常用的Ajax技术,包括使用XMLHttpRequest对象及CORS(Cross-Origin Resource Sharing,跨来源资源共享)API实现跨域Ajax通信。这一章展示了浏览器在实现与支持方面存在的差异,同时也给出了一些使用建议。

第22章“高级技巧”,深入讲解了一些JavaScript中较复杂的模式,包括函数柯里化(currying)、部分函数应用和动态函数。这一章还讨论了如何创建自定义的事件框架和使用ECMAScript 5创建防篡改对象。

第23章“离线应用与客户端存储”,讨论了如何检测应用离线以及在客户端机器中存储数据的各种技术。先从受到最广泛支持的特性cookie谈起,继而介绍了新兴的客户端存储技术,如Web Storage和IndexedDB。

第24章“最佳实践”,探讨了在企业级环境中使用JavaScript的各种方式。其中,着眼于提高可维护性的内容包括编码技巧、格式化和通用编程实践。这一章还介绍了改善代码执行性能及速度优化的一些技术。最后讨论了部署问题,包括如何创建构建过程。

第25章“新兴的API”,介绍了为增强浏览器中的JavaScript而创建的新API。虽然这些API还没有得到完整或全面的支持,但它们已经崭露头角,有些浏览器也已经部分地实现了这些API。这一章的内容主要是Web计时和文件API。

使用示例

要运行本书中的示例,需要安装下列软件:

❏ Windows XP、Windows 7或Mac OS X;

❏ Internet Explorer 6及更高版本、Firefox 2及更高版本、Opera 9及更高的版本、Chrome、Safari 2及更高版本。

完整的示例源代码可以从http://www.wrox.com/中下载(下载步骤见“源代码”一节)读者也可以在图灵社区(http://www.ituring.com.cn/)本书的页面中免费注册下载。

排版约定

为了让读者更好地理解本书内容,同时把握住全书的重点,本书将采用以下排版约定。

这种带警告图标的方框样式,表示与上下文相关的重要的、需要牢记的内容。

这种带钢笔图标的方框样式,表示与上下文相关的说明、提示、技巧、窍门和背景知识。

正文中的样式说明如下。

(1) 新术语及重要的词汇在首次出现时使用加粗字体以示强调;

(2) 表示键盘命令组合的方式是Ctrl+A;

(3) 正文中的代码使用等宽字体,如persistence.properties;

(4) 代码有两种样式:

        var obj=new Object();    // 大多数示例代码都没有加粗
        var obj=new Object();    // 加粗的代码表示在上下文中特别重要

源代码

在学习本书示例代码时,可以手工敲入所有代码,也可以使用随书的源代码文件。本书所有源代码都可以到www.wrox.com中下载。登录该站点后,先找到本书(通过搜索或者图书列表),打开本书页面后,单击其中的Download Code链接,就可以下载本书的源代码了翻译本书时,wrox.com中下载本书代码的短地址为:http://tinyurl.com/projs-3rd-code。。对于包含在下载文件中的源代码,书中会添加以下图标:

本书代码示例旁边会附有文件名,从中可以找到对应的代码片段。文件名的格式如下:

由于很多书的书名看起来类似,所以更好的方式是通过书的ISBN来搜索它。本书原版的ISBN是978-1-118-02669-4。

下载完代码后,请使用解压缩软件将其解压缩。此外,读者也可以登录Wrox代码下载主页www.wrox.com/dynamic/books/download.aspx,查找并下载本书及其他Wrox图书的示例代码。

勘误信息您也可以登录图灵社区(http://www.ituring.com.cn/),在本书页面中提交您发现的错误。

我们尽最大努力确保正文和代码没有错误。可是,金无足赤,错误在所难免。如果读者发现我们书中的任何错误,例如错别字或代码片段无法运行等,希望您能及时给我们反馈。您提交的勘误不仅能让其他读者受益,而且也能帮助我们进一步提高图书质量。

本书原版的勘误页面位于www.wrox.com中,登录该站点后可以通过搜索或查询图书列表找到本书页面,然后单击页面中的Errata(勘误)链接。然后可以看到其他读者已经提交并由Wrox的编辑发布的勘误信息。另外,在www.wrox.com/misc-pages/booklist.shtml页面中也可以找到本书及勘误页面的链接。

如果读者在本书勘误页面中没有发现“你的”错误,麻烦打开www.wrox.com/contact/techsupport.shtml页面,填写其中的表单并将错误发送给我们。我们会认真核对您提交的错误,如果错误确实存在,我们将把它补充到本书勘误页面中。同时,也将根据您提供的信息对本书后续版本加以改正。

p2p.wrox.com

如果您想与本书作者或者其他读者沟通,请加入P2P论坛(p2p.wrox.com)。该论坛是基于Web的系统,您可以在其中发表与Wrox图书及相关技术有关的帖子,并同其他读者或者技术用户交流。论坛提供了一个订阅功能,您可以选择当发表您感兴趣的帖子时通过邮件通知您。Wrox的作者、编辑、其他行业的专家以及与您正在读同一本书的读者都会出现在这个论坛中。

http://p2p.wrox.com中,有很多论坛不仅对您理解本书有帮助,而且还会对开发应用程序有帮助。要加入这个论坛,请按下面几个步骤进行:

(1) 登录到p2p.wrox.com,单击Register(注册)链接;

(2) 阅读使用条款并单击Agree(同意);

(3) 完成必填信息和您愿意提供的可选信息,然后单击Submit(提交);

(4) 随后,您会收到一封电子邮件,其中包含如何验证账号和完成注册过程的信息。

如果不加入P2P论坛,虽然也可以阅读其中的帖子,但却不能发表帖子,只有注册后才能发表。

在加入论坛后,既可以发表新帖子也可以回复其他用户的帖子。可以在任何时间上网浏览论坛中的帖子。如果希望将某个论坛中的新帖子通过电子邮件发送给您,请在论坛列表中单击与论坛名相关的Subscribe to this Forum(订阅这个论坛)图标。

如果想了解有关如何使用Wrox P2P的更多信息,请阅读包含论坛规则、P2P及Wrox图书常见问题的P2P FAQ;要阅读FAQ,可以在任何P2P页面中单击FAQ链接。

致谢

虽然作者的名字被印在了封面上,但一个人是不可能完成这本书的,我想感谢与出版本书有关的一些人。

首先,感谢John Wiley & Sons继续给我写作的机会。当时,出版本书第1版时,他们是唯一愿意承担风险的一家出版社。对此,我将永远铭记于心。

感谢John Wiley & Sons的编辑人员,特别是Kevin Kent和John Peloquin,他们卓有成效的工作使我保持了坦诚直率的风格,也解决了我在写作期间不断变更内容的问题。

还要感谢对本书草稿给出反馈意见的所有人:Rob Friesel、Sergey Ilinsky、Dan Kielp、Peter-Paul Koch、Jeremy McPeak、Alex Petrescu、Dmitry Soshnikov和Juriy “Kangax”Zaytsev。你们的宝贵意见让我自己都为本书感到骄傲。

我想特别感谢Brendan Eich,感谢他纠正了第1章中有关JavaScript历史的细节问题。

最后,当然也是非常重要的,感谢Rey Bango为本书作序。很高兴在与Rey通过网络认识几年之后,终于在2010年有缘相见。他是这个行业里真正出色的人,我非常荣幸能请到他为本书作序。

关于技术编辑

John Peloquin是一位有十多年JavaScript经验的前端工程师,开发过各种规模的应用。John拥有加州大学伯克利分校的数学学士学位,目前在一家致力于卫生保健的创业公司担任开发主管。在编辑本书之前,John编辑过Jeremy McPeak的JavaScript 24-Hour Trainer(Wiley,2010)。编写代码和收集勘误之余,John经常沉迷于数学、哲学和魔术。