javascript设计模式(张容铭)学习笔记 - 外观模式绑定事件
有一个需求要为document对象绑定click事件来是想隐藏提示框的交互功能,于是小白写了如下代码:
document.onclick = function(e) {
e.preventDefault();
if(e.target !== document.getElementById('myinput')) {
hidePageAlert();
}
}
function hidePageAlert() {
//隐藏提示框
}
同事小铭看了看代码说:
“首先,你为document 绑定了click事件,但是onclick是DOM0级事件,也就是说这种方式绑定的时间相当于为元素绑定了一个时间方法, 所以如果团队中的其他人再次通过这种方式为document绑定click事件时,就相当于重复定义了一个方法,会将你定义的click事件方法覆盖,如下列程序。”
document.onclick= function() {
//其他开发人员重新为document绑定时间会覆盖前面定义的DOM0级click事件
}
“所以你这种方式是很危险的。因此你应该用DOM2级事件处理程序提供的方法addEventListener来实现,然而你知道老版本的IE浏览器(低于9)是不支持这个方法的,它支持的是attachEvent,当然如果有不支持DOM2级事件处理程序的浏览器,你只能用onclick事件方法来绑定事件。”
“那么有没有一个兼容所有浏览器的方式呢?” 小白追问。
兼容模式
// 外观模式实现
function addEvent(dom, type, fn) {
// 对于支持DOM2级事件处理程序addEventListener方法的浏览器
if(dom.addEventListener) {
dome.addEventListener(type, fn, false);
// 对于不支持addEventListener 方法,但是支持attachEvent方法的浏览器
}else if(dom.attachEvent) {
dom.attachEvent('on' + type, fn);
// 对于不支持addEventListener方法也不支持attachEvent方法,但支持on+'事件名'的浏览器
}else{
dom['on' + type] = fn;
}
}
“这样我们以后对于支持addEventListener 或 attachEvent方法的浏览器就可以放心的绑定多个事件了, 如下所示。”
var myInput = document.getElementById('myinput');
addEvent(myInput, 'click', function(){
console.log('绑定第一个事件')
})
addEvent(myInput, 'click', function(){
console.log('绑定第二个事件')
})
除此之外
“不过之前写的代码问题不止一个,之前说了,外观模式可以简化底层接口复杂性,也可以解决浏览器兼容性问题。而你之前写的代码除了绑定时间的问题外,另外两处问题是在其他IE低版本浏览器中不兼容 e.preventDefault 和 e.target。你也可以通过外观模式来解决。”
// 获取事件对象
var getEvent = function(event) {
// 标准浏览器返回event,IE下window.event
return event || window.event;
} // 获取元素
var getTarget = function(event) {
var event = getEvent(event);
// 标准浏览器下event.target, IE下event.srcElement
return event.target || event.srcElement;
} // 阻止默认行为
var preventDefault = function(event) {
var event = getEvent(event);
// 标准浏览器
if(event.preventDefault) {
event.preventDefault();
// IE 浏览器
}else {
event.returnValue = false;
}
}
“有了上面的方法,我们就可以用兼容的简单方式来解决上面的问题。”
document.onclick = function(e) {
// 阻止默认行为
preventDefault(e);
// 获取事件源目标对象
if(getTarget(e) != document.getElementById('myinput')){
hideInputSug();
}
}
javascript设计模式(张容铭)学习笔记 - 外观模式绑定事件的更多相关文章
- javascript设计模式(张容铭)学习笔记 - 照猫画虎-模板方法模式
模板方法模式(Template Method):父类中定义一组操作算法骨架,而降一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤. 项目经理体验了各个页面的 ...
- javascript设计模式(张容铭) 第14章 超值午餐-组合模式 学习笔记
JS 组合模式更常用于创建表单上,比如注册页面可能有不同的表单提交模块.对于这些需求我们只需要有基本的个体,然后通过一定的组合即可实现,比如下面这个页面样式(如图14-2所示),我们来用组合模式实现. ...
- JavaScript设计模式之观察者模式(学习笔记)
设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切 ...
- C#学习笔记-外观模式
题目:股民买卖股票 实现: static void Main(string[] args) { Stock1 gu1 = new Stock1(); Stock2 gu2 = new Stock2() ...
- min-max容斥学习笔记
min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...
- 【Head-First设计模式】C#版-学习笔记-开篇及文章目录
原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...
- 《JavaScript DOM 编程艺术》 学习笔记
目录 <JavaScript DOM 编程艺术> 学习笔记 第一章 js简史 第二章 js语法 准备工作 语法 第三章 DOM DOM中的D DOM中的O DOM中的M 第四章 js图片库 ...
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- Javascript设计模式理论与实战:工厂方法模式
本文从简单工厂模式的缺点说起,引入工厂方法模式,介绍的工厂方法模式的基本知识,实现要点和应用场景,最后举例进行说明工厂方法模式的应用.在之前的<Javascript设计模式理论与实战:简单工厂模 ...
随机推荐
- jzoj6005. 【PKUWC2019模拟2019.1.17】数学 (生成函数+FFT+抽代+高精)
题面 题解 幸好咱不是在晚上做的否则咱就不用睡觉了--都什么年代了居然还会出高精的题-- 先考虑如果暴力怎么做,令\(G(x)\)为\(F(n,k)\)的生成函数,那么不难发现\[G^R(x)=\pr ...
- 导出war包
1. 使用Eclipse 导出 右键web工程 -> export -> war file 将导出的war文件放到tomcat安装目录的webapps下,然后启动tomcat,就会发现在该 ...
- HTML+CSS注意点
1. 对于中文网页,需要在header中使用<meta charset="utf-8">声明编码,否则会出现乱码. 2. 属性 属性 描述 class 为html元素定 ...
- 上传、裁剪图片-----Jcrop图片裁剪插件
Jcrop文档:http://code.ciaoca.com/jquery/jcrop/C#裁剪:http://www.cnblogs.com/xyang/archive/2013/02/25/293 ...
- Jmeter4.0----cookie(8)
1.说明 在脚本编写的过程中,我们常常会遇到用户登录的情况,并且将部分重要信息保存在用户的cookie中,所以,来说一下,对用户登录产生cookie的操作情况. 2.步骤 第一步:添加HTTP Coo ...
- 简单记录下SpringCloud的微服务架构和一些概念
一.微服务的注册与发现——Eureka 和许多分布式设计一样,分布式的应用一般都会有一个服务中心,用于记录各个机器的信息.微服务架构也一样,我们把一个大的应用解耦成这么多个那么多个服务,那么在想要调用 ...
- linux-ubuntu下调出中文输入法
linux-ubuntu下调出中文输入法 注:此方法我并没有亲身实践过,只是觉得可能会用到,所以保存一下
- windows环境下memcache配置方法 详细篇
将memcache服务器安装包解压到C:\memcached文件夹后,使用cmd命令窗口安装. 1>开始>运行:CMD(确定) 2>cd C:\memcached(回车) 3> ...
- html5响应式
(function (doc, win) { var docEl = doc.documentElement, resizeEvt = ‘orientationchange’ in window ? ...
- eclipse、idea安装lombok插件
今天新项目中,用到了lombok知识,很方便. 但是使用之前,需要在eclipse.idea中安装插件才可以使用,配置如下. 一:在开发工具中安装插件: Eclipse: 下载地址:https:// ...