《编写可维护的 JavaScript》读书笔记第7章:事件处理
1. 典型用法
在很多场景中,只用到了 event 所提供信息的一小部分。
// 不好的写法function handleClick(event) { var popup = document.getElementById("popup"); popup.style.left = event.clientX + "px"; popup.style.top = event.clientY + "px"; popup.className = "reveal";} addListener(element, "click", handleClick);
2. 规则 1:隔离应用逻辑
上面的代码的第一个问题是事件处理程序包含了应用逻辑(application logic)。应用逻辑是和应用相关的功能性代码,而不是和用户行为相关的。
将应用逻辑从所有事件处理程序中抽离出来的做法是一种最佳实践,其他地方可能会触发同一逻辑。
抽离出来的另一个好处是方便测试。
对上面代码进行重构,第一步是将处理弹出框逻辑的代码放入一个单独的函数中,这个函数很可能挂载于为该应用定义的一个全局对象上。因此就有了两个方法:
// 好的写法 - 拆分应用逻辑var MyApplication = { handleClick: function(event) { this.showPopup(event); }, showPopup: function(event) { var popup = document.getElementById("popup"); popup.style.left = event.clientX + "px"; popup.style.top = event.clientY + "px"; popup.className = "reveal"; }}; addListener(element, "click", function(event) { MyApplication.handleClick(event);});
3. 规则 2:不要分发事件对象
上段代码还存在一个问题,即 event 对象被无节制地分发。应用逻辑不应当依赖于 event 对象来正确完成功能。原因如下:
方法接口并没有表明哪些数据是必要的
如果想测试这个方法,必须重新创建一个 event 对象并作为参数传入
重写方法:
// 好的写法var MyApplication = { handleClick: function(event) { this.popup(event.clientX, event.clientY); }, showPopup: function(x, y) { var popup = document.getElementById("popup"); popup.style.left = x + "px"; popup.style.top = y + "px"; popup.className = "reveal"; }}; addListener(element, "click", function(event) { MyApplication.handleClick(event); // 可以这样用};
处理事件时,最好让事件程序成为接触到的 event 对象的唯一的函数。
// 好的写法var MyApplication = { handleClick: function(event) { // 假设事件支持 DOM Level 2 event.preventDefault(); event.stopPropagation(); // 传入应用逻辑 this.popup(event.clientX, event.clientY); }, showPopup: function(x, y) { var popup = document.getElementById("popup"); popup.style.left = x + "px"; popup.style.top = y + "px"; popup.className = "reveal"; }}; addListener(element, "click", function(event) { MyApplication.handleClick(event); // 可以这样做};
转载于:https://blog.51cto.com/qczhang/1343837
《编写可维护的 JavaScript》读书笔记第7章:事件处理相关推荐
- 【读书笔记】:《编写可维护的JavaScript》第02章 注释
编写可维护的JavaScript 第02章 注释 2.1 单行注释 2.2 多行注释 2.3 使用注释 2.4 文档注释 第02章 注释 JavaScript支持两种不同类型的注释,单行注释和多行注释 ...
- 《编写可维护的JavaScript》——1.7 直接量
本节书摘来自异步社区<编写可维护的JavaScript>一书中的第1章,第1.7节,作者: [美]Nicholas C. Zakas 译者: 李晶 , 郭凯 , 张散集 更多章节内容可以访 ...
- PMP读书笔记(第9章)
大家好,我是烤鸭: 今天做一个PMP的读书笔记. 第九章 项目资源管理 项目资源管理 项目资源管理的核心概念 项目资源管理的趋势和新兴实践 裁剪考虑因素 在敏捷或适应型环境中需要考虑的因素 9 ...
- PMP读书笔记(第1章)
大家好,我是烤鸭: 今天做一个PMP的读书笔记. 第一章 引论 1.1 概述指南和目的 1.1.1 项目管理标准 1.1.2 通用词汇 1.1.3 道德与专业行为规范 1.2 概述指南和目的 ...
- 《Spring实战》读书笔记-第4章 面向切面的Spring
<Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...
- Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧
Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...
- 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境 文章目录 黑帽python第二版(Black Hat Python 2nd ...
- 《HeadFirst设计模式》读书笔记-第9章v3-组合迭代器
定义 组合迭代器不是一个设计模式,是指如何在组合中使用迭代器.所以本章的代码是基于<HeadFirst设计模式>读书笔记-第9章v2-组合模式 修改过来的,需要先熟悉组合模式. 代码实现 ...
- 《汇编语言》- 读书笔记 - 第1章-基础知识
<汇编语言>- 读书笔记 - 第1章-基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储 ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
最新文章
- Linux驱动之平台设备
- [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解
- boost::detail::allocator模块的测试程序
- JAVA知识基础(八):继承
- 【一类题】二维数点的几个做法
- Linux常用命令(第二版) --Shell应用技巧
- linux学习笔记整理
- sass笔记 - 实战中颜色的玩法总结
- 为何阿里开发手册中,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
- 《天勤数据结构》笔记——顺序栈和链栈及其代码实现(C/C++)
- 可汗学院公开课:统计学
- Android WebView加载网页进度监听
- 从雷达拼图中提取回波数据
- 华为 Mate40系列发布,你的5G绝版手机来了!
- 比Python爬虫简单的爬虫方法1-后羿采集器
- 2022年上半年软考成绩查询时间 和方法如下:
- Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
- 带你开发一个完整的 node.js 项目
- WiFi(Wireless Fidelity)基础(六)
- 【系统分析师】系统设计
热门文章
- 两年前,梦开始的地方.
- 几个负载均衡软件比较(Haproxy vs LVS vs Nginx)
- Linux输入子系统学习笔记
- ffmpeg1.2的filter分析
- Linux时间子系统之二:表示时间的单位和结构
- Linux 2.6内核启动传递命令行的过程分析
- rabbitmq使用_RabbitMQ 简介以及使用场景
- ACWING828 模拟栈
- mt4 指标 涨跌幅 颜色k线_通达信K线波段操盘指标公式
- html编码的aacll,高级音频编码(AAC)的一种信息隐藏方法.pdf