第1篇 壮志从戎 3
第1章 与初学者谈谈JavaScript学习 3
1.1 学之初,你应该清楚的几个概念 3
1.1.1 B/S和C/S 3
1.1.2 RWC和RIA 4
1.1.3 结构、行为和表现 4
1.2 审视JavaScript语言特性 5
1.2.1 JavaScript是一门灵活的脚本语言 5
1.过程化设计 6
2.定义原型方法 6
3.封装原型方法 6
4.造车不如设计标准 7
5.方法接龙 7
6.实例体验 8
1.2.2 JavaScript是基于对象的语言 8
1.万物皆为对象 8
2.奇怪的指针 9
3.灵活的用法 9
1.2.3 JavaScript是函数式语言 10
1.八面玲珑的函数 10
2.函数的作用域 11
3.奇怪的函数闭包 11
4.函数的上下文对象 11
1.3 JavaScript语言风云录 12
1.3.1 JavaScript寻根 12
1.3.2 三国志——JavaScript、JScript和ECMAScript 13
1.3.3 一个好汉三个帮——客户端的JavaScript实现 14
1.DOM 15
2.BOM 15
1.3.4 春秋五霸——令人生畏的浏览器混战和兼容 16
1.Mozilla 16
2.IE 16
3.Safari 17
4.Opera 17
5.Chrome 17
6.浏览器兼容方法 17
1.4 JavaScript运行环境 18
1.4.1 宿主环境 18
1.4.2 执行期环境 19
1.5 JavaScript解析机制 19
1.5.1 预编译 19
1.5.2 执行期 22
1.6 JavaScript执行顺序 23
1.6.1 按HTML文档流顺序执行JavaScript代码 23
1.6.2 预编译与执行顺序的关系 24
1.6.3 按块执行JavaScript代码 25
1.6.4 借助事件机制改变JavaScript执行顺序 26
1.6.5 JavaScript输出脚本的执行顺序 26
1.7 JavaScript应用范围 29
1.7.1 客户端的JavaScript 29
1.7.2 服务器端的JavaScript 30
1.7.3 其他环境的JavaScript 30
1.8 JavaScript开发工具箱 30
1.8.1 关于Web浏览器 30
1.8.2 关于JavaScript编辑器 31
1.8.3 关于JavaScript测试和调试工具 31
1.浏览器的错误控制平台 31
2.Firebug 33
3.HttpWatch 33
4.Web Developer Toolbar 34
5.JavaScript Debuger 34
第2章 Hello,World——JavaScript开发初体验 35
2.1 杨辉三角——第一个JavaScript程序 35
2.1.1 万物皆有规律——问题分析 37
2.1.2 递归算法设计 38
2.1.3 优化算法设计 39
2.1.4 输出杨辉三角 39
2.2 在网页中嵌入JavaScript脚本 40
2.2.1 使用script元素嵌入脚本 40
1.设置脚本类型 41
2.导入外部脚本文件 41
3.设置脚本的字符编码 42
4.设置脚本延迟执行 42
5.设置脚本在服务器端执行 42
2.2.2 探析外部脚本文件 42
1.导入外部脚本文件 43
2.何时使用外部JavaScript脚本文件 44
2.2.3 注意JavaScript脚本文件的关联性 44
2.2.4 使用接口技术解决JavaScript文件冲突 45
2.2.5 JavaScript文件与CSS文件导入和执行冲突 46
2.2.6 <script>标签在文档中的位置 48
2.2.7 杞人忧天——隐藏JavaScript脚本 49
2.2.8 关注细节——使用noscript元素 49
2.3 纠正编码习惯 50
2.3.1 JavaScript编码基本规范 51
1.JavaScript文件规范 51
2.代码缩进 51
3.代码长度 51
4.代码注释 51
5.变量声明 52
6.函数声明 52
7.标识符命名 52
8.语句 53
9.标签 53
2.3.2 思路梳理器——写好注释 53
1.单行注释 53
2.多行注释 54
2.3.3 留白的艺术——格式化代码 55
1.使用空行分隔代码块 55
2.空格是代码稀释剂 55
3.嵌套与缩进 55
4.换行缩进 56
5.大括号的位置 56
6.空结构的格式 56
7.单句结构的格式 56
2.4 程序调试 57
2.4.1 简单的手工调试 57
2.4.2 使用1st JavaScript Editor调试器进行调试 58
1.逐步调试 59
2.断点 60
3.观察 60
2.4.3 使用Microsoft Script Debugger进行调试 61
2.4.4 异常处理 63
1.异常处理的基本结构 64
2.异常处理中的兼容问题 64
3.打扫战场 66
第2篇 沙场秋点兵 69
第3章 运筹帷幄——俯瞰JavaScript语法体系 69
3.1 JavaScript语言词法基础 69
3.1.1 从字符编码开始接触JavaScript语言 70
3.1.2 认识JavaScript的实词和虚词概念 71
3.1.3 对大小写比较敏感的实词 72
3.1.4 实词类型 73
1.标识符 73
2.直接量 74
3.保留字 74
3.1.5 虚词类型 74
1.无意义的分隔符 75
2.有意义的分隔符 75
3.注释 76
3.2 JavaScript语言句法基础 77
3.2.1 认识句法三要素:词、句和段 77
1.段落 77
2.句子 78
3.词语 78
3.2.2 点号——逻辑域定位符 79
3.2.3 逗号——连续运算符 80
3.2.4 分号——语句分隔符 81
3.2.5 冒号——逻辑声明符 82
3.2.6 大括号——逻辑域分隔符 82
3.2.7 中括号——有序列表分隔符 84
3.2.8 小括号——强制运算符或逻辑分隔符 85
第4章 JavaScript血液系统——数据、数据类型和变量 89
4.1 从数据到类型 89
4.1.1 数据的本质 89
4.1.2 柔弱的JavaScript语言 90
4.1.3 JavaScript的基本数据类型 91
4.1.4 数之源——值类型和引用类型 92
4.1.5 原始值和引用值的操作本质 93
1.使用原始值 93
2.使用引用值 94
4.2 值类型数据 96
4.2.1 线性思维的符号——数值 96
1.数值直接量 96
2.八进制和十六进制数值 97
3.数值运算 97
4.特殊数值 98
4.2.2 形象思维的颜料——字符串 99
1.字符串直接量 99
2.转义序列 100
3.字符串操作 100
4.2.3 逻辑思维的卵细胞——布尔型 101
4.2.4 空无道人——null 101
4.2.5 人之初——undefined 102
4.3 引用类型数据 103
4.3.1 有序数据结构——数组 104
1.数组意象 104
2.第一次接触数组 105
4.3.2 离散数据结构——对象 105
1.对象意象 106
2.第一次接触对象 106
4.3.3 魔兽数据——函数 108
1.函数意象 108
2.大话函数演绎之路 108
3.探究奇特的函数解析机制 110
4.4 数据类型检测和转换 112
4.4.1 数据类型检测 113
1.使用typeof运算符 113
2.使用constructor属性 113
3.框架窗口的数组类型问题 114
4.设计更安全的数据类型检测方法 115
4.4.2 值类型数据的自动转换 117
4.4.3 引用型数据的自动转换 118
1.对象在逻辑运算环境中的特殊情况 118
2.对象在数值运算环境中的特殊情况 118
3.数组在数值运算环境中的特殊情况 119
4.对象在模糊运算环境中的情况处理 119
4.4.4 把值转换为字符串 120
1.使用加号运算符 120
2.圆滑的加号运算符 122
3.使用toString()方法 122
4.数字转换为字符串的模式问题 122
5.数字转换为字符串的位数问题 123
4.4.5 把值转换为数字 124
1.使用parseInt()函数 124
2.使用parseFloat()函数 125
3.使用乘号运算符 125
4.4.6 把值转换为布尔值 125
1.使用双重逻辑非运算符 125
2.使用Boolean()构造函数转换 126
4.4.7 装箱和拆箱 126
1.从值到引用——装箱 126
2.从引用到值——拆箱 127
4.4.8 数据类型的强制转换 128
4.5 使用变量 129
4.5.1 声明变量 129
1.变量声明的方法 129
2.3种变量命名法 130
4.5.2 丑陋的JavaScript变量 131
1.陋习一:变量没有类型 131
2.陋习二:变量可以重复声明 131
3.陋习三:变量可以隐式声明 132
4.陋习四:变量的灰色潜规则 132
4.5.3 不可跨越的门槛——变量的作用域 133
1.变量优先级问题 133
2.局部作用域的嵌套 134
3.利用函数作用域实现技术封装 134
4.变量的解析过程 135
5.被JavaScript忽略的块级作用域 136
6.函数闭包的作用域 136
4.5.4 圈里圈外——属性与变量 137
1.全局变量是全局对象的属性 137
2.局部变量是调用对象的属性 138
4.5.5 变量的作用域链 138
4.5.6 变量的垃圾回收 139
第5章 JavaScript肌肉系统——运算符、表达式 141
5.1 说说运算符和表达式 141
5.1.1 语言实际上就是数据和运算的交流工具 141
5.1.2 运算符是运算的解码器 142
5.1.3 走入运算符的童话世界 143
5.1.4 领略运算符的魔法法则 144
5.1.5 运算的人性化,还是随意性 146
5.1.6 警惕运算符的副作用 147
5.1.7 表达式是运算的最小逻辑单元 148
5.1.8 优化表达式的思维品质 148
5.2 天人合一——位运算符 151
5.2.1 位运算是整数的逐位运算 151
5.2.2 探秘二进制数运算奥秘 151
5.2.3 逻辑位运算 153
5.2.4 移位运算 155
5.3 童年无忌——算术运算符 157
5.3.1 加法的特殊运算 157
5.3.2 减法的特殊运算 158
5.3.3 乘法的特殊运算 159
5.3.4 除法的特殊运算 159
5.3.5 取模的特殊运算 160
5.3.6 取反运算 160
5.3.7 心脏起搏器——递增和递减 160
5.4 离散思维——字符串运算符 161
5.5 真真假假论乾坤——逻辑运算符 161
5.5.1 逻辑与运算 162
5.5.2 逻辑或运算符 164
5.5.3 逻辑非运算符 166
5.5.4 逻辑思维训练 166
5.6 货比三家——关系运算符 168
5.6.1 大小关系检测 168
5.6.2 包含关系检测 169
5.6.3 等值关系检测 170
5.7 复制数据——赋值运算符 172
5.8 对象操作运算符 174
5.8.1 女娲造人——new运算符 174
5.8.2 垃圾回收站—delete运算符 175
5.8.3 I/O接口——存取运算符 177
1.中括号运算符 177
2.点号运算符 178
5.8.4 光盘驱动器——函数调用运算符 179
5.9 其他运算符 180
5.9.1 迷你版分支逻辑——条件运算符 180
5.9.2 期待与收获——逗号运算符 181
5.9.3 俯首甘为孺子牛——void运算符 182
5.9.4 身份验证——类型检测运算符 183
第6章 JavaScript神经骨骼系统——语句、结构 185
6.1 从表达式到语句 185
6.1.1 什么是句子 186
6.1.2 两面性——表达式、表达式语句 188
6.1.3 群居性——复合语句 189
6.1.4 形影相随——句子、结构 190
6.1.5 不被执行的——声明语句 191
6.1.6 语句占位符——空语句 193
6.2 分支结构 193
6.2.1 if语句 193
6.2.2 if结构嵌套 194
1.错误的嵌套 194
2.正确的嵌套 195
6.2.3 else if语句 195
6.2.4 预防if结构嵌套的主观性 196
6.2.5 if结构中容易躲藏的Bug 197
6.2.6 switch语句 198
6.2.7 悟透default从句用法 200
6.2.8 恰当选用if结构和switch结构 202
6.2.9 分支结构中逻辑顺序的优化 204
6.3 循环结构 205
6.3.1 while语句 205
6.3.2 do/while语句 207
6.3.3 for语句 207
6.3.4 for/in语句 209
6.3.5 灵活使用for/in结构 210
6.3.6 如何正确选用while和for结构 212
1.从语义性角度比较 212
2.从思维模式角度比较 212
3.从达成目标角度比较 214
6.3.7 优化循环结构和提高循环效率 215
1.优化结构 215
2.避免不必要的重复操作 216
3.妥善定义循环变量 216
6.4 结构的逻辑干预 216
6.4.1 有序思维的锚点——标签语句 217
6.4.2 跳出往后执行——break语句 218
6.4.3 继续重新执行——continue语句 220
6.5 逻辑异常处理 222
6.5.1 剖析异常和异常种类 222
6.5.2 知法犯法——throw语句 223
6.5.3 异常处理器——try/catch/finally语句 223
6.6 函数体结构 225
6.6.1 惰性气体——function语句 225
6.6.2 函数输出接口——return语句 227
6.7 临时作用域结构——with语句 228
第3篇 初战告捷 233
第7章 盒子里的魔术——透视JavaScript函数 233
7.1 认识函数 233
7.1.1 函数是一段代码块 234
7.1.2 函数是一类数据 234
7.1.3 函数是一种对象 234
7.2 定义JavaScript函数 235
7.2.1 克隆结构——构造函数 235
7.2.2 复杂结构的常量——函数直接量 237
7.2.3 定义嵌套函数 238
7.3 函数定义方法比较 239
7.3.1 函数作用域的比较 239
7.3.2 解析机制的比较 240
7.3.3 兼容性和灵活性比较 241
7.4 探析函数基本用法 242
7.4.1 函数返回值 242
7.4.2 调用函数 243
7.4.3 函数的生命周期 244
7.4.4 函数的作用域 245
7.5 深入函数的参数 246
7.5.1 认识函数的形参和实参 247
7.5.2 参数管理器——Arguments对象 248
7.5.3 回调函数——callee属性揭秘 249
7.5.4 Arguments对象在实践中灵活应用 250
7.6 使用函数对象 251
7.6.1 获取函数形参个数 251
7.6.2 灵敏的指针——有趣的this关键字 252
7.6.3 双刃剑——正确使用this关键字 253
7.6.4 自定义函数属性和方法 255
7.6.5 储钱罐——巧用函数的属性实现蓄能 256
7.6.6 谁的属性和方法—this与函数属性和方法的混合使用 257
7.6.7 动态调用函数——诡异的call()和apply()方法 258
7.6.8 更改指针——call()和apply()方法高级应用 260
7.7 数据寄存器——闭包函数 262
7.7.1 认识闭包 262
7.7.2 分析闭包结构的基本特性 263
1.自闭特性 263
2.包裹特性 263
7.7.3 闭包的基本应用 264
第8章 大象也有形——把握JavaScript对象 267
8.1 初识对象 267
8.1.1 什么是对象 268
8.1.2 对象是如何出生的 268
8.2 对象类型 269
8.2.1 本地对象 269
8.2.2 内置对象 270
8.2.3 宿主对象 270
8.3 对象基本操作 270
8.3.1 创建对象 271
8.3.2 引用对象 271
8.3.3 销毁对象 272
8.4 对象的属性和方法 272
8.4.1 定义对象的属性 273
8.4.2 访问对象的属性 273
8.4.3 设置和删除对象属性 274
8.4.4 对象的方法 275
8.5 对象的作用域 276
8.5.1 公共作用域 276
8.5.2 私有作用域 277
8.5.3 静态作用域 277
8.5.4 变形怪杰——作用域中的this 278
8.6 构造对象、实例对象和原型对象 279
8.6.1 构造对象 279
1.构造对象的属性 280
2.构造对象的方法 280
8.6.2 实例对象 281
1.实例对象的属性 281
2.实例对象的方法 282
8.6.3 原型对象 282
1.认识原型对象 282
2.原型属性与实例属性之间的关系 284
3.通过原型方法扩展内置对象功能 285
8.7 构造器 285
8.7.1 引用构造器——constructor属性 285
8.7.2 构造器的原型继承 286
8.7.3 根据构造器判定对象类型 287
8.8 对象基本方法和应用 287
8.8.1 对象的字符串标志——toString()方法 288
8.8.2 对象的值——valueOf()方法 289
8.8.3 检测私有属性——hasOwnProperty()方法 290
8.8.4 检测枚举属性——propertyIsEnumerable()方法 291
8.8.5 检测原型对象——isPrototypeOf()方法 293
8.9 探析JavaScript核心对象 294
8.9.1 大象无形——Global对象 294
8.9.2 数学专家——Math对象 295
8.9.3 时间管理——Date对象 298
1.获取本地系统的当前时间 298
2.通过多选参数来创建指定的时间对象 298
3.通过一个时间格式的字符串来创建指定的时间对象 298
4.通过传递一个毫秒数来创建指定的时间对象 298
第9章 有序世界的信使——操作数组 301
9.1 透视数据集合 301
9.1.1 数据集合的类型 301
9.1.2 特殊数集——哈希表 302
9.2 定义数组 303
9.3 数组基本操作 304
9.3.1 存取数组元素 304
9.3.2 能够自由伸缩的数组 305
9.3.3 数组的大小 306
9.3.4 对象与数组 306
9.3.5 暗度陈仓——定义多维数组 308
9.4 数组方法及其应用 309
9.4.1 检索数组元素 309
9.4.2 添加和删除元素 309
1.push()和pop()方法 310
2.unshift()和shift()方法 310
3.模拟队列数据结构的操作 311
4.粘连数组的concat()方法 311
9.4.3 子数组操作 312
1.删除和插入元素集合——splice()方法 312
2.截取子数组——slice()方法 313
9.4.4 数组排序 314
1.颠倒顺序——reverse()方法 314
2.数组排序——sort()方法 314
9.4.5 奇思妙想——更有趣的数组排序 315
1.根据奇偶性质排列数组 316
2.不区分大小写排序字符串 316
3.把浮点数和整数分开排列 317
9.4.6 数组与字符串相互转换 317
1.字符串通用转换——toString()方法 317
2.本地字符串转换——toLocalString()方法 318
3.更灵活的字符串转换——join()方法 318
4.把字符串转换为数组——split()方法 318
9.5 灵活使用数组及其方法扩展 319
9.5.1 神奇的数组下标 319
1.文本下标 319
2.二维数组下标 320
3.对象下标 321
9.5.2 扩展数组的基本方法 321
9.5.3 为数组扩展通用迭代器 322
9.5.4 利用数组迭代器扩展数组方法 324
1.动态改变数组中每个元素的值 324
2.过滤数组元素 325
第10章 变相怪杰——驾驭字符串 327
10.1 伤心字符串:使用值还是使用引用 327
10.1.1 思考是发现问题的钥匙 327
10.1.2 直击字符串操作的真相 328
10.1.3 字符串是如何进行比较的 330
10.2 创建字符串 330
10.2.1 定义字符串直接量 330
10.2.2 构造字符串 331
10.2.3 使用字符编码创建字符串 332
10.3 使用字符串 333
10.3.1 获取字符串的字符和字节长度 333
10.3.2 连接字符串 335
10.3.3 查找字符串 335
1.获取指定位置的字符——charAt()和charCodeAt()方法 335
2.查找子字符串的位置——indexOf()和lastIndexOf()方法 336
3.匹配字符串——search()和match()方法 337
10.3.4 截取子字符串 339
1.根据长度截取子字符串——substr()方法 339
2.根据起止下标截取子字符串——sfice()和substring()方法 339
10.3.5 编辑字符串 340
1.替换子字符串——replace()方法 340
2.字符串大小写转换 342
10.3.6 暗藏玄机——replace()方法深层技术探讨 342
10.3.7 比较字符串 344
10.3.8 把字符串转换为数组 345
10.3.9 字符串的类型和值 346
10.3.10 格式化字符串方法 347
10.4 String对象扩展及用法 348
10.4.1 模拟VBScript字符串处理函数 348
1.截取字符串左侧指定数目的字符——left()方法 348
2.截取字符串右侧指定数目的字符——right()方法 349
3.清除字符串首尾的空格——trim()方法 349
4.清除字符串左侧空格——ITrim()方法 350
5.清除字符串右侧空格——rTrim()方法 350
10.4.2 检测特殊字符 351
10.4.3 提高字符串连接操作效率 352
10.5 字符串加密和解密 352
10.5.1 JavaScript预定义编码和解码方法 352
1.字符串常规编码和解码——eseape()和unescape()方法 353
2.URI字符串编码和解码——encodeURI()和decodeURI()方法 353
3.URI组件编码和解码——encodeURIComponent()和decodeURIComponent()方法 354
10.5.2 Unicode编码 355
10.5.3 Unicode解码 355
10.5.4 自定义加密和解密方法 356
第11章 灵异的牧羊犬——使用正则表达式操纵字符串 359
11.1 第六感觉——认识正则表达式 359
11.1.1 什么是正则表达式 359
11.1.2 正则表达式的发展历史 360
11.2 定义正则表达式 361
11.2.1 使用RegExp对象构造正则表达式 361
11.2.2 定义正则表达式直接量 363
11.3 正则表达式基本语法——字符类 364
11.3.1 认识普通字符和元字符 364
11.3.2 字符直接量 364
1.用ASCII码表示 364
2.用Unicode编码表示 365
11.3.3 定义简单字符类 366
11.3.4 定义反义字符类 366
11.3.5 定义字符范围类 367
11.3.6 预定义字符类 368
11.4 正则表达式基本语法——重复类数量词 369
11.4.1 简单重复性匹配 369
11.4.2 贪婪匹配 371
1.?、{n}和{n,m}重复类 371
2.*、+和{n,}重复类 372
11.4.3 惰性匹配 372
11.4.4 支配匹配 373
11.5 高级匹配模式 374
11.5.1 分组 374
11.5.2 分组的应用价值 375
11.5.3 引用 376
11.5.4 非引用型分组 377
11.5.5 选择 378
11.5.6 声明 380
11.5.7 边界 380
11.5.8 锚记 382
11.5.9 标志 382
11.6 操作RegExp对象 383
11.6.1 实例属性 383
11.6.2 静态属性 384
11.6.3 正则表达式的方法 386
1.灵活的匹配操盘手——exec()方法 386
2.匹配验证——test()方法 387
11.6.4 比较各种模式匹配的方法 388
第4篇 直捣黄龙 393
第12章 BOM——探访客户的秘密 393
12.1 认识浏览器对象模型(BOM) 393
12.2 客户端全局对象——Window 395
12.2.1 全局作用域 396
12.2.2 Window对象的生命周期 396
12.2.3 人机交互——学习JavaScript第一步 397
12.2.4 控制弹出窗口 398
12.2.5 框架之间的通信 399
1.窗口不等于框架 400
2.框架之间相互访问方式 400
3.框架之间JavaScript交互 400
12.3 检测客户浏览器信息——Navigator对象 401
12.3.1 了解常用浏览器检测方法 402
1.特征检测法 402
2.字符串检测法 402
12.3.2 检测浏览器类型和版本 403
12.3.3 检测客户端操作系统 404
12.4 客户端导航——Location和History对象 405
12.4.1 全球定位仪——Location对象 405
12.4.2 浏览简史——History对象 407
1.使用JavaScript访问历史记录 407
2.使用JavaScript访问帧的历史记录 408
12.5 窗口大小控制——Screen和Window对象 408
12.5.1 屏幕大小——Screen对象 408
12.5.2 窗口大小——Window对象 409
12.6 0级文档对象模型——Document对象 410
12.6.1 认识文档对象——Document 410
12.6.2 0级文档对象模型及其读写规则 411
12.6.3 动态生成文档 412
第13章 DOM——控制文档结构的模型 415
13.1 认识DOM 415
13.1.1 DOM发展概述 415
1.DOM 0级 416
2.DOM 1级 416
3.DOM 2级 416
4.DOM 3级 417
13.1.2 检测浏览器对DOM规范支持程度 417
13.1.3 DOM核心 419
13.1.4 DOM节点 420
13.2 操作DOM文档 422
13.2.1 HTML DOM加载过程及其处理 422
13.2.2 DOM文档支持的遍历指针 424
1.childNodes 425
2.firstChild和lastChild 425
3.parentNode 425
4.nextSibling和previousSibling 426
5.documentElement 426
13.2.3 文档遍历中的空格Bug及其清除 426
13.2.4 实现一个简单的文档遍历 427
13.2.5 扩展遍历指针函数 428
1.扩展firstChild和lastChild指针函数 429
2.扩展parentNode指针函数 429
3.扩展nextSibling和previousSibling指针函数 429
13.2.6 通过原型继承扩展DOM元素的方法 430
13.2.7 增加文档内容 433
13.3 操作DOM节点 435
13.3.1 获取节点 435
1.使用getElementByld()方法 435
2.使用getElementByTagName()方法 436
13.3.2 创建节点 437
1.创建节点的基本用法 437
2.创建DOM元素的通用方法 438
13.3.3 复制节点 439
13.3.4 插入节点 440
1.使用appendChild()方法 440
2.使用insertBefore()方法 442
13.3.5 删除节点 442
1.删除节点的基本用法 443
2.封装删除节点的方法 443
3.封装删除所有子节点的方法 444
13.3.6 替换节点 444
13.4 操作元素的属性 445
13.4.1 获取节点属性 446
13.4.2 设置节点属性 447
13.4.3 删除节点属性 448
13.4.4 存取JavaScript属性 449
13.5 操作元素的内容 449
13.5.1 获取元素包含的文本 449
13.5.2 获取元素包含的HTML信息 450
第14章 Event——JavaScript事件驱动模型 453
14.1 认识JavaScript事件 453
14.1.1 你未必理解的事件概念 453
14.1.2 事件驱动模型 454
14.1.3 事件处理和监听函数 455
14.1.4 多线程与异步回调 456
14.2 事件流及其传播 456
14.2.1 事件传播过程 457
14.2.2 冒泡型事件流 457
14.2.3 捕获型事件流 459
14.2.4 DOM标准事件流 460
14.3 DOM 0级事件模型 460
14.3.1 原始事件的处理方式 460
14.3.2 斫石取火——定义事件 461
14.3.3 直接调用——事件处理函数之趣 463
14.3.4 冷落的返回值——事件处理函数之痕 464
14.3.5 隐形的参数——事件处理函数之谜 465
14.3.6 再说this——事件处理函数之惑 466
14.3.7 身在曹营心在汉——事件处理函数之域 467
14.4 DOM 2级事件模型 469
14.4.1 认识DOM 2级事件模型 469
1.事件模块与接口 470
2.DOM 2级事件模型的工作机制 470
3.Event接口 470
4.UIEvent接口 471
5.MouseEvent接口 471
6.MutationEvent接口 471
14.4.2 绑定和销毁事件 471
1.绑定事件 472
2.销毁事件 473
14.4.3 为对象注册多个事件处理函数 473
14.4.4 兼容0级事件模型的处理方法 474
14.4.5 兼容IE的事件处理方法 475
14.5 IE事件模型 475
14.5.1 认识IE事件模型 475
14.5.2 绑定和销毁事件 476
1.绑定事件 476
2.销毁事件 476
3.事件处理函数中的this 477
4.绑定多个事件 477
14.5.3 设计可兼容的Event对象 478
14.6 事件类型 478
14.6.1 事件类型概述 479
14.6.2 鼠标事件 481
1.鼠标点击事件类型 482
2.鼠标移动事件类型 482
3.鼠标经过事件类型 484
4.鼠标来源 485
5.鼠标定位 486
6.封装并应用鼠标定位设计方案 487
7.在元素内部定位鼠标指针 488
8.鼠标按键 489
9.鼠标事件响应顺序 489
14.6.3 键盘事件 490
1.认识键盘事件的属性 490
2.ctrlKey和shiftKey属性 491
3.keyCode和charCode属性 491
4.键盘事件响应顺序 493
14.6.4 页面事件 493
1.页面初始化——load事件类型 494
2.load事件类型的特殊引用 495
3.在页面初始化之前执行脚本——DOMContentLoaded事件类型 496
4.页面卸载——unload事件类型 498
5.更人性化的页面卸载——beforeunload事件类型 499
6.窗口重置——resize事件类型 499
7.文档移动——scroll事件类型 500
8.错误捕获——error事件类型 500
14.6.5 UI事件 501
1.获取焦点——focus事件类型 501
2.失去焦点——blur事件类型 501
14.6.6 表单事件 501
1.选择文本——select事件类型 502
2.监测表单元素值变化——change事件类型 502
3.提交表单——submit事件类型 503
4.重置表单——reset事件类型 504
第15章 CSS——设计HTML动态效果 507
15.1 DOM 2级样式控制模型 507
15.1.1 CSSStyleSheet接口 508
15.1.2 CSSStyleRule接口 508
15.1.3 CSSStyleDeclaration接口 509
15.2 DOM 0级样式控制模型 510
15.2.1 style对象 510
15.2.2 使用style对象读写行内样式 516
1.读取样式的属性值和属性名 516
2.设置样式的属性值 516
3.移除样式声明 517
4.检测声明中是否附加!important关键字 517
5.内行样式设置实战 517
15.2.3 styleSheets集合 519
15.2.4 访问CSS样式表 521
15.2.5 读写CSS规则 522
15.2.6 访问最终样式 525
1.IE的最终样式 525
2.DOM的最终样式 526
15.2.7 修改CSS样式的方法比较 526
1.关于修改class样式 527
2.关于修改id样式 527
15.3 尺寸 528
15.3.1 从CSS样式表中抽取元素尺寸 528
15.3.2 把抽取的尺寸转化为实际值 529
15.3.3 使用offsetWidth和offsetHeight获取元素的尺寸 531
15.3.4 超越offsetWidth和offsetHeight的缺陷 532
15.3.5 更复杂的元素尺寸 534
15.3.6 可视区域外滚动尺寸 537
15.3.7 浏览器窗口的尺寸 538
15.4 位置 539
15.4.1 获取元素在浏览器窗口中的位置 540
15.4.2 获取元素相对父元素的位置 543
15.4.3 获取元素相对包含块的位置 543
15.4.4 设置元素的偏移位置 544
15.4.5 设置元素的相对位置 544
15.4.6 获取鼠标指针的页面位置 545
15.4.7 获取鼠标指针在元素内的位置 546
15.4.8 获取页面滚动条的位置 548
15.4.9 设置页面滚动条的位置 549
15.5 显示和隐藏 549
15.5.1 元素的可见性 550
15.5.2 显示和隐藏功能封装 550
15.5.3 设置和获取元素的透明度 551
15.6 动画 552
15.6.1 定时器 553
1.setTimeout()方法 553
2.setInterval()方法 555
3.正确选用setTimeout()和setInterval()方法 555
15.6.2 滑动 556
15.6.3 渐隐渐显 557
第5篇 飞鸿传书 561
第16章 Cookie——用户信息存储、交互与安全 561
16.1 Cookie概述 561
16.1.1 Cookie回眸 561
16.1.2 Cookie信息的结构 562
16.2 存取Cookie信息 563
16.2.1 写入Cookie信息 563
16.2.2 设置Cookie有效期 563
16.2.3 设置Cookie的域和路径 564
16.2.4 设置Cookie安全传输 565
16.2.5 完善写入的Cookie信息 565
16.2.6 读取Cookie信息 566
16.2.7 修改和删除Cookie信息 567
16.2.8 Cookie的局限性及其突破 567
16.2.9 探测浏览器是否启用Cookie 569
16.3 Cookie封装与应用 569
16.3.1 Cookie封装 569
16.3.2 Cookie应用:打字测试游戏 571
第17章 XML和JSON——JavaScriDt数据处理模式 575
17.1 更通用的数据——XML 575
17.1.1 认识XML 575
17.1.2 XML文档结构概述 576
17.1.3 声明 577
17.1.4 处理指令 577
17.1.5 注释 578
17.1.6 标记和元素 578
17.1.7 XML属性 579
17.2 XML DOM文档对象模型 580
17.2.1 认识XML DOM文档对象模型 580
17.2.2 读取XML数据 582
17.3 IE对XML的支持 584
17.3.1 创建XML DOM对象 584
17.3.2 加载XML数据 585
1.设置加载模式 585
2.跟踪异步加载状态 585
17.3.3 数据加载错误处理 586
17.4 Mozilla对XML的支持 587
17.4.1 创建XML DOM对象 587
17.4.2 加载XML数据 588
17.4.3 读取XML数据 589
1.自定义方法模拟text属性的功能 589
2.自定义方法模拟xml属性的功能 589
17.5 XML数据导航器——XPath 590
17.5.1 XPath基本语法 590
17.5.2 IE对XPath的支持 592
17.5.3 Mozilla对XPath的支持 593
17.6 更敏捷的数据——JSON 595
17.6.1 JSON简介 595
17.6.2 深入JSON数据内核 598
1.数据的无序结构——对象 598
2.数据的有序结构——数组 598
3.数据的内容——值 599
第18章 Ajax——JavaScript通信接口与异步交互引擎 601
18.1 网络那点事儿——浓缩的HTTP 601
18.1.1 HTTP请求 602
18.1.2 HTTP响应 604
18.2 暗度陈仓——从隐藏框架说起 605
18.2.1 隐藏框架 605
18.2.2 异步交互与回调处理 608
18.2.3 使用iframe处理异步交互 611
18.3 巧连环——JSONP与跨域异步交互 613
18.3.1 小聪明大智慧—<script>标签背后的故事 613
18.3.2 动态控制script元素实现可控异步通信 615
18.3.3 script异步通信的参数传递 616
18.3.4 script异步通信的响应数据类型 620
18.3.5 JSONP异步通信协议 623
18.3.6 JSONP的安全问题 625
18.4 Ajax——更高效的异步通信接口 626
18.4.1 认识XMLHttpRequest对象 627
18.4.2 定义XMLHttpRequest对象 628
18.4.3 建立XMLHttpRequest请求连接 629
18.5 Request——发送请求 630
18.5.1 发送GET请求 630
18.5.2 发送POST请求 631
18.5.3 把数据转换为串行字符串 633
1.传输名/值对信息 633
2.传输有序数据列表 633
18.6 State——异步状态监测 634
18.6.1 跟踪Ajax异步通信状态 634
18.6.2 中止异步请求 636
18.7 Response——获取响应信息 636
18.7.1 XML 637
18.7.2 HTML 638
18.7.3 Code 639
18.7.4 JSON 640
18.7.5 Text 641
18.7.6 获取和设置头部消息 641
18.8 Ajax通信功能封装和应用 642
18.8.1 封装异步请求函数 642
18.8.2 使用Ajax改进Tab显示 643
第6篇 壮士凯旋 651
第19章 可视化思维——深入JavaScript面向对象编程 651
19.1 书非借不能读也——说类 651
19.1.1 类与对象 651
19.1.2 类成员:属性、方法和事件 652
19.1.3 类的基本特性:继承、封装和多态 652
19.2 定义JavaScript类 653
19.2.1 小老板为什么能年挣百万——工厂模式 653
19.2.2 拿来主义——构造函数模式 655
19.2.3 遗传栽培法——原型模式 657
19.2.4 杂交栽培法——构造函数原型模式 658
19.2.5 滴灌法——动态原型模式 660
19.3 契约书——JavaScript接口 661
19.3.1 新版黔驴技穷——大话接口 661
19.3.2 签订契约书——接口的本质 663
19.3.3 大道理简单化——JavaScript接口实现方法一 665
19.3.4 孔明点灯——JavaScript接口实现方法二 667
19.3.5 鸡肋还是鸡翅——JavaScript接口选用之惑 670
19.4 JavaScript继承机制——原型(prototype) 671
19.4.1 认识prototype 671
19.4.2 剪不断理还乱——辨析泛类、类型、原型和对象实例 672
19.4.3 形似神异——构造类的原型和本地特性 674
19.4.4 四大皆空——关于类的唯空论 676
19.4.5 原型属性的基本操作和应用技巧 678
1.利用原型为对象设置默认值 679
2.利用原型间接实现本地数据备份 680
3.利用原型设置只读属性 680
4.利用原型进行批量复制 682
19.4.6 定义静态原型方法 683
19.4.7 prototype原型域及原型链 683
19.4.8 prototype的副作用 685
19.5 JavaScript基因图谱——继承 686
19.5.1 认识JavaScript的继承机制 686
19.5.2 原型继承 688
19.5.3 类继承的源起 689
19.5.4 类继承的设计模式 690
19.5.5 深入理解类继承中call()和apply()角色 693
19.5.6 封装类继承机制 695
19.5.7 实例继承 696
19.5.8 复制继承 698
19.5.9 克隆继承 699
19.5.10 混合继承 699
19.5.11 多重继承 701
19.5.12 掺元类 702
19.6 类的封装 704
19.6.1 类的被动封装 705
19.6.2 类的主动封装 706
19.6.3 定义类的静态方法和属性 708
19.7 类的多态 710
19.7.1 方法的重载和覆盖 711
1.重载 711
2.覆盖 711
19.7.2 类的多态 712
19.8 善始善终——类的构造和析构 713
19.8.1 构造 714
19.8.2 动态构造 715
19.8.3 析构 716
19.9 类的抽象化——超类、子类和元类 717
19.9.1 超类和子类 717
19.9.2 元类 718
第20章 卜算子——深入JavaScript函数式编程 721
20.1 JavaScript函数式编程概述 721
20.1.1 函数是第一型 721
20.1.2 函数是运算元 722
20.1.3 函数是数据闭包 723
20.2 表达式运算 724
20.2.1 实现连续运算的常用方法 724
20.2.2 尝试把所有命令式语句转换为连续运算 727
20.2.3 表达式中的函数 728
20.2.4 函数的惰性与非惰性求值 730
20.2.5 函数调用栈 732
20.3 递归运算 734
20.3.1 认识递归 735
20.3.2 猜一猜,算一算——递归算法演示 736
20.3.3 递归算法 738
20.3.4 递归模型 738
1.问题的定义是递归的 738
2.问题所涉及的数据结构是递归的 739
3.问题的解法满足递归的性质 740
20.3.5 Hanoi(汉诺)塔算法 740
20.3.6 尾递归算法 742
20.3.7 Fibonacci(斐波那契)数列 744
20.3.8 递归算法的优化 746
20.4 高处不胜寒——破解函数域之惑 747
20.4.1 我是谁——JavaScript执行环境与函数解析机制 747
20.4.2 我从哪来——词法作用域与执行作用域 749
20.4.3 寻找迷失的远方——作用域链 751
20.4.4 我又在哪里——调用对象 753
20.5 天宫之旅——函数闭包 754
20.5.1 从圈外看闭包 754
20.5.2 从圈内看函数闭包 755
20.5.3 解剖闭包结构——认识闭包标识符系统 757
20.5.4 覆盖还是层叠——关于闭包函数的作用域问题 759
20.5.5 生存还是毁灭——关于闭包函数的生存周期问题 760
20.5.6 辨析函数与闭包 762
20.5.7 奇怪的不等式——函数、调用、引用和实例 763
20.5.8 梦里花落知多少——闭包函数与函数实例 765
20.5.9 剪不断理还乱——闭包函数与调用对象 769
20.5.10 保护闭包数据的独立性 771
20.5.11 始祖鸟——构造函数闭包 773
20.5.12 想你所想——函数式编程中闭包的应用价值 774
20.5.13 一起联想——函数式编程中闭包的桥梁作用 776
20.5.14 预防中毒——闭包的副作用 779
20.6 我是谁?——彻底研究this 782
20.6.1 who is this——确认this的身份 783
1.this代表当前对象 783
2.this代表当前作用域对象 784
20.6.2 what is this——this的本质 786
1.闭包的破坏性 787
2.call()和apply()方法的破坏性 788
3.异步调用的破坏性 788
20.6.3 where is this——在哪儿使用this 788
1.函数的引用和调用 788
2.call()和apply() 789
3.原型继承 790
4.异步调用之事件处理函数 791
5.异步调用之定时器 792
20.6.4 how to do this——this应对策略 792
1.预防this多变的基本原则 792
2.把this作为参数值 793
3.设计静态的this指针 793
4.设计静态的this扩展方法 794
第21章 流水不腐——深入JavaScript动态化编程 797
21.1 使用eval()方法动态执行语句 797
21.1.1 动态值、表达式和语句 797
21.1.2 对象和函数直接量的歧义问题 799
21.1.3 eval全局执行域及其兼容方法 800
21.1.4 eval当前执行域 802
21.2 动态调用函数 802
21.2.1 函数调用方法及执行效率比较 802
1.使用小括号运算符调用函数 803
2.使用new运算符调用函数 803
3.使用call()和apply()方法调用函数 804
4.使用定时器调用函数 804
5.使用事件处理函数调用函数 805
21.2.2 函数的调用对象 805
21.2.3 动态调用中的this指针 808
21.2.4 在动态调用中实现继承 810
21.2.5 动态调用中易迷失的this指针 810
21.2.6 嵌套函数调用中的副作用 812
21.3 动态重写 814
21.3.1 重写原型对象 814
21.3.2 重写构造器 816
21.3.3 重写方法 818