有一个需求要为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设计模式(张容铭)学习笔记 - 外观模式绑定事件的更多相关文章

  1. javascript设计模式(张容铭)学习笔记 - 照猫画虎-模板方法模式

    模板方法模式(Template Method):父类中定义一组操作算法骨架,而降一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤. 项目经理体验了各个页面的 ...

  2. javascript设计模式(张容铭) 第14章 超值午餐-组合模式 学习笔记

    JS 组合模式更常用于创建表单上,比如注册页面可能有不同的表单提交模块.对于这些需求我们只需要有基本的个体,然后通过一定的组合即可实现,比如下面这个页面样式(如图14-2所示),我们来用组合模式实现. ...

  3. JavaScript设计模式之观察者模式(学习笔记)

    设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切 ...

  4. C#学习笔记-外观模式

    题目:股民买卖股票 实现: static void Main(string[] args) { Stock1 gu1 = new Stock1(); Stock2 gu2 = new Stock2() ...

  5. min-max容斥学习笔记

    min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...

  6. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  7. 《JavaScript DOM 编程艺术》 学习笔记

    目录 <JavaScript DOM 编程艺术> 学习笔记 第一章 js简史 第二章 js语法 准备工作 语法 第三章 DOM DOM中的D DOM中的O DOM中的M 第四章 js图片库 ...

  8. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  9. Javascript设计模式理论与实战:工厂方法模式

    本文从简单工厂模式的缺点说起,引入工厂方法模式,介绍的工厂方法模式的基本知识,实现要点和应用场景,最后举例进行说明工厂方法模式的应用.在之前的<Javascript设计模式理论与实战:简单工厂模 ...

随机推荐

  1. Node.js 内置模块fs的readdir方法 查看某个文件夹里面包含的文件内容

    fs.readdir(path[, options], callback) 例: "use strict"; const fs = require("fs"); ...

  2. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持

    jQuery对AJAX的支持 jQuery对Ajax请求的创建.发送.响应.注册数据处理函数.JSON的解析和缓存以及传参等都进行了相应的封装,同时也考虑了浏览器的兼容性问题. jQuery中对AJA ...

  3. IT兄弟连 JavaWeb教程 文件上传技术

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参 ...

  4. Vue2中实现微信分享支付功能

    Vue2中实现微信分享支付功能  近期做了一个微信公众号前后分离项目,前端采用Vue2开发,后端SpringBoot,今天迫不及待的来给大家分享一下这次在开发中遇到的一些坑以及解决办法. 在这里,一些 ...

  5. python 之 函数 内置函数

    5.15 内置函数 方法 含义 备注 abs(-1) 求绝对值 1 all ([1,'a',True]) 列表中所有元素的布尔值为真,最终结果才为真 True all ('') 传给all的可迭代对象 ...

  6. CODING 告诉你硅谷的研发项目管理之道系列(6)

    写在前面 优秀的研发管理者是怎么工作的,如何更加高效地管理研发团队?这些一直是 CODING关注的重要话题,我们不断地打磨 CODING 研发系统来让开发更简单.近期我们精心挑选了几篇硅谷科技公司研发 ...

  7. css3中-moz、-ms、-webkit、-o

    -moz代表firefox浏览器私有属性-ms代表IE浏览器私有属性-webkit代表chrome.safari私有属性-o代表opera私有属性

  8. MySQL server has gone away和Maximum execution time of 120 seconds exceeded

    今天在写采集时碰到两个问题1.MySQL server has gone away2.Maximum execution time of 120 seconds exceeded 采集程序写好运行大概 ...

  9. 算法设计与分析-HomeWork

    ex1(p20) 代码如下: import random def Darts(n): k=0 i=1 while i<=n: x=random.uniform(0,1) #y=random.un ...

  10. 熔断降级(Polly)

    熔断降级(Polly) https://www.cnblogs.com/qhbm/p/9224307.html 一. 什么是熔断降级 熔断就是"保险丝".当出现某些状况时,切断服务 ...