第一部分 浏览器编程基础
第1章 配置开发环境 2
1.1 安装Google Chrome 2
1.2 安装并配置Atom 3
1.3 文档和参考资料 6
1.4 命令行速成 8
1.4.1 查看当前工作目录 9
1.4.2 新建目录 10
1.4.3 切换目录 10
1.4.4 列出目录中的文件 11
1.4.5 获取管理员权限 12
1.4.6 退出程序 13
1.5 安装Node.js和browser-sync 14
1.6 延展阅读:Atom 的替代工具 15
第2章 开始第一个项目 17
2.1 搭建Ottergram 18
2.1.1 开始写HTML 19
2.1.2 链接到样式表 22
2.1.3 添加内容 22
2.1.4 添加图片 23
2.2 浏览网页 25
2.3 Chrome开发者工具 27
2.4 延展阅读:CSS 版本 29
2.5 延展阅读:favicon.ico 29
2.6 中级挑战:添加favicon.ico 30
第3章 样式 31
3.1 创建基本样式 32
3.2 为HTML文件添加样式 33
3.3 样式的构成 34
3.4 第一条样式规则 35
3.5 样式继承 38
3.6 图片自适应 45
3.7 颜色 47
3.8 调整空白 49
3.9 添加字体 53
3.10 初级挑战:更改颜色 56
3.11 延展阅读:优先级!当选择器发生冲突了…… 56
第4章 flexbox响应式布局 58
4.1 界面拓展 59
4.1.1 添加大图 59
4.1.2 缩略图水平布局 61
4.2 flexbox 63
4.2.1 创建flex容器 64
4.2.2 改变flex-direction 65
4.2.3 flex项目中的元素分组 66
4.2.4 flex缩写属性 68
4.2.5 flex项目的排序与对齐方式 69
4.2.6 居中显示大图 73
4.3 绝对定位与相对定位 75
第5章 使用媒体查询完成自适应布局 82
5.1 重置视口 83
5.2 添加媒体查询 85
5.3 初级挑战:屏幕方向 89
5.4 延展阅读:flexbox布局通用解决方案与bug 89
5.5 高级挑战:圣杯布局 89
第6章 JavaScript事件处理 90
6.1 准备锚标签 91
6.2 第一个脚本 94
6.3 Ottergram中的JavaScript 描述 95
6.4 声明字符串变量 96
6.5 操作控制台 97
6.6 访问DOM元素 99
6.7 编写setDetails函数 104
6.8 从函数返回值 108
6.9 添加事件监听器 110
6.10 访问所有缩略图 115
6.11 迭代缩略图数组 117
6.12 中级挑战:劫持链接 118
6.13 高级挑战:随机的水獭 119
6.14 延展阅读:严格模式 119
6.15 延展阅读:闭包 119
6.16 延展阅读:NodeList对象和HTMLCollection 对象 120
6.17 延展阅读:JavaScript类型 122
第7章 使用CSS营造视觉效果 123
7.1 隐藏及显示大图 123
7.1.1 创建隐藏大图的样式 125
7.1.2 用JavaScript 隐藏大图 127
7.1.3 监听键盘事件 128
7.1.4 重新显示大图 131
7.2 使用CSS过渡改变状态 132
7.2.1 变形 133
7.2.2 添加CSS过渡效果 135
7.2.3 使用定时函数 138
7.2.4 基于类的过渡效果 139
7.2.5 通过JavaScript触发过渡效果 140
7.3 自定义定时函数 141
7.4 延展阅读:强制类型转换的规则 143
第二部分 模块、对象及表单
第8章 模块、对象和方法 146
8.1 模块 146
8.1.1 模块模式 147
8.1.2 通过IIFE修改对象 149
8.2 搭建我们的CoffeeRun吧 151
8.3 创建数据存储模块 152
8.4 在命名空间上添加一个模块 153
8.5 构造函数 154
8.5.1 构造函数的原型 155
8.5.2 为构造函数添加方法 157
8.6 创建Truck模块 159
8.6.1 添加订单 160
8.6.2 删除订单 161
8.7 调试 163
8.7.1 使用开发者工具定位bug 165
8.7.2 使用bind 设置this 169
8.8 在页面加载时初始化CoffeeRun 170
8.9 初级挑战:使用非星迷熟悉的餐车ID 173
8.10 延展阅读:模块私有数据 173
8.11 中级挑战:私有化数据 174
8.12 延展阅读:在forEach的回调函数中设置this 174
第9章 Bootstrap简介 175
9.1 添加Bootstrap 175
9.2 创建订单表单 177
9.2.1 添加文本输入字段 178
9.2.2 提供单选按钮 182
9.2.3 添加下拉菜单 183
9.2.4 添加范围滑块 185
9.2.5 添加提交按钮和重置按钮 185
第10章 使用JavaScript 处理表单 187
10.1 创建FormHandler 模块 188
10.1.1 jQuery简介 189
10.1.2 导入jQuery 189
10.1.3 使用selector参数配置FormHandler 实例 190
10.2 添加提交处理程序 192
10.2.1 提取数据 193
10.2.2 接受并调用回调函数 195
10.3 使用FormHandler 196
10.4 UI 优化 198
10.5 初级挑战:添加超级尺寸 199
10.6 中级挑战:当滑块滑动时显示其数值 199
10.7 高级挑战:添加选择 200
第11章 从数据到DOM 201
11.1 建立清单 202
11.2 创建CheckList模块 203
11.3 创建行构造函数 204
11.4 在提交时创建清单行 209
11.5 通过单击行完成订单 212
11.5.1 创建CheckList.prototype.removeRow方法 213
11.5.2 删除被覆盖的条目 213
11.5.3 编写addClickHandler方法 214
11.5.4 调用addClickHandler 216
11.6 初级挑战:在描述中加入浓度信息 217
11.7 中级挑战:不同口味,不同颜色 217
11.8 高级挑战:允许编辑订单 217
第12章 表单校验 218
12.1 required属性 218
12.2 使用正则表达式校验表单 220
12.3 约束校验API 220
12.3.1 监听input事件 222
12.3.2 将input事件和有效性校验绑定 223
12.3.3 触发有效性检查 224
12.4 美化有效元素和无效元素 225
12.5 中级挑战:为脱咖啡因咖啡进行自定义校验 227
12.6 延展阅读:Webshim 库 227
第13章 Ajax 229
13.1 XMLHttpRequest对象 230
13.2 RESTful Web服务 230
13.3 RemoteDataStore模块 231
13.4 向服务器发送数据 232
13.4.1 使用jQuery的$.post 方法 233
13.4.2 添加回调函数 233
13.4.3 检查Ajax的请求和响应 234
13.5 从服务器检索数据 237
13.5.1 查看响应数据 237
13.5.2 添加回调函数 238
13.6 从服务器删除数据 240
13.7 用RemoteDataStore替换DataStore 241
13.8 中级挑战:校验远端服务器 243
13.9 延展阅读:Postman 243
第14章 Deferred和Promise 244
14.1 Promise和Deferred 245
14.2 返回Deferred 246
14.3 通过then注册回调函数 247
14.4 使用then处理失败的情况 248
14.5 在仅支持回调函数的API上使用Deferred 250
14.6 为DataStore配置Promise 254
14.6.1 创建并返回Promise 255
14.6.2 resolve一个Promise 256
14.6.3 将其他DataStore方法Promise 化 256
14.7 中级挑战:回退到Datastore 259
第三部分 实时数据传输
第15章 Node.js入门 262
15.1 Node和npm 263
15.1.1 npm init 264
15.1.2 npm脚本 265
15.2 Hello, World 265
15.3 添加一个npm脚本 267
15.4 用文件提供服务 268
15.4.1 用fs 模块读取文件 269
15.4.2 处理请求URL 269
15.4.3 使用path模块 271
15.4.4 创建自定义模块 272
15.4.5 使用自定义模块 272
15.5 错误处理 273
15.6 延展阅读:npm模块注册 274
15.7 初级挑战:创建自定义错误页面 275
15.8 延展阅读:MIME类型 275
15.9 中级挑战:动态提供MIME类型 276
15.10 高级挑战:将错误处理放到单独的模块中 276
第16章 使用WebSocket进行实时通信 277
16.1 配置WebSocket 278
16.2 测试WebSocket服务器 280
16.3 创建聊天服务器的功能 281
16.4 第一次聊天! 283
16.5 延展阅读:WebSocket库socket.io 283
16.6 延展阅读:WebSocket服务 284
16.7 初级挑战:我重复了我的消息吗? 284
16.8 中级挑战:Speakeasy 284
16.9 高级挑战:聊天机器人 284
第17章 借助Babel使用ES6 285
17.1 编译JavaScript的工具 286
17.2 Chattrbox客户端应用程序 288
17.3 迈出Babel的第一步 289
17.4 使用Browserify 打包模块 291
17.5 新增ChatMessage 类 294
17.6 创建ws-client 模块 297
17.6.1 处理连接 298
17.6.2 处理事件并发送消息 299
17.6.3 发出和回应一条消息 301
17.7 延展阅读:将其他语言编译成JavaScript 302
17.8 初级挑战:默认导入名称 303
17.9 中级挑战:提醒连接关闭 303
17.10 延展阅读:变量提升 303
17.11 延展阅读:箭头函数 305
第18章 继续ES6 探索之旅 306
18.1 将jQuery 安装成一个Node 模块 307
18.2 创建ChatForm 类 307
18.3 创建ChatList 类 310
18.8 初级挑战:给消息添加特效 320
18.9 中级挑战:缓存消息 320
18.10 高级挑战:独立的聊天室 321
第四部分 应用架构
第19章 初识MVC和Ember 324
19.1 Tracker 325
19.2 Ember:一款MVC 框架 326
19.2.1 安装Ember 327
19.2.2 创建Ember应用 328
19.2.3 启动服务器 329
19.3 安装外部库和插件 330
19.4 修改配置 332
19.5 延展阅读:npm和Bower 的安装命令 335
19.6 初级挑战:限制引入 336
19.7 中级挑战:添加Font Awesome 库 336
19.8 高级挑战:自定义NavBar 336
第20章 路由选择、路由表、模型 337
20.1 Ember生成器 338
20.2 嵌套路由 342
20.3 Ember Inspector 344
20.4 指派模型 344
20.5 beforeModel 347
20.6 延展阅读:setupController和afterModel 347
第21章 模型和数据绑定 349
21.1 定义模型 349
21.2 创建记录 351
21.3 get和set 353
21.4 计算属性 354
21.5 延展阅读:检索数据 357
21.6 延展阅读:保存或删除数据 358
21.7 初级挑战:修改计算属性 358
21.8 中级挑战:对新的目击记录进行标记 358
21.9 高级挑战:添加称呼 359
18.4 使用Gravatar 312
18.5 请求用户名 314
18.6 使用会话存储 316
18.7 格式化和更新消息时间戳 318
第22章 数据——适配器、序列化器和变换器 360
22.1 适配器 362
22.2 内容安全策略 365
22.3 序列化器 366
22.4 变换器 368
22.5 延展阅读:Ember CLI Mirage 368
22.6 中级挑战:内容安全 369
22.7 高级挑战:Mirage 369
第23章 视图与模板 370
23.1 Handlebars 371
23.2 模型 371
23.3 辅助方法 371
23.3.1 条件语句 372
23.3.2 {{#each}}循环 373
23.3.3 元素属性赋值 375
23.3.4 链接 377
23.4 自定义辅助方法 380
23.5 初级挑战:为链接添加鼠标悬浮的内容 382
23.6 中级挑战:修改日期格式 383
23.7 高级挑战:创建一个自定义缩略图辅助方法 383
第24章 控制器 384
24.1 新建目击记录 385
24.2 编辑目击记录 392
24.3 删除目击记录 395
24.4 路由动作 396
24.5 初级挑战:目击记录详情页 398
24.6 中级挑战:目击日期 398
24.7 高级挑战:添加和删除目击者 398
第25章 组件 399
25.1 迭代器组件 399
25.2 “拧干”组件的“水分” 403
25.3 数据向下,动作向上 404
25.4 类名绑定 405
25.5 数据向下 406
25.6 动作向上 409
25.7 初级挑战:自定义提示信息 411
25.8 中级挑战:将导航条转化为组件 411
25.9 高级挑战:提示框数组 412
第26章 后记 413
26.1 最后的挑战 413
26.2 插播一个广告 413
26.3 感谢你 414