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章:事件处理相关推荐

  1. 【读书笔记】:《编写可维护的JavaScript》第02章 注释

    编写可维护的JavaScript 第02章 注释 2.1 单行注释 2.2 多行注释 2.3 使用注释 2.4 文档注释 第02章 注释 JavaScript支持两种不同类型的注释,单行注释和多行注释 ...

  2. 《编写可维护的JavaScript》——1.7 直接量

    本节书摘来自异步社区<编写可维护的JavaScript>一书中的第1章,第1.7节,作者: [美]Nicholas C. Zakas 译者: 李晶 , 郭凯 , 张散集 更多章节内容可以访 ...

  3. PMP读书笔记(第9章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第九章 项目资源管理 项目资源管理 项目资源管理的核心概念 项目资源管理的趋势和新兴实践 裁剪考虑因素 在敏捷或适应型环境中需要考虑的因素 9 ...

  4. PMP读书笔记(第1章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第一章 引论 1.1 概述指南和目的 1.1.1 项目管理标准 1.1.2 通用词汇 1.1.3 道德与专业行为规范 1.2 概述指南和目的 ...

  5. 《Spring实战》读书笔记-第4章 面向切面的Spring

    <Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...

  6. Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

    Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...

  7. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境 文章目录 黑帽python第二版(Black Hat Python 2nd ...

  8. 《HeadFirst设计模式》读书笔记-第9章v3-组合迭代器

    定义 组合迭代器不是一个设计模式,是指如何在组合中使用迭代器.所以本章的代码是基于<HeadFirst设计模式>读书笔记-第9章v2-组合模式 修改过来的,需要先熟悉组合模式. 代码实现 ...

  9. 《汇编语言》- 读书笔记 - 第1章-基础知识

    <汇编语言>- 读书笔记 - 第1章-基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储 ...

  10. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

最新文章

  1. Linux驱动之平台设备
  2. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解
  3. boost::detail::allocator模块的测试程序
  4. JAVA知识基础(八):继承
  5. 【一类题】二维数点的几个做法
  6. Linux常用命令(第二版) --Shell应用技巧
  7. linux学习笔记整理
  8. sass笔记 - 实战中颜色的玩法总结
  9. 为何阿里开发手册中,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
  10. 《天勤数据结构》笔记——顺序栈和链栈及其代码实现(C/C++)
  11. 可汗学院公开课:统计学
  12. Android WebView加载网页进度监听
  13. 从雷达拼图中提取回波数据
  14. 华为 Mate40系列发布,你的5G绝版手机来了!
  15. 比Python爬虫简单的爬虫方法1-后羿采集器
  16. 2022年上半年软考成绩查询时间 和方法如下:
  17. Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
  18. 带你开发一个完整的 node.js 项目
  19. WiFi(Wireless Fidelity)基础(六)
  20. 【系统分析师】系统设计

热门文章

  1. 两年前,梦开始的地方.
  2. 几个负载均衡软件比较(Haproxy vs LVS vs Nginx)
  3. Linux输入子系统学习笔记
  4. ffmpeg1.2的filter分析
  5. Linux时间子系统之二:表示时间的单位和结构
  6. Linux 2.6内核启动传递命令行的过程分析
  7. rabbitmq使用_RabbitMQ 简介以及使用场景
  8. ACWING828 模拟栈
  9. mt4 指标 涨跌幅 颜色k线_通达信K线波段操盘指标公式
  10. html编码的aacll,高级音频编码(AAC)的一种信息隐藏方法.pdf