
通过《DOM 启蒙》,读者将学习如何通过文档对象模型(DOM)更有效率地操作HTML,而无需DOM 操作库的帮助。作者Cody Lindley(jQuery 手册)用菜谱风格的代码示例,用演示多种节点对象的工作方式,带你领略现代DOM 理念。在过去的十年里,框架简化了DOM 的用法,后者因此被开发者尘封在前者之下。本书通过现代浏览器原生的概念与代码,将这些工具带回视线。读者将理解jQuery 在DOM 脚本编写中扮演的角色,并学习如何在移动应 用和特定浏览器中直接使用DOM 编写应用程序。
O’Reilly Media, Inc.介绍 O’Reilly Media 通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。自 1978 年开始,O’Reilly 一直都是前沿发展的见证者和推动者。超级极客们正在开创着未来, 而我们关注真正重要的技术趋势——通过放大那些“细微的信号”来刺激社会对新科技 的应用。作为技术社区中活跃的参与者,O’Reilly 的发展充满了对创新的倡导、创造和 发扬光大。 O’Reilly 为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组 织了影响深远的开放源代码峰会,以至于开源软件运动以此命名;创立了Make 杂志, 从而成为DIY 革命的主要先锋;公司一如既往地通过多种形式缔结信息与人的纽带。 O’Reilly 的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创新 产业的革命性思想。作为技术人士获取信息的选择、O’Reilly 现在还将先锋专家的知识 传递给普通的计算机用户。无论是通过书籍出版、在线服务或者面授课程,每一项O’Reilly 的产品都反映了公司不可动摇的理念——信息是激发创新的力量。 业界评论 “O’Reilly Radar 博客有口皆碑。” ——Wired “O’Reilly 凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业 务。” ——Business 2.0 “O’Reilly Conference 是聚集关键思想领袖的绝对典范。” ——CRN “一本O’Reilly 的书就代表一个有用、有前途、需要学习的主题。” ——Irish Times “Tim 是位特立独行的商人,他不光放眼于最长远、最广阔的视野并且切实地按照 Yogi Berra 的建议去做了:‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去, Tim 似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。” ——Linux Journal | V | XI 前言 我创建网站。有时我也创作音乐。多年来,我在有些自认为是创作型的音乐家那里—— 经常是自学的——注意到一个有趣的行为模式:他们抵触学习任何音乐理论。他们认为, 从逻辑上来说,知晓音乐背后的理论会莫名限制他们的创作能力。我从来搞不懂这逻辑 (并且我私下认为这是因松懈而找的借口)。依我看,我不觉得任何知识或者启蒙会是坏 事。 唉,我在Web 设计领域也看到了类似的逻辑。有些设计师不仅不知道如何写HTML 与 CSS,而且他们坚决拒绝学习。同样的,他们害怕这些知识会在某种程度上限制自己(同 样的,我认为这是个自证的借口)。 幸运的是这种态度在前端开发领域还不流行。大多数Web 开发者明白学无止境,但 就算是对 HTML 与CSS 知识有百科全书般全面认知的开发者,在涉及文档对象模型 (Document Object Model)时仍会有知识差距。这情有可原。如果用了类似jQuery 的 库,你不需要懂得 DOM 内部工作机制。JavaScript 库的意义就在于抽离开浏览器内部的 API,并转而提供一个不同的、更好的API。 尽管如此,我认为许多前端开发者觉得他们应该知道表面之下都发生了什么。这是一个 优秀极客遇到他们工作所需系统的自然反应。现在,感谢 《DOM 启蒙》,他们可以一解 心头之痒了。 道格拉斯· 克罗克福德在他的书《JavaScript 语言精粹》中给了我们理解JavaScript 语言 内部机制的图谱。现在科迪· 林得利也给了文档对象模型的相应图谱。以此图谱为武装, 你就获得了指引DOM 通路与隧道所需的知识。 XII | 前言 你或许不能在每个项目中都运用到这些知识,或许选择改用诸如jQuery 的类库,但此时 就任君抉择了。与其因所知有限必须使用某个类库,不如拥有是否以及何时使用 jQuery 的决定权。这是种大权在握的感觉,全凭所知所学提供,是真正的启蒙所指。 —— 杰里米· 基思,clearleft.com 的创始人与技术监督, 《JavaScript DOM 编程艺术》一书的作者 | XIII 序言 本书并不是一本巨细靡遗的DOM 脚本或者 JavaScript(http://javascriptenlightenment. com/)的参考书。不过,它或许是最细致入微的无关使用库或者框架的 HTML DOM 书。 缺少此话题的著作并非无缘无故,由于老旧浏览器与它们对 DOM 规范的实现差异(或 者缺失),大多数技术著作作者都不愿意讨论这个话题。 为本书之目的(即深入理解概念),我将回避浏览器 API 杂乱与濒亡浏览器的不符,以 致力于展示现代 DOM。是的,我将回避丑怪以求专注于此时此刻。毕竟,我们有类似 jQuery 等解决方案来处理所有浏览器的不美之处,并且当你与废弃浏览器打交道时,绝 对应该考虑 jQuery 之类。 尽管我不会兜售使用原生方式进行 DOM 脚本操作这样的观点,但我写作本书确实有部 分目的是或许能使开发者意识到,操作 DOM 时,DOM 库并非必需。我也为那些幸运的 少数人群写作本书,那些可以只为单个环境(例如,单个浏览器、移动浏览器,或者通 过类似 PhoneGap 的 HTML + CSS + JavaScript 至原生转换)写 JavaScript 的家伙们。在 本书中你能学到的或许只是实现一个理想条件的、并无必要的 DOM 库——比如说,一 些轻量 DOM 脚本,仅用于部署到某个 WebKit 核心的移动浏览器。 本书读者 写作本书时,我一直假想有两种类型的开发者。我设想这两种类型都有普通到精通程度 的JavaScript、HTML 以及CSS 知识。第一种开发者是那种已非常了解JavaScript 或者 jQuery,但是从未真正花时间去理解像jQuery 这样一个库的目的与价值(如果你愿意, 还可以探讨jQuery 的得名之由)的人。具备好本书提供的知识,这种开发者应当完全 能够明白jQuery 给DOM 脚本编程带来的价值。获得价值之外,还能够了解 jQuery 如 何抽象DOM 接口,以及它在何处、为何做了补充。第二种开发者是那种被分派到编写 HTML 文档脚本任务的工程师,这类脚本只在现代浏览器中执行,或者被转译成原生代 码移植到多个操作系统与设备(例如 PhoneGap)中,并需要避免一个库带来的负担(也 就是库本身的代码量或者说库的代码量与使用率之比)。 XIV | 序言 技术意图、允诺及约束 在阅读本书之前,确保你已理解如下技术意图、允诺及约束。 y 本书中所包含的内容与代码以现代浏览器(IE 9 以上、最新的火狐浏览器、最新的 Chrome 浏览器、最新的 Safari 浏览器、最新的 Opera 浏览器)为目标而编写。我 的目标就是仅包含现代浏览器原生的概念与代码。如果我冒险到此目标之外,我将 说明这一事实以使读者注意。我通常避免在本书中引入任何只在特定浏览器或者一 小部分浏览器中的实现。 y 我并不试图在此书中武断地专注于某一特定 DOM、CSS 或HTML 规范。 考虑到编 写中的规范数量,以及浏览器正确实现这些规范的历史与现状,那会是太大的一项 事业(并且我认为回报甚微)。我以一种非常主观的方式评估、权衡了规范中的如 下内容:文档对象模型(DOM)Level 3 核心规范(http://goo.gl/gnHw2F)、DOM4 (http://goo.gl/CEy1IX)、文档对象模型 HTML(http://goo.gl/at7HUn)、元素遍历规 范(http://goo.gl/CtCcIe)、选择器 API Level 2(http://goo.gl/GqKjFF)、DOM 解 析与序列化(http://goo.gl/oF2uk4)、HTML 5 索引(http://goo.gl/e1XtZp)、HTML 5 —— 一个关于 HTML 和 XHTML 的单词表与相关 API(http://goo.gl/4OAZcP)、 HTML 实时规范(http://goo.gl/cauAVb)、“HTML :实时规范”开发者版(http:// developers.whatwg.org/),以及 DOM 实时规范(http://dom.spec.whatwg.org/)。本 书的内容更多地是基于社区所在,而不是试图教条式地宣传某一特定规范。 y 我会涵盖几个手工挑选的无关 DOM 的话题。我在本书中引入这些话题是为了帮助 读者能够恰当理解 DOM 与 CSS、JavaScript 之间的关系。 y 我特意略掉了关于 XML 或者 XHTML 的细节。 y 为了让这本书简练,我特意排除了表单与表格的 API。不过我知道这些章节将来会 被加进来。 授权协议 DOM 启蒙HTML 版(http://domenlightenment.com/)采用《Creative Commons 姓名标 识 非商业性 禁止改作 3.0》(http://creativecommons.org/licenses/by-nc-nd/3.0/)非移 植协议授权。 本书并非一般编程书籍 在你开始阅读之前,先得明白本书中采用的多种风格。请勿略过此节,因为它含有帮助 你理解这些独特风格的重要信息。 序言 | XV 启蒙系列(还包括《jQuery 启蒙》(http://jQueryenlightenment.com/)和《JavaScript 启蒙》 (http://javascriptenlightenment.com/))的写作风格偏好短小、独立、能够即刻执行的代码, 而非冗长的文字叙述和庞大的程序。我最喜欢的作者之一,C.S. Lewis 断言文字叙述是 人类沟通方式中最低级的形式。我完全赞同这一说法,并把它作为写这些书的风格基础。 我认为表达技术信息的最佳方式是,使用尽可能少的文字,配上恰好足够表达观点的可 执行代码与注释。本书的风格是尝试通过尽可能少的文字,依靠真实代码,展现一个定 义明确的概念。因此,当你初次接触这些概念时,应当执行、检视这些代码,从而在心 中建立基础思维模型,理解描述这些概念所用的文字。另外,这系列书尝试有条不紊地 将概念分解成小到不能再小的形式,在独立情景中检视它们。综上所述,本书并非在广 泛主题上的长篇大论或深度追踪。把这当作警醒,或许这样会好点,把本书当作一般指南, 但更加简明扼要。 颜色与编码规范 在代码示例中,加粗文本用来突出与所讨论概念直接相关的代码。用来支撑加粗代码的 其他内容则用普通字体。斜体则留作注释用。如下示例。 (http://jsfiddle.net/user/domenlightenment/fiddles/) <!DOCTYPE html> <html lang="en"> <body> <script> // 与如下代码相关的注释 var foo = ' 与概念相关代码'; </script> </body> </html> jsFiddle 本书中大部分代码示例都链接到相应的 jsFiddle(http://jsfiddle.net/)页面,可以到那里 在线把玩、执行代码。这些 jsFiddle 示例都配置了 Firebug lite-dev(https://getfirebug. com/firebug-lite-debug.js)插件,确保读者能看到书中到处都是的 console.log。在阅读本 书之前,请熟悉 console.log 的用法与用处。 当 jsFiddle 导致代码示例变复杂时,我就不链接在线示例了。 XVI | 序言 本书的规范 本书采用如下版式规范(另见前文“颜色与编码规范”): 斜体 表示新术语、URL、电子邮箱地址、文件名、以及文件扩展名。 constant width 定宽字符 用来罗列程序,和在段落中指代程序元素,例如变量或者函数名、数据库、数据类型、 环境变量、表达式及关键字。 注意 此图标代表提示、建议或一般注解。 使用代码样例 本书是为了帮助用户提供解决方案。总的来说,用户可以直接在程序或者文档中使用本 书提供的代码,无须与我们联系获得许可,除非用户复制大量的程序。例如,用户想利 用本书中的一些代码编写程序不需要得到许可,不过如果是想将O’Reilly 书中的代码例 子用于出售或复制光盘就必须获得许可。可以引用本书的内容或者代码样例来解决其他 问题,但是在自己的产品文档中使用本书的重要代码样例需要事先得到许可。 我们不要求用户标注本书的出处,但感激您的注释。注释通常包括标题、作者、出版社 以及ISBN 序列号。例如:“DOM Enlightenment 1st edition by Cody Lindley(O'Reilly). Copyright 2013 Cody Lindley, 978-1-449-34284-5.”。 如果你对于引用代码样例是否属于侵权行为不确定,请随时联系我们:permissions@ oreilly.com。 Safari 在线图书 Safari 在线图书是一个按需数字图书馆,可让您轻松快速地搜索超过7500 部技术与创新相关图书和视频来寻找解决方案。 通过订阅,您可以通过在线、手机和移动设备等方式阅读或观看Safari 图书馆中任何章 节或视频。若有机会阅读赋予印刷前的手稿,并发现有待改进的地方,请反馈给作者。 序言 | XVII 您可以复制粘贴代码样例、组织下载喜欢的章节、在关键部分插入图书标签、创建笔记、 打印页面,从各种简便的功能中获益。 O’Reilly Media 上传本书至Safari 在线图书服务商。与O’Reilly 其他类似图书及出版物 一样拥有本书的一切数字权利,免费注册:http://my.safaribooksonline.com。 联系我们 对于本书的评论或问题请联系出版商: 美国 O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 中国 北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035) 奥莱利技术咨询(北京)有限公司 有关本书的网页、勘误表、样例和其他信息,请登录: http://shop.oreilly.com/product/0636920022886.do 关于本书的评论或技术讨论可发送邮件至: bookquestions@oreilly.com 如果想了解关于本书、会议、资源中心或O’Reilly 网络的其他相关信息,请登录网站: http://www.oreilly.com 致谢 写一本书是团队的力量。我由衷地感谢以下朋友慷慨的支持。 感谢Tim O’Reilly、Brian Jepson 和其他那些在ORM 从完成本书的经历中获得回报的朋 友们。 感谢David Kaneda 对完美的执着追求。不论是一段程序或是用户界面动画,他会一直修 改到完美才肯睡觉,而我喜欢这一点。 XVIII | 序言 感谢那些在Nitobi 创造和一直支持PhoneGap 的朋友。 感谢Brian Fling 帮我拓宽了移动领域的视野,而不只是停留在最新最好的硬件上。Brian 深入了解现在的移动领域,他是个出色的作家,最重要的是,他是一个非常慷慨的家伙。 感谢PPK、John Gruber、John Allsopp 和John Resig 的贡献以及使得本书完成的潜在技 术的支持。 感谢Joe Bowser、Brian LeRoux、Sara Czyzewicz,以及一群在OFPS 上慷慨地提供关于 本书的评论和问题的朋友。我非常感激你们的反馈,非常有帮助。 感谢我的家人、朋友和委托人在我忙于写作时对我的理解和支持。 最后,感谢Erica。你让所有的事情都成为可能,我爱你!
目录 前言 .................................................................................... XI 序言 .................................................................................. XIII 第1 章 节点概览 ..................................................................1 1.1 文档对象模型(Document Object Model,亦称 DOM)是个由JavaScript 节点对象组成的层次结构/ 树 ................................................................................. 1 1.2 节点对象类型 ........................................................................................................... 2 1.3 继承自节点对象的子节点对象 ............................................................................... 5 1.4 用于与节点打交道的属性与方法 ........................................................................... 7 1.5 识别节点的类型与名称 ........................................................................................... 9 1.6 获取节点的值 ......................................................................................................... 11 1.7 使用 JavaScript 方法来创建元素与文本节点 ....................................................... 11 1.8 使用 JavaScript 字符串创建并向DOM 中添加元素与文本节点 ....................... 13 1.9 提取DOM 树中的部分作为JavaScript 字符串 ................................................... 15 1.10 使用 appendChild() 与 insertBefore() 向DOM 中插入节点对象....................... 16 1.11 使用 removeChild() 与 replaceChild() 来移除与替换节点 ................................. 18 1.12 使用 cloneNode() 来复制节点 ............................................................................. 20 1.13 理解节点集合(即 NodeList 与 HTMLCollection) ........................................... 21 1.14 获取所有直属子节点的列表/ 集合 .................................................................... 22 1.15 将 NodeList 或者 HTMLCollection 转换成JavaScript 数组 .............................. 23 VI | 目录 1.16 遍历 DOM 中的节点 ............................................................................................ 24 1.17 使用 contains() 与 compareDocumentPosition() 验证节点在 DOM 树中的 位置........................................................................................................................ 26 1.18 判断两个节点是否相同 ........................................................................................ 28 第2 章 文档节点 ................................................................31 2.1 文档节点概览 ......................................................................................................... 31 2.2 HTML 文档属性与方法(包括继承的) ............................................................... 32 2.3 获取 HTML Document 通用信息(标题、链接、提及者、最后修改时间 及兼容模式) ............................................................................................................ 33 2.4 文档子节点 ............................................................................................................. 34 2.5 document 提供的 <!DOCTYPE>、<html lang="en">、<head> 及 <body> 捷径 .......................................................................................................................... 35 2.6 使用 document.implementation.hasFeature() 探测 DOM 规范/ 特性 .................. 36 2.7 获取文档中当前聚焦/ 激活节点的引用 .............................................................. 37 2.8 判断文档或者文档中任何节点得到焦点 ............................................................. 38 2.9 document.defaultView 是个到顶部/ 全局对象的捷径 ......................................... 39 2.10 使用 ownerDocument 从某一元素取得文档的引用 ........................................... 39 第3 章 元素节点 ................................................................41 3.1 HTML*Element 对象概览 ...................................................................................... 41 3.2 HTML*Element 对象属性与方法(包括继承的) ................................................ 42 3.3 创建元素 ................................................................................................................. 44 3.4 获取元素的标签名 ................................................................................................. 44 3.5 获取元素属性与值的列表/ 集合 .......................................................................... 45 3.6 获取、设置及移除元素的属性值 ......................................................................... 46 3.7 验证元素是否有某一特定属性 ............................................................................. 47 3.8 获取类属性值列表 ................................................................................................. 48 3.9 添加与移除类属性中的部分值 ............................................................................. 49 3.10 变换某个类属性值 ............................................................................................... 50 目录 | VII 3.11 判断类属性值是否含有某一特定值.................................................................... 50 3.12 获取与设置 data-* 属性 ....................................................................................... 51 第4 章 元素节点选取 .........................................................53 4.1 选取特定元素节点 ................................................................................................. 53 4.2 选取/ 创建一个元素节点列表(即 NodeList) .................................................... 54 4.3 选取所有的直属子元素节点 ................................................................................. 56 4.4 选取与上下文有关的元素 ..................................................................................... 56 4.5 预定义的元素节点选取/ 列表 .............................................................................. 58 4.6 使用 matchesSelector() 验证元素会否被选取....................................................... 59 第5 章 元素节点几何量与滚动几何量 ................................61 5.1 元素节点尺寸、偏移及滚动概览 ......................................................................... 61 5.2 获取元素相对于 offsetParent 的 offsetTop 及 offsetLeft 值 ................................. 61 5.3 使用 getBoundingClientRect() 获取元素相对于视区的Top, Right, Bottom 及Left 边沿偏移量 ................................................................................................. 64 5.4 获取元素在视区中的尺寸(边框 + 填充 + 内容) ............................................... 66 5.5 获取元素在视区中的尺寸(填充 + 内容),不含边框 ....................................... 67 5.6 使用 elementFromPoint() 获取视区中某一特定点上最顶层的元素 ................... 68 5.7 使用 scrollHeight 及 scrollWidth 获取滚动元素的尺寸 ....................................... 69 5.8 使用 scrollTop 及scrollLeft 获取并设置从上、左边滚动的距离 ....................... 70 5.9 使用 scrollIntoView() 滚动元素到视区 ................................................................. 71 第6 章 元素节点内联样式 ..................................................73 6.1 样式属性(亦称元素内联 CSS 属性)概览 ........................................................ 73 6.2 获取、设置及移除单个内联 CSS 属性 ................................................................ 74 6.3 获取、设置及移除所有内联 CSS 属性 ................................................................ 78 6.4 使用 getComputedStyle() 获取元素的已计算样式(即包含任何级联样式的 实际样式) ................................................................................................................ 80 6.5 使用 class 及 id 属性应用或者移除元素上的 CSS 属性 ..................................... 81 VIII | 目录 第7 章 文本节点 ................................................................83 7.1 文本对象概览 ......................................................................................................... 83 7.2 文本对象与属性 ..................................................................................................... 84 7.3 空白符创建文本节点 ............................................................................................. 85 7.4 创建与注入文本节点 ............................................................................................. 86 7.5 使用 .data 或 nodeValue 获取文本节点值 ............................................................. 87 7.6 使用appendData()、deleteData()、insertData()、replaceData() 及 subStringData() 操作文本节点 ............................................................................... 88 7.7 当有多个兄弟文本节点时 ..................................................................................... 89 7.8 使用 textContent 移除文本标记并返回所有的子文本节点 ................................. 90 7.9 textContent 与 innerText 的区别 ............................................................................ 92 7.10 使用 normalize() 合并兄弟文本节点成单个文本节点 ....................................... 92 7.11 使用 splitText() 分割文本节点 ............................................................................. 93 第8 章 DocumentFragment 节点.......................................95 8.1 DocumentFragment 对象概览 ................................................................................ 95 8.2 使用 createDocumentFragment() 创建 DocumentFragment .................................. 95 8.3 添加 DocumentFragment 到实时 DOM ................................................................. 96 8.4 使用文档片段上的 innerHTML ............................................................................. 97 8.5 通过复制将片段所含节点保留在内存中 ............................................................. 99 第9 章 CSS 样式表与 CSS 规则 .....................................101 9.1 CSS 样式表概览 ................................................................................................... 101 9.2 访问 DOM 中所有样式表(即 CSSStyleSheet 对象) ........................................ 103 9.3 CSSStyleSheet 属性与方法 .................................................................................. 104 9.4 CSSStyleRule 概览 ............................................................................................... 106 9.5 CSSStyleRule 属性与方法 ................................................................................... 107 9.6 使用 cssRules 获取样式表内的 CSS 规则列表 .................................................. 108 9.7 使用 insertRule() 和 deleteRule() 来插入与删除样式表中的 CSS 规则 ........... 109 目录 | IX 9.8 使用 .style 属性修改 CSSStyleRule 的值 ............................................................ 110 9.9 创建新的内联 CSS 样式表 ...................................................................................111 9.10 以编程方式添加外部样式表到 HTML 文档 .....................................................111 9.11 用 .disabled 属性使样式表失效/ 生效 .............................................................. 112 第10 章 DOM 中的 JavaScript ........................................115 10.1 插入与执行 JavaScript 概览 ............................................................................... 115 10.2 JavaScript 默认同步解析 .................................................................................... 116 10.3 使用 defer 推迟外部脚本的下载与执行 ........................................................... 117 10.4 使用 async 异步下载并执行外部JavaScript 文件 ............................................ 118 10.5 使用动态 <script> 元素强制异步加载并解析外部 JavaScript ........................ 120 10.6 通过给异步 <script> 加 onload 回调从而知道它们何时加载完毕 ................. 121 10.7 注意含有 DOM 操作的 <script> 的放置 ........................................................... 122 10.8 获取 DOM 中 <script> 列表 ............................................................................... 122 第11 章 DOM 事件 ..........................................................125 11.1 DOM 事件概览 ................................................................................................... 125 11.2 DOM 事件类型 ................................................................................................... 127 11.3 事件流程.............................................................................................................. 135 11.4 添加事件监听函数到Element 节点、window 对象及document 对象........... 138 11.5 移除事件监听函数.............................................................................................. 139 11.6 从事件对象中获取事件属性.............................................................................. 140 11.7 使用 addEventListener() 时监听函数中 this 的值 ............................................. 141 11.8 事件调用时取得事件模板而不是所绑定的节点或对象.................................. 143 11.9 使用 preventDefault() 撤销浏览器默认事件 ..................................................... 143 11.10 使用 stopPropagation() 终止事件流程 ............................................................. 145 11.11 使用 stopImmediatePropagation() 终止事件流程与相同目标上的其他 事件 ................................................................................................................... 146 11.12 自定义事件........................................................................................................ 147 X | 目录 11.13 模拟/ 触发鼠标事件 ........................................................................................ 148 11.14 事件委托............................................................................................................ 149 第12 章 创作dom.js :源自jQuery 的灵感,服务于现代 浏览器,这是一个万众期待的DOM 库 ..............151 12.1 dom.js 概览 .......................................................................................................... 151 12.2 创建唯一作用域 ................................................................................................. 152 12.3 创建 dom() 与 GetOrMakeDom(),全局暴露 dom() 与 GetOrMakeDom. prototype .............................................................................................................. 152 12.4 创建传给 dom() 的可选上下文参数 .................................................................. 154 12.5 依据 params 产生一个持有 DOM 节点引用的对象并返回 ............................ 155 12.6 创建 each() 方法并使它可链式调用 ................................................................. 158 12.7 创建 html()、append() 及 text() 方法................................................................. 159 12.8 拉 dom.js 出来兜兜风 ......................................................................................... 160 12.9 总结与 dom.js 继续 ............................................................................................. 162