当前位置: 首页 > 新闻 > 信息荟萃
编号:3783
JavaScript DOM编程艺术.pdf
http://www.100md.com 2020年3月15日
第1页
第5页
第14页
第28页
第36页
第276页

    参见附件(10355KB,329页)。

     JavaScript DOM编程艺术是作者Jeremy Keith写的关于javascript的书籍,主要讲述了JavaScript语法和起源,以案例分析JavaScript图片库,用JavaScript实现动画效果。

    JavaScript DOM编程艺术内容提要

    JavaScript是Web开发中最重要的一门语言,它强大而优美。无论是桌面开发,还是移动应用。JavaScript都是必须掌握的技术。W3C的DOM标准是开发Web应用的基石。已经得到所有现代浏览器的支持,这使得跨平台Web开发成了一件轻松惬意的事。

    本书是超级畅销书的升级版,由倡导Web标准的领军人物执笔,揭示了前端开发的真谛,是学习JavaScript和DOM开发的必读之作。

    本 书在简洁明快地讲述JavaScript和DOM的基本知识之后,通过几个实例演示了专业水准的网页开发技术,透彻阐述了平稳退化等一批至关重要的 JavaScript编程原则和最佳实践,并全面探讨了HTML5以及jQuery等JavaScript库。读者将看到JavaScript、 HTML5和CSS如何协作来创建易用的、与标准兼容的Web设计,掌握使用JavaScript和DOM通过客户端动态效果和用户控制的动画来加强 Web页面的必备技术;同时,还将对如何利用库提高开发效率有全面深入的理解。

    JavaScript DOM编程艺术作者简介

    Jeremy Keith 国际知名的Web设计师,Web标准项目组成员,DOM Scripting任务组负责人之一,任职于Web咨询公司Clearleft。除本书外,还着有HTML5 for Web Designers、Bulletproof Ajax。可通过其个人网站adactio.com与他联系。

    Jeffrey Sambells 资深平面设计师,Web开发人员,创办了软件公司We-Create并担任研发总监。除本书外,还着有《JavaScript高级程序设计》和 Beginning Google Maps Applications with PHP and Ajax等多部畅销书。

    JavaScript DOM编程艺术目录

    第1章 JavaScript简史1

    1.1 JavaScript的起源1

    1.2 DOM2

    1.3 浏览器战争3

    1.3.1 DHTML3

    1.3.2 浏览器之间的冲突3

    1.4 制定标准4

    1.4.1 浏览器以外的考虑4

    1.4.2 浏览器战争的结局5

    1.4.3 崭新的起点5

    1.5 小结6

    第2章 JavaScript语法8

    2.1 准备工作8

    2.2 语法10

    2.2.1 语句10

    2.2.2 注释10

    2.2.3 变量11

    2.2.4 数据类型14

    2.2.5 数组16

    2.2.6 对象18

    2.3 操作19

    2.4 条件语句21

    2.4.1 比较操作符22

    2.4.2 逻辑操作符23

    2.5 循环语句24

    2.5.1 while循环24

    2.5.2 for循环25

    2.6 函数26

    2.7 对象29

    2.7.1 内建对象30

    2.7.2 宿主对象31

    2.8 小结31

    第3章 DOM32

    3.1 文档:DOM中的“D”32

    3.2 对象:DOM中的“O”32

    3.3 模型:DOM中的“M”33

    3.4 节点35

    3.4.1 元素节点35

    3.4.2 文本节点35

    3.4.3 属性节点36

    3.4.4 CSS36

    3.4.5 获取元素38

    3.4.6 盘点知识点42

    3.5 获取和设置属性43

    3.5.1 getAttribute43

    3.5.2 setAttribute44

    3.6 小结45

    第4章 案例研究:JavaScript图片库46

    4.1 标记46

    4.2 JavaScript48

    4.2.1 非DOM解决方案49

    4.2.2 最终的函数代码清单50

    4.3 应用这个JavaScript函数50

    4.4 对这个函数进行扩展52

    4.4.1 childNodes属性53

    4.4.2 nodeType属性54

    4.4.3 在标记里增加一段描述54

    4.4.4 用JavaScript改变这段描述55

    4.4.5 nodeValue属性56

    4.4.6 firstChild和lastChild属性56

    4.4.7 利用nodeValue属性刷新这段描述57

    4.5 小结60

    第5章 最佳实践61

    5.1 过去的错误61

    5.1.1 不要怪罪JavaScript61

    5.1.2 Flash的遭遇62

    5.1.3 质疑一切63

    5.2 平稳退化63

    5.2.1 “javascript:”伪协议64

    5.2.2 内嵌的事件处理函数65

    5.2.3 谁关心这个65

    5.3 向CSS学习66

    5.3.1 结构与样式的分离66

    5.3.2 渐进增强67

    5.4 分离JavaScript68

    5.5 向后兼容70

    5.5.1 对象检测70

    5.5.2 浏览器嗅探技术71

    5.6 性能考虑72

    5.6.1 尽量少访问DOM和尽量减少标记72

    5.6.2 合并和放置脚本73

    5.6.3 压缩脚本73

    5.7 小结74

    第6章 案例研究:图片库改进版75

    6.1 快速回顾75

    6.2 它支持平稳退化吗76

    6.3 它的JavaScript与HTML标记是分离的吗77

    6.3.1 添加事件处理函数77

    6.3.2 共享onload事件82

    6.4 不要做太多的假设84

    6.5 优化86

    6.6 键盘访问88

    6.7 把JavaScript与CSS结合起来90

    6.8 DOM Core和HTML-DOM93

    6.9 小结94

    第7章 动态创建标记96

    7.1 一些传统方法96

    7.1.1 document.write96

    7.1.2 innerHTML属性98

    7.2 DOM方法101

    7.2.1 createElement方法101

    7.2.2 appendChild方法102

    7.2.3 createTextNode方法103

    7.2.4 一个更复杂的组合105

    7.3 重回图片库107

    7.3.1 在已有元素前插入一个新元素108

    7.3.2 在现有方法后插入一个新元素109

    7.3.3 图片库二次改进版111

    7.4 Ajax114

    7.4.1 XMLHttpRequest对象115

    7.4.2 渐进增强与Ajax119

    7.4.3 Hijax120

    7.5 小结121

    第8章 充实文档的内容122

    8.1 不应该做什么122

    8.2 把“不可见”变成“可见”123

    8.3 内容123

    8.3.1 选用HTML、XHTML还是HTML5124

    8.3.2 CSS126

    8.3.3 JavaScript127

    8.4 显示“缩略语列表”127

    8.4.1 编写displayAbbreviations函数128

    8.4.2 创建标记130

    8.4.3 一个浏览器“地雷”135

    8.5 显示“文献来源链接表”138

    8.6 显示“快捷键清单”143

    8.7 检索和添加信息146

    8.8 小结147

    第9章 CSS-DOM148

    9.1 三位一体的网页148

    9.1.1 结构层148

    9.1.2 表示层148

    9.1.3 行为层149

    9.1.4 分离150

    9.2 style属性150

    9.2.1 获取样式151

    9.2.2 设置样式156

    9.3 何时该用DOM脚本设置样式158

    9.3.1 根据元素在节点树里的位置来设置样式158

    9.3.2 根据某种条件反复设置某种样式161

    9.3.3 响应事件165

    9.4 className属性167

    9.5 小结171

    第10章 用JavaScript实现动画效果172

    10.1 动画基础知识172

    10.1.1 位置172

    10.1.2 时间175

    10.1.3 时间递增量175

    10.1.4 抽象178

    10.2 实用的动画184

    10.2.1 提出问题184

    10.2.2 解决问题186

    10.2.3 CSS187

    10.2.4 JavaScript189

    10.2.5 变量作用域问题192

    10.2.6 改进动画效果193

    10.2.7 添加安全检查196

    10.2.8 生成HTML标记198

    10.3 小结200

    第11章 HTML5201

    11.1 HTML5简介201

    11.2 来自朋友的忠告203

    11.3 几个示例204

    11.3.1 Canvas205

    11.3.2 音频和视频209

    11.3.3 表单215

    11.4 HTML5还有其他特性吗219

    11.5 小结219

    第12章 综合示例220

    12.1 项目简介220

    12.1.1 原始资料220

    12.1.2 站点结构220

    12.1.3 页面结构221

    12.2 设计222

    12.3 CSS223

    12.3.1 颜色225

    12.3.2 布局226

    12.3.3 版式228

    12.4 标记229

    12.5 JavaScript230

    12.5.1 页面突出显示231

    12.5.2 JavaScript幻灯片235

    12.5.3 内部导航239

    12.5.4 JavaScript图片库242

    12.5.5 增强表格245

    12.5.6 增强表单249

    12.5.7 压缩代码263

    12.6 小结264

    JavaScript DOM编程艺术截图

    书名:JavaScript DOM编程艺术(第2版)

    作者:[英] Jeremy Keith [加] Jeffrey Sambells

    译者:杨涛 王建桥 杨晓云 等

    ISBN:978-7-115-24999-9

    本书由北京图灵文化发展有限公司发行数字版。版权所有,侵权必究。

    您购买的图灵电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

    我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

    如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律

    责任。

    091507240605ToBeReplacedWithUserId

    版权声明

    上一版译者序

    序

    前言

    致谢

    第 1 章 JavaScript简史

    1.1 JavaScript的起源

    1.2 DOM

    1.3 浏览器战争

    1.3.1 DHTML

    1.3.2 浏览器之间的冲突

    1.4 制定标准

    1.4.1 浏览器以外的考虑

    1.4.2 浏览器战争的结局

    1.4.3 崭新的起点

    1.5 小结

    第 2 章 JavaScript语法

    2.1 准备工作

    2.2 语法

    2.2.1 语句

    2.2.2 注释

    2.2.3 变量

    2.2.4 数据类型

    2.2.5 数组

    2.2.6 对象

    2.3 操作

    算术操作符

    2.4 条件语句

    2.4.1 比较操作符

    2.4.2 逻辑操作符

    2.5 循环语句

    2.5.1 while循环

    2.5.2 for循环

    2.6 函数

    变量的作用域

    2.7 对象

    2.7.1 内建对象

    2.7.2 宿主对象

    2.8 小结

    第 3 章 DOM

    3.1 文档:DOM中的“D”

    3.2 对象:DOM中的“O”

    3.3 模型:DOM中的“M”

    3.4 节点

    3.4.1 元素节点

    3.4.2 文本节点

    3.4.3 属性节点

    3.4.4 CSS

    3.4.5 获取元素

    3.4.6 盘点知识点

    3.5 获取和设置属性

    3.5.1 getAttribute

    第 4 章 案例研究:JavaScript图片库

    4.1 标记

    4.2 JavaScript

    4.2.1 非DOM解决方案

    4.2.2 最终的函数代码清单

    4.3 应用这个JavaScript函数

    事件处理函数

    4.4 对这个函数进行扩展

    4.4.1 childNodes属性

    4.4.2 nodeType属性

    4.4.3 在标记里增加一段描述

    4.4.4 用JavaScript改变这段描述

    4.4.5 nodeValue属性

    4.4.6 firstChild和lastChild属性

    4.4.7 利用nodeValue属性刷新这段描述

    4.5 小结

    第 5 章 最佳实践

    5.1 过去的错误

    5.1.1 不要怪罪JavaScript

    5.1.2 Flash的遭遇

    5.1.3 质疑一切

    5.2 平稳退化

    5.2.1 “javascript:”伪协议

    5.2.2 内嵌的事件处理函数

    5.2.3 谁关心这个

    5.3 向CSS学习

    5.3.1 结构与样式的分离

    5.3.2 渐进增强

    5.4 分离JavaScript

    5.5 向后兼容

    5.5.1 对象检测

    5.5.2 浏览器嗅探技术

    5.6 性能考虑

    5.6.1 尽量少访问DOM和尽量减少标记

    5.6.2 合并和放置脚本

    5.6.3 压缩脚本

    5.7 小结

    第 6 章 案例研究:图片库改进版

    6.1 快速回顾

    6.2 它支持平稳退化吗

    6.3 它的 JavaScript 与HTML标记是分离的吗

    6.3.1 添加事件处理函数

    6.3.2 共享onload事件

    6.4 不要做太多的假设

    6.5 优化

    6.6 键盘访问

    小心onkeypress

    6.7 把JavaScript与CSS结合起来

    6.8 DOM Core和HTML-DOM

    6.9 小结

    第 7 章 动态创建标记

    7.1 一些传统方法

    7.1.1 document.write

    7.1.2 innerHTML属性

    7.2 DOM方法

    7.2.1 createElement方法

    7.2.2 appendChild方法

    7.2.3 createTextNode方法

    7.2.4 一个更复杂的组合

    7.3 重回图片库

    7.3.1 在已有元素前插入一个新元素

    7.3.2 在现有元素后插入一个新元素

    7.3.3 图片库二次改进版

    7.4 Ajax

    7.4.1 XMLHttpRequest对象

    7.4.2 渐进增强与Ajax

    7.4.3 Hijax

    7.5 小结

    第 8 章 充实文档的内容

    8.1 不应该做什么

    8.2 把“不可见”变成“可见”

    8.3 内容

    8.3.1 选用HTML、XHTML还是HTML5

    8.3.2 CSS

    8.3.3 JavaScript

    8.4 显示“缩略语列表”

    8.4.1 编写displayAbbreviations函数

    8.4.2 创建标记

    8.4.3 一个浏览器“地雷”

    8.5 显示“文献来源链接表”

    编写displayCitations函数

    8.6 显示“快捷键清单”

    8.7 检索和添加信息

    8.8 小结

    第 9 章 CSS-DOM

    9.1 三位一体的网页

    9.1.1 结构层

    9.1.2 表示层

    9.1.3 行为层

    9.1.4 分离

    9.2 style属性

    9.2.1 获取样式

    9.2.2 设置样式

    9.3 何时该用DOM脚本设置样式

    9.3.1 根据元素在节点树里的位置来设置样式

    9.3.2 根据某种条件反复设置某种样式

    9.3.3 响应事件

    9.4 className属性

    对函数进行抽象

    9.5 小结

    第 10 章 用JavaScript实现动画效果

    10.1 动画基础知识

    10.1.1 位置

    10.1.2 时间

    10.1.3 时间递增量

    10.1.4 抽象

    10.2 实用的动画

    10.2.1 提出问题

    10.2.2 解决问题

    10.2.3 CSS

    10.2.4 JavaScript

    10.2.5 变量作用域问题

    10.2.6 改进动画效果

    10.2.7 添加安全检查

    10.2.8 生成HTML标记

    10.3 小结

    第 11 章 HTML5

    11.1 HTML5简介

    11.2 来自朋友的忠告

    11.3 几个示例

    11.3.1 Canvas

    11.3.2 音频和视频

    11.3.3 表单

    11.4 HTML5还有其他特性吗

    11.5 小结

    第 12 章 综合示例

    12.1 项目简介

    12.1.1 原始资料

    12.1.2 站点结构

    12.1.3 页面结构

    12.2 设计

    12.3 CSS

    12.3.1 颜色

    12.3.2 布局

    12.3.3 版式

    12.4 标记

    12.5 JavaScript

    12.5.1 页面突出显示

    12.5.2 JavaScript幻灯片

    12.5.3 内部导航

    12.5.4 JavaScript图片库

    12.5.5 增强表格

    12.5.6 增强表单

    12.5.7 压缩代码

    12.6 小结

    附录 JavaScript库

    A.1 选择合适的库

    A.1.1 有代表性的库

    A.1.2 内容分发网络

    A.2 语法

    A.3 选择元素

    A.3.1 CSS选择器

    A.3.2 库所提供的专有选择器

    A.3.3 使用回调函数筛选

    A.4 操作DOM元素

    A.4.1 生成内容

    A.4.2 操作内容

    A.5 处理事件

    A.5.1 加载事件

    A.5.2 其他事件

    A.6 Ajax

    A.6.1 Prototype与Ajax

    A.6.2 jQuery与Ajax

    A.7 动画和效果

    A.7.1 基于CSS属性的动画

    A.7.2 组合动画

    A.7.3 注意可访问性

    A.8 小结

    版权声明

    Original English language edition, entitled DOM Scripting: Web Design with JavaScript and

    the Document Object Model, Second Edition by Jeremy Keith and Jeffrey Sambells, published

    by Apress, 2855 Telegraph Avenue, Suite 600, Berkeley, CA 94705 USA.

    Copyright ? 2010 by Jeremy Keith and Jeffrey Sambells. Simplified Chinese-language edition

    copyright ? 2011 by Posts Telecom Press. All rights reserved.

    本书中文简体字版由Apress L.P.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方

    式复制或抄袭本书内容。

    版权所有,侵权必究。

    献给我的妻子和第一位读者Jessica。

    ——Jeremy Keith

    献给自始至终支持我的Stephanie、Addison和Hayden。

    ——Jeffrey Sambells

    上一版译者序

    网上的生活越来越丰富多彩。从最初的(X)HTML网页,到一度热炒的DHTML概念,再到近几年流行起来的

    CSS,网站和网页的设计工作变得越来越简便,网上的内容越来越富于变化和色彩。但是,很多网页设

    计者和网民朋友都不太喜欢JavaScript,这主要有以下几方面原因。第一,很多网页设计者认为

    JavaScript的可用性很差——早期的浏览器彼此很少兼容,如果想让自己编写出来的JavaScript脚本在

    多种浏览器环境里运行,就必须编写许多用来探测浏览器的具体品牌和具体版本的测试及分支代码(术

    语称之为“浏览器嗅探”代码)。这样的脚本往往到处是if...else语句,既不容易阅读,又不容易

    复查和纠错,更难以做到让同一个脚本适用于所有的浏览器。第二,对广大的网民来说,JavaScript网

    页的可访问性很差——浏览器会时不时地弹出一个报错窗口甚至导致系统死机,让人乘兴而来、败兴而

    去。第三,JavaScript被很多网站用来实现弹出广告窗口的功能,人们厌烦这样的广告,也就“恨”屋

    及乌地厌烦起JavaScript来了。第四,“JavaScript”这个名字里的“Java”往往让人们误以为其源于

    Java语言,而实际接触之后才发现它们根本没有任何联系。与Java语言相比,JavaScript语言要简单得

    多。很多程序员宁肯钻研Java,也不愿意去了解JavaScript的功能和用法。

    不管什么原因,JavaScript曾经不受欢迎的确是一个事实。

    现在,情况发生了极大的变化。因为几项新技术的出现,JavaScript的春天似乎来了。首先,W3C(万

    维网联盟)推出的标准化DOM(Document Object Model,文档对象模型)已经一统江湖,目前市场上常

    见的浏览器可以说没有不支持的。这对网页设计者来说意味着可以用简单的“对象检测”代码来取代那

    些繁复的浏览器嗅探代码,而按照DOM编写出来的JavaScript页面不像过去那样容易出问题,这对网民

    来说意味着浏览体验变得流畅了。其次,最近兴起的Ajax技术以DOM和JavaScript语言(以及CSS和

    XHTML)为基本要素,基于Ajax技术的网站离不开JavaScript和DOM脚本。

    其实,人们对JavaScript的恶劣印象在很大程度上来源于早期的程序员对这种语言的滥用。如果程序员

    在编写JavaScript脚本的时候能够把问题考虑得面面俱到,就可以避免许多问题,但可惜的是如此优秀

    的程序员太少了。事实上,即使是在JavaScript已经开始流行起来的今天,如果程序员在编写

    JavaScript脚本的时候不遵守相关的标准和编程准则,也仍会导致各种各样的问题。

    在2002年前后,CSS也是一种不太受人们欢迎的Web显示语言,除了用它来改变一下字体,几乎没有人用

    它来干其他的事情。但没过多久,人们对利用CSS设计网页布局的兴趣就一发而不可收拾,整个潮流也

    从那时扭转了过来。现在,掌握CSS已经成为许多公司在招聘网站开发人员时的一项要求。

    目前,DOM编程技术的现状与CSS技术在2002年时的境况颇有几分相似。受Google Maps和Flickr等著名

    公司利用DOM编程技术推出的Gmail、Google Suggest等新型服务的影响和带动, DOM编程人才的需求正

    日益增加。有越来越多的人开始迷上了脚本编程技术,并开始学习如何利用DOM技术去改善而不是妨碍

    网站的可用性和可访问性。

    本书的作者Jeremy Keith是Web标准计划DOM Scripting任务组的负责人之一,他在这本书里通过大量示

    例证明了这样一个事实:只要运用得当,并且注意避开那些“经典的”JavaScript陷阱,DOM编程技术

    就可以成为Web开发工具箱里又一件功能强大甚至是不可或缺的好东西。

    本书并不是一本参考大全类型的图书,作者只重点介绍了几种最有用的DOM方法和属性。本书的精华在

    于作者在书中提到的关于JavaScript和DOM脚本编程工作的基本原则、良好习惯和正确思路。如果读者

    能通过书中的几个案例真正领悟这些原则、习惯和思路,就一定能让自己的编程技术再上一个台阶。

    这是一本非常实用的好书,是一本值得一读再读的好书。作为本书的译者,我们相信它会让每位读者、自建网站的设计者和来到自建网站的访问者都受益匪浅。

    参加本书翻译的人员还有韩兰、李京山、胡晋平、高文雅。

    序

    第2版已经出版了。

    首先,我要澄清一点:虽然我的名字印在了封面上,但我并没有参与这个版本的修订工作。这个新版本

    完全出自Jeffrey Sambells之手。出版社因为出新版的事找过我,但我的时间确实安排不开了。因此,看到自己的名字忝列其间,心中不禁顿生愧意。

    我很高兴地向读者朋友们报告,新版本中所有的修订都非常符合我的期望——英文原书的封面除外。但

    不管怎么说,第二版的内容真的是太好了!在上一版的基础上,新版经过了扩展,涵盖了如下三个新领

    域:

    HTML5

    Ajax

    JavaScript库(尤其是jQuery)

    相比之下,新版的内容又扩充了不少,但整本书仍然一直在强调最佳实践(特别是渐进增强),这正是

    让我喜出望外的地方。

    新版本中的代码示例全部换成用HTML5标记来写了。有关Ajax的示例代码也精简得当,尽管简略,但上

    下文仍然能够传达出我在Bulletproof Ajax 中提出的观点:永远不要假设Ajax(或JavaScript,等

    等)一定可用。

    中文版《Bulletproof Ajax中文版》已经由人民邮电出版社出版。——编者注

    最让我高兴的一点,就是新版本增加了主要介绍jQuery的章节。这一章把本书前面的典型代码示例,使

    用jQuery重写了一遍。这样一来,正好解释了人们对为什么使用库的种种疑问。它让你先理解了底层代

    码的工作原理,然后再告诉你使用库为什么能节省时间和精力。

    总而言之,这本书新增的内容都十分精彩,对读者绝对有用。为了尽量多展示一些jQuery的方法,也限

    于篇幅,这一版以介绍库的附录代替了上一版介绍DOM方法的附录。这多少让我感到有一些遗憾,不

    过,我会争取在自己的博客上公布第1版的附录。

    最后,我还是要给第2版再竖竖大姆指,另外再给读者一点建议。如果你买过本书第1版,恐怕找一些专

    门讲HTML5、Ajax或jQuery的书看会比较好。但如果你就是想知道怎么才能正确地使用JavaScript,那

    这个经过扩展的新版本就是你的最佳选择。

    Jeremy Keith

    2011年1月3日

    1

    1

    前言

    这是一本讲述一种程序设计语言的书,但它不是专门写给程序员的,而主要是写给Web设计师的。具体

    地说,本书是为那些喜欢使用CSS和HTML并愿意遵守编程规范的Web设计师们编写的。

    本书由代码和概念两大部分构成。不要被那些代码吓倒,我知道它们乍看起来很唬人,可只要抓住了代

    码背后的概念,就会发现你是在用一种新语言去阅读和编写代码。

    学习一种新的程序设计语言看起来可能很难,但事实却并非如此。DOM脚本看起来似乎比CSS更复杂,可

    只要领悟了它的语法,你就会发现自己又掌握了一样功能强大的Web开发工具。归根结底,代码都是思

    想和概念的体现。

    我在这里要告诉大家一个秘密:其实没人能把一种程序设计语言的所有语法和关键字都记住。如果有拿

    不准的地方,查阅参考书就全解决了。但本书不是一本参考大全。本书只介绍最基本的JavaScript语

    法。

    本书的真正目的是让大家理解DOM脚本编程技术背后的思路和原则,或许你对其中一部分早就熟悉了。

    平稳退化、渐进增强、以用户为中心的设计对任何前端Web开发工作都非常重要。这些思路贯穿在本书

    的所有代码示例中。

    你将会看到用来创建图片库页面的脚本、用来创建动画效果的脚本和用来丰富页面元素呈现效果的脚

    本。如果你愿意,完全可以把这些例子剪贴到自己的代码中,但更重要的是理解这些代码背后的“如

    何”和“为什么”。

    如果你已经在使用CSS和HTML来把设计思路转化为活生生的网页,就应该知道Web标准有多么重要。还记

    得你是在何时发现自己只需修改一个CSS文件就可以改变整个网站的视觉效果吗?DOM技术有着同样强大

    的威力。不过,能力越大,责任也就越大。因此,我不仅想让你看到用DOM脚本实现的超酷效果,更想

    让你看到怎样才能利用DOM脚本编程技术以一种既方便自己更体贴用户的方式去充实和完善网页。

    如果需要本书所讨论的相关代码 ,到www.friendsofed.com网站搜索本书的主页就可以查到。还可以在

    这个网站找到friends of ED出版社的所有其他好书,内容涉及Web标准、Flash、DreamWeaver以及许多

    细分的计算机领域。

    本书代码示例也可从图灵网站www.turingbook.com本书网页免费注册下载。——编者注

    你对JavaScript的探索不应该在合上本书时就停止下来。我开设了http:domscripting.com网站,在

    那里继续与大家共同探讨现代的、标准化的JavaScript。我希望你能到该网站看看。与此同时,我更希

    望本书能够对大家有所帮助。祝你们好运!

    1

    1

    致谢

    没有我的朋友和同事Andy Budd (http:www.andybudd.com)与Richard

    Rutter(http:www.Clagnut.com)的帮助,本书的面世就无从谈起。Andy在我们的家乡Brighton开设

    了一个名为Skillswap(http:www.skillswap.org)的免费培训网站。在2004年7月,Richard和我在

    那里做了一次关于JavaScript和DOM的联合演讲。演讲结束后,我们来到附近的一家小酒馆,在那里,Andy建议我把演讲的内容扩展成一本书,也就是本书的第1版。

    Andy Budd是超级畅销书《精通CSS:高级Web标准解决方案(第2版)》的作者,该书已由人民邮电出版社出版。——编者注

    如果没有两方面的帮助,我大概永远也学不会编写JavaScript代码。一方面是几乎每个Web浏览器里都

    有“view source”(查看源代码)选项。谢谢你,“view source”。另一方面是那些多年来一直在编

    写让人叹为观止的代码并解说重要思路的JavaScript大师们。Scott Andrew、Aaron Boodman、Steve

    Champeon、Peter-Paul Koch、Stuart Langridge和Simon Willison只是我现在能想到的几位。感谢你

    们所有人的分享精神。

    感谢Molly Holzschlag与我分享她的经验和忠告,感谢她对本书初稿给予反馈意见。感谢Derek

    Featherstone与我多次愉快地讨论JavaScript问题,我喜欢他思考和分析问题的方法。

    我还要特别感谢Aaron Gustafson,他在我写作本书期间向我提供了许多宝贵的反馈和灵感。

    在写作第1版期间,我有幸参加了两次非常棒的盛会:在得克萨斯州Austin举办的“South by

    Southwest”和在伦敦举办的@media。我要感谢这两次盛会的组织者Hugh Forrest和Patrick

    Griffiths,是他们让我有机会结识那么多最友善的人——我从没想过我能有机会与他们成为朋友和同

    事。

    最后,我要感谢我的妻子Jessica Spengler,不仅因为她永远不变的支持,还因为她在本书初稿的校对

    工作中做出的专业帮助。谢谢你,我的人生伴侣。

    ——Jeremy Keith

    1

    1

    第 1 章 JavaScript简史

    本章内容

    JavaScript的起源

    浏览器战争

    DOM的演变史

    本书第1版面世的时候,做一名Web设计师是件很让人很兴奋的事。5个年头过去了,这个职业依然保持

    着强大的吸引力。特别是JavaScript,经历了从被人误解到万众瞩目的巨大转变。Web开发呢,也已从

    混乱无序的状态,发展成一门需要严格训练才能从事的正规职业。无论设计师还是开发人员,在创建网

    站的过程中都积极地采用标准技术,Web标准已经深入人心。

    当网页设计人员谈论起与Web标准有关的话题时,HTML(超文本标记语言)和CSS(层叠样式表)通常占

    据着核心地位。不过,W3C(万维网联盟)已批准另一项技术,所有与标准相兼容的Web浏览器都支持

    它,这就是DOM(文档对象模型)。我们可以利用DOM给文档增加交互能力,就像利用CSS给文档添加各

    种样式一样。

    在开始学习DOM之前,我们先检视一下使网页具备交互能力的程序设计语言。这种语言就是

    JavaScript,它已经诞生相当长的时间了。

    1.1 JavaScript的起源

    JavaScript是Netscape公司与Sun公司合作开发的。在JavaScript出现之前,Web浏览器不过是一种能够

    显示超文本文档的简单的软件。而在JavaScript出现之后,网页的内容不再局限于枯燥的文本,它们的

    可交互性得到了显著的改善。JavaScript的第一个版本,即JavaScript 1.0版本,出现在1995年推出的

    Netscape Navigator 2浏览器中。

    在JavaScript 1.0发布时,Netscape Navigator主宰着浏览器市场,微软的IE浏览器则扮演着追赶者的

    角色。微软在推出IE 3的时候发布了自己的VBScript语言,同时以JScript为名发布了JavaScript的一

    个版本,以此很快跟上了Netscape的步伐。面对微软公司的竞争,Netscape和Sun公司联合ECMA(欧洲

    计算机制造商协会)对JavaScript语言进行了标准化。于是出现了ECMAScript语言,这是同一种语言的

    另一个名字。虽说ECMAScript这个名字没有流行开来,但人们现在谈论的JavaScript实际上就是

    ECMAScript。

    到了1996年,JavaScript、ECMAScript、JScript——随便你们怎么称呼它——已经站稳了脚跟。

    Netscape和微软公司在各自的第3版浏览器中都不同程度地支持JavaScript 1.1语言。

    注意 JavaScript与Sun公司开发的Java程序语言没有任何联系。JavaScript最开始的名字是

    LiveScript,后来选择“JavaScript”作为其正式名称的原因,大概是想让它听起来有系出名门的

    感觉。但令人遗憾的是,这一选择容易让人们把这两种语言混为一谈,而这种混淆又因为各种Web

    浏览器确实具备这样或那样的Java客户端支持功能而进一步加剧。事实上,Java在理论上几乎可以

    部署在任何环境,但JavaScript却倾向于只应用在Web浏览器。

    JavaScript是一种脚本语言,通常只能通过Web浏览器去完成一些操作而不能像普通意义上的程序那样

    独立运行。因为需要由Web浏览器进行解释和执行,所以JavaScript脚本不像Java和C++等编译型程序设

    计语言那样用途广泛。不过,这种相对的简单性也正是JavaScript的长处:比较容易学习和掌握,所以

    那些本身不是程序员,但希望通过简单的剪贴操作把脚本嵌入现有网页的普通用户很快就接受了

    JavaScript。

    JavaScript还向程序员提供了一些操控Web浏览器的手段。例如,JavaScript语言可以用来调整Web浏览

    器窗口的高度、宽度和位置等属性。这种设定浏览器属性的办法可以看做是BOM(浏览器对象模型)。

    JavaScript的早期版本还提供了一种初级的DOM。

    1.2 DOM

    什么是DOM?简单地说,DOM是一套对文档的内容进行抽象和概念化的方法。

    在现实世界里,人们对所谓的“世界对象模型”都不会陌生。例如,当用“汽车”、“房

    子”和“树”等名词来称呼日常生活环境里的事物时,我们可以百分之百地肯定对方知道我们说的是什

    么,这是因为人们对这些名词所代表的东西有着同样的认识。于是,当对别人说“汽车停在了车库

    里”时,可以断定他们不会理解为“小鸟关在了壁橱里”。

    我们的“世界对象模型”不仅可以用来描述客观存在的事物,还可以用来描述抽象概念。例如,假设有

    个人向我问路,而我给出的答案是“左边第三栋房子”。这个答案有没有意义将取决于那个人能否理

    解“第三”和“左边”的含义。如果他不会数数或者分不清左右,则不管他是否理解这几个概念,我的

    回答对他都不会有任何帮助。在现实世界里,正是因为大家对抽象的世界对象模型有着基本的共识,人

    们才能用非常简单的话表达出复杂的含义并得到对方的理解。具体到这里的例子,你可以相当有把握地

    断定,其他人对“第三”和“左边”的理解和我完全一样。

    这个道理对网页也同样适用。JavaScript的早期版本向程序员提供了查询和操控Web文档某些实际内容

    (主要是图像和表单)的手段。因为JavaScript预先定义了“images”和“forms”等术语,我们才能

    像下面这样在JavaScript脚本里引用“文档中的第三个图像”或“文档中名为‘details’的表单”:

    document.images[2]

    document.forms['details']

    现在的人们通常把这种试验性质的初级DOM称为“第0级DOM”(DOM Level 0)。在还未形成统一标准的

    初期阶段,“第0级DOM”的常见用途是翻转图片和验证表单数据。Netscape和微软公司各自推出第四代

    浏览器产品以后,DOM开始遇到麻烦,陷入困境。

    1.3 浏览器战争

    Netscape Navigator 4发布于1997年6月,IE 4发布于同年10月。这两种浏览器都对它们的早期版本进

    行了许多改进,大幅扩展了DOM,使能够通过JavaScript完成的功能大大增加。而网页设计人员也开始

    接触到一个新名词:DHTML。

    1.3.1 DHTML

    DHTML是“Dynamic HTML”(动态HTML)的简称。DHTML并不是一项新技术,而是描述HTML、CSS和

    JavaScript技术组合的术语。DHTML背后的含义是:

    利用HTML把网页标记为各种元素;

    利用CSS设置元素样式和它们的显示位置;

    利用JavaScript实时地操控页面和改变样式。

    利用DHTML,复杂的动画效果一下子变得非常容易实现。例如,用HTML标记一个页面元素:

    
This is my element


    然后用CSS为这个页面元素定义如下位置样式:

    myelement {

    position: absolute;

    left: 50px;

    top: 100px;

    }

    接下来,只需利用JavaScript改变myelement元素的left和top样式,就可以让它在页面上随意移

    动。不过,这只是理论而已。

    不幸的是,NN 4和IE 4浏览器使用的是两种不兼容的DOM。换句话说,虽然浏览器制造商的目标一样,但他们在解决DOM问题时采用的办法却完全不同。

    1.3.2 浏览器之间的冲突

    Netscape公司的DOM使用了专有元素,这些元素称为层(layer)。层有唯一的ID,JavaScript代码需要

    像下面这样引用它们:

    document.layers['myelement']

    而在微软公司的DOM中这个元素必须像下面这样引用:

    document.all['myelement']

    这两种DOM的差异并不止这一点。假设你想找出myelement元素的left位置并把它赋值给变量xpos,那么在Netscape Navigator 4浏览器里必须这样做:

    var xpos = document.layers['myelement'].left;

    而在IE 4浏览器中,需要使用如下所示的语句才能完成同样的工作:

    var xpos = document.all['myelement'].leftpos;

    这就导致了一种很可笑的局面:程序员在编写DOM脚本代码时必须知道它们将运行在哪种浏览器环境

    里,所以在实际工作中,许多脚本都不得不编写两次,一次为Netscape Navigator,另一次为IE。同

    时,为了确保能够正确地向不同的浏览器提供与之相应的脚本,程序员还必须编写一些代码去探查在客

    户端运行的浏览器到底是哪一种。

    DHTML打开了一个充满机会的新世界,但想要进入其中的人们却发现这是个充满苦难的世界。因此,没

    多久,DHTML就从一个大热门变成了一个人们不愿提起的名词,而对这种技术的评价也很快地变成

    了“宣传噱头”和“难以实现”。

    1.4 制定标准

    就在浏览器制造商以DOM为武器展开营销大战的同时,W3C不事声张地结合大家的优点推出了一个标准化

    的DOM。令人欣慰的是,Netscape、微软和其他一些浏览器制造商们还能抛开彼此的敌意而与W3C携手制

    定新的标准,并于1998年10月完成了“第1级DOM”(DOM Level 1)。

    回到刚才的例子,我们已经用
标签定义了一个ID为myelement的页面元素,现在需要找出它的

    left位置并把这个值保存到变量xpos中。下面是使用新的标准化DOM时需要用到的语法:

    var xpos = document.getElementById('myelement').style.left

    乍看起来,这与刚才那两种非标准化的专有DOM相比并没有明显的改进。但事实上,标准化的DOM有着非

    常远大的抱负。

    浏览器制造商们感兴趣的只不过是通过JavaScript操控网页的具体办法,但W3C推出的标准化DOM却可以

    让任何一种程序设计语言对使用任何一种标记语言编写出来的任何一份文档进行操控。

    1.4.1 浏览器以外的考虑

    DOM是一种API(应用编程接口)。简单地说,API就是一组已经得到有关各方共同认可的基本约定。在

    现实世界中,相当于API的例子包括(但不限于)摩尔斯码、国际时区、化学元素周期表。以上这些都

    是不同学科领域中的标准,它们使得人们能够更方便地交流与合作。如果没有一个统一的标准,事情往

    往会演变成为一场灾难。别忘了,因混淆英制度量衡与公制度量衡至少导致过一次火星探测任务的失

    败。

    在软件编程领域中,虽然存在着多种不同的语言,但很多任务却是相同或相似的。这也正是人们需要

    API的原因。一旦掌握了某个标准,就可以把它应用在许多不同的环境中。虽然语法会因为使用的程序

    设计语言而有所变化,但这些约定却总是保持不变的。

    因此,虽然本书的重点是教会你如何通过JavaScript使用DOM,当你需要使用诸如PHP或Python之类的程

    序设计语言去解析XML文档的时候,你获得的DOM新知识将会有很大的帮助。

    W3C对DOM的定义是:“一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态地访

    问和修改文档的内容、结构和样式。”W3C推出的标准化DOM,在独立性和适用范围等诸多方面,都远远

    超出了各自为战的浏览器制造商们推出的各种专有DOM。

    1.4.2 浏览器战争的结局

    我们知道,浏览器市场份额大战中微软公司战胜了Netscape,具有讽刺意味的是,专有的DOM和HTML标

    记对这个最终结果几乎没有产生影响。IE浏览器注定能击败其他对手,不过是因为所有运行Windows操

    作系统的个人电脑都预装了它。

    受浏览器战争影响最重的人群是那些网站设计人员。跨浏览器开发曾经是他们的噩梦。除了刚才提到的

    那些在JavaScript实现方面的差异之外,Netscape Navigator和IE这两种浏览器在对CSS的支持方面也

    有许多非常不同的地方。而编写那些可以同时支持这两种浏览器的样式表和脚本的工作也成了一种黑色

    艺术。

    浏览器制造商的自私姿态遭到人们的激烈反对,一个名为Web标准计划(简称WaSP,http:webstandards.org)的小组应运而生。WaSP小组采取的第一个行动就是,鼓励浏览器制造商们

    采用W3C制定和推荐的各项标准,也就是在浏览器制造商们的帮助下得以起草和完善的那些标准。

    或许是因为来自WaSP小组的压力,又或许是因为企业的内部决策,下一代浏览器产品对Web标准的支持

    得到了极大的改善。

    1.4.3 崭新的起点

    早期浏览器大战至今,浏览器市场已经发生了巨大的变化,而且到了今天,这一切也几乎每天都有变

    化。有的浏览器,比如Netscape Navigator,差不多已经从人们的视野中消失了,而新一代浏览器则陆

    续登台亮相。苹果公司在2003年首次发布了它的Safari浏览器(基于WebKit),它从一开始就坚定不移

    地遵循DOM标准。今天,包括Firefox、Chrome、Opera和IE,以及一些基于WebKit的其他浏览器都对DOM

    有着良好的支持。很多最潮的智能手机浏览器都在使用WebKit渲染引擎,推动着手持浏览器开发不断向

    前,让手机上网的体验甚至好过了使用某些桌面浏览器。

    注意 WebKit(http:webkit.org)是Safari和Chrome采用的一个开源Web浏览器引擎。以WebKit

    和Gecko(Firefox的核心,https:developer.mozilla.orgenGecko)为代表的开源引擎,在促

    进微软的Trident(IE的核心)等专有浏览器引擎逐步向Web标准靠拢方面起到特别积极的作用。

    今天,几乎所有的浏览器都内置了对DOM的支持。20世纪90年代后期的浏览器大战的硝烟已经散尽。现

    在的浏览器厂商无一不在争先恐后地实现最新规范。我们已经目睹了由异步数据传输技术(Ajax)所引

    发的学习DOM脚本编程的热潮,而HTML5 DOM的众多新特性,怎能不让人对Web的未来浮想联翩?HTML5极

    大地改进了标记的语义,让我们通过