事件处理

当事件触发时,事件对象(event对象)会作为回调参数传入事件处理程序中,event对象包含所有和事件相关的信息

function handleClick(event){
var popup = document.getElementById('popup')
popup.style.left = event.clientX + 'px'
popup.style.top = event.clientY + 'px'
popup.className = "reveal"
} addEventListener(element,"click",handleClick)

尽管上边的代码看起来非常简单且没有什么问题,但实际上是不好的写法,因为这种做法有其局限性

一、    规则

  a)     隔离应用逻辑

    1、上段实例代码第一个问题是事件处理程序中包含了应用逻辑,应用逻辑是和应用相关的功能性代码,而不是和用户行为相关的。如果别的事件也用到这段逻辑,但是存在元素判断的时候这段代码就会重复出现多次。2、测试的时候必须通过制造事件的触发才能测试,而调用功能性代码最好的做法就是单个函数的调用。需要将应用逻辑和事件处理的代码拆分开来。

    事件处理程序应当总是在一个相同的全局对象中

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"
}
} addEventListener(element,"click",function(event){
MyApplication.handleClick(event)
})

MyApplication.handleClick()方法只做了一件事情,调用this.showPopup(event),若应用逻辑被剥离出去,对同一段功能代码的调用可以在多点发生,不需要一定依赖与某个特定事件的触发

  b)不要分发事件对象

  上段改造完后的代码存在一个问题,event对象被无节制地分发,从匿名的事件处理函数传入了MyApplication.handleClick(),然后又传入了MyApplication.showPopup()。但是event对象中的信息这里只用到两个,拿出所有需要的event对象中的数据传给应用逻辑

var MyApplication = {
handleClick: function (event) {
this.showPopup(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"
}
} addEventListener(element,"click",function(event){
MyApplication.handleClick(event)
})
//可以通过调用MyApplication.showPopup(10,10)进行测试,不用依赖事件触发

这样就清晰地看到showPopup()所期望传入的参数。并且在测试或代码的任意位置都可以轻易地直接调用这段逻辑

在处理事件时,最好让事件处理程序成为接触到event对象的唯一函数,在进入应用逻辑之前完成针对event对象的任何必要的操作,比如完成阻止默认事件或阻止事件冒泡

var MyApplication = {
handleClick: function (event) {
event.preventDefault()
evrnt.stopPropagation()
this.showPopup(event.clientX,event.clientY)
},
showPopup: function (event) {
var popup = document.getElementById('popup')
popup.style.left = x + 'px'
popup.style.top = y + 'px'
popup.className = "reveal"
}
} addEventListener(element,"click",function(event){
MyApplication.handleClick(event)
})

这样就清楚地展示了事件处理程序和应用逻辑之间的分工。应用逻辑不需要对event产生依赖

编写可维护的JavaScript-随笔(五)的更多相关文章

  1. 【读书笔记】读《编写可维护的JavaScript》 - 编程实践(第二部分)

    本书的第二个部分总结了有关编程实践相关的内容,每一个章节都非常不错,捡取了其中5个章节的内容.对大家组织高维护性的代码具有辅导作用. 5个章节如下—— 一.UI层的松耦合 二.避免使用全局变量 三.事 ...

  2. 《编写可维护的JavaScript》之编程实践

    最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...

  3. 编写可维护的Javascript读书笔记

    写在前面:之前硬着头皮参加了java方面的编程规范培训,收货良多,工作半年有余的时候,总算感觉到一丝丝Coding之美,以及造轮子的乐趣,以至于后面开发新功能的时候,在Coding style方面花了 ...

  4. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  5. 《编写可维护的javascript》读书笔记(上)

    最近在读<编写可维护的javascript>这本书,为了加深记忆,简单做个笔记,同时也让没有读过的同学有一个大概的了解. 一.编程风格 程序是写给人读的,所以一个团队的编程风格要保持一致. ...

  6. 编写可维护的JavaScript 收纳架

    如果你看过Nicolas C.Zakas写过的任何作品,你必须承认他是个不折不扣的天才.也只有天才级的才能写出<JavaScript高级程序设计>让所有的前端攻城师人手一本.Nicolas ...

  7. 编写可维护的JavaScript之编程风格

    在团队中只有每个人的编程风格一致,大家才能方便的互相看懂和维护对方的代码. 1. 层级缩进 对于层级缩进目前有两种主张:1)使用制表符这种方法有两种好处,第一,制表符和缩进层级之间是一一对应关系,符合 ...

  8. 《编写可维护的JavaScript》 笔记

    <编写可维护的JavaScript> 笔记 我的github iSAM2016 概述 本书的一开始介绍了大量的编码规范,并且给出了最佳和错误的范例,大部分在网上的编码规范看过,就不在赘述 ...

  9. 编写可维护的JavaScript代码(部分)

    平时使用的时VS来进行代码的书写,VS会自动的将代码格式化,所有写了这么久的JS代码,也没有注意到这些点.看了<编写可维护的javascript代码>之后,做了些笔记. var resul ...

  10. 推荐一本好书:编写可维护的JavaScript(可下载)

    目录 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 下载: 有些建议: 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 很多设计模式就是为了解决紧耦合的问题.如果 ...

随机推荐

  1. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  2. func_get_args call_user_func_array

    <?php //call_user_func_array.php function test($arg1,$arg2) { $t_args = func_get_args(); $t_resul ...

  3. 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL 介绍

    原文地址

  4. 安装Vyos

      Vyos是一个开源的网络操作系统,基于Debian,相对于ROS需要购买license,Vyos就更加开放的多. 下载Vyos wget http://vyos.hecint.com/iso/re ...

  5. Io 异常: Invalid number format for port number

    报错信息: Caused by: java.sql.SQLException: Io 异常: Invalid number format for port number    at oracle.jd ...

  6. 踩iviewui中Select 选择器两级联动,重置查询条件时第二级数据无法清除的坑

    小颖公司最近做的项目用的vue+iviewui+axios,在做项目的过程中,遇到一个问题: 二级联动的下拉框,第一个下拉框一直都有值,第二个下拉框是在选择了第一个下拉框之后采取调用ajax获取其值, ...

  7. (近万字)一篇文章带你了解HTML5和CSS3开发基础与应用-适合前端面试必备

    作者 | Jeskson 来源 | 达达前端小酒馆 HTML5和CSS3开发基础与应用,详细说明HTML5的新特性和新增加元素,CSS3的新特性,新增加的选择器,新的布局,盒子模型,文本,边框,渐变, ...

  8. Java class 和public class 区别

    1.类的访问权限 为了控制某个类的访问权限,修饰词必须出现在关键字class之前.例如:public class Student {}    在编写类的时候可以使用两种方式定义类:    (A)pub ...

  9. 【cf比赛记录】Codeforces Round #604 (Div. 2)

    比赛传送门 感觉这场是最近以来做过的最顺手的一场,持续上分,开心w A了 前三题,然后第四题其实还有半个多小时,但怕身体撑不住,就先退了,其实第四题也很简单 自己认为的算法标签: ​ A.暴力模拟.字 ...

  10. Centos开发小计

    1. 生成静态库,linux下库的规则是lib开头 g++ -c code.cpp ar cr libcode.a code.o