编写可维护的JavaScript-随笔(五)
事件处理
当事件触发时,事件对象(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-随笔(五)的更多相关文章
- 【读书笔记】读《编写可维护的JavaScript》 - 编程实践(第二部分)
本书的第二个部分总结了有关编程实践相关的内容,每一个章节都非常不错,捡取了其中5个章节的内容.对大家组织高维护性的代码具有辅导作用. 5个章节如下—— 一.UI层的松耦合 二.避免使用全局变量 三.事 ...
- 《编写可维护的JavaScript》之编程实践
最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...
- 编写可维护的Javascript读书笔记
写在前面:之前硬着头皮参加了java方面的编程规范培训,收货良多,工作半年有余的时候,总算感觉到一丝丝Coding之美,以及造轮子的乐趣,以至于后面开发新功能的时候,在Coding style方面花了 ...
- 《编写可维护的javascript》读书笔记(中)——编程实践
上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...
- 《编写可维护的javascript》读书笔记(上)
最近在读<编写可维护的javascript>这本书,为了加深记忆,简单做个笔记,同时也让没有读过的同学有一个大概的了解. 一.编程风格 程序是写给人读的,所以一个团队的编程风格要保持一致. ...
- 编写可维护的JavaScript 收纳架
如果你看过Nicolas C.Zakas写过的任何作品,你必须承认他是个不折不扣的天才.也只有天才级的才能写出<JavaScript高级程序设计>让所有的前端攻城师人手一本.Nicolas ...
- 编写可维护的JavaScript之编程风格
在团队中只有每个人的编程风格一致,大家才能方便的互相看懂和维护对方的代码. 1. 层级缩进 对于层级缩进目前有两种主张:1)使用制表符这种方法有两种好处,第一,制表符和缩进层级之间是一一对应关系,符合 ...
- 《编写可维护的JavaScript》 笔记
<编写可维护的JavaScript> 笔记 我的github iSAM2016 概述 本书的一开始介绍了大量的编码规范,并且给出了最佳和错误的范例,大部分在网上的编码规范看过,就不在赘述 ...
- 编写可维护的JavaScript代码(部分)
平时使用的时VS来进行代码的书写,VS会自动的将代码格式化,所有写了这么久的JS代码,也没有注意到这些点.看了<编写可维护的javascript代码>之后,做了些笔记. var resul ...
- 推荐一本好书:编写可维护的JavaScript(可下载)
目录 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 下载: 有些建议: 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 很多设计模式就是为了解决紧耦合的问题.如果 ...
随机推荐
- flask-restful在解析的请求一定要传content-type:application/json吗?答:其实不需要!
在处理flask-restful api请求时,因为postman发送的格式为text,没有携带content-type:application/json,在解析参数的时候,参数的值都给搞成了空,导致 ...
- mysql在windows下安装(含客户端工具)
下载 http://dev.mysql.com/downloads/ 安装 在出现选择安装类型的窗口中,有“typical(默认)”.“Complete(完全)”.“Custom(用户自定义)”三个选 ...
- ORA-00923: FROM keyword not found where expected
网上搜索这类错误还是挺多的,只提供我遇到的一种情景. 本地数据库环境:Oracle10g 导入别人的项目后,有一段SQL查询总是报如下错误信息: Cause: java.sql.SQLExceptio ...
- 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件
小程序导入,别人导出的数据库json文件,错误信息如下: 导入数据库失败, Error: Poll error, 导入数据任务(id:373985)异常,错误信息:解析导入文件错误,请检查导入文件内容 ...
- this指向问题(改变它的指向)
这个问题倒不是面向对象的,而是今天遇到js面向对象的时候一个例子的时候突然遇到了,call()方法,然后自己突然发现竟然忘记了,查了之后整理如下: xxx.call((对象名),参数a,参数b) xx ...
- 阿里云centos 7上面安装mysql5.7的详细步骤!!!
前言: 网上太多的linux 的安装mysql教程,很多教程不全或者因为环境不一致导致无法成功安装,以下是亲测的可行性的方法,请参考. 步骤: Centos7操作系统YUM库列表里默认不再提供MySQ ...
- C语言实现Socket简单通信
环境是linux,不过应该没什么影响,因为只用到了socket的基本用法,没有涉及pthread等. 分为服务器端和客户端,服务器端监听端口发来的请求,收到后向客户端发送一个Hello World,客 ...
- # 数位DP入坑
Hdu 2089 不要62 #include<iostream> #include<cstdio> #include<cmath> #include<cstr ...
- php获取客户端公网ip代码
<?php /*如果是本地服务器获取客户端的ip地址是 127.0.0.1 如果是域名服务器获取客户端的是公网ip地址*/ function get_client_ip() { $ipaddre ...
- java IO流读取图片供前台显示
最近项目中需要用到IO流来读取图片以提供前台页面展示,由于以前一直是用url路径的方式进行图片展示,一听说要项目要用IO流读取图片感觉好复杂一样,但任务下达下来了,做为程序员只有选择去执行喽,于是找了 ...