引子:用javascript给元素绑定事件,我们可以用addEventListener这个方法,然而这个方法有兼容问题,比如在IE浏览器上面就无效,在IE上面要用attachEvent这个方法

一、addEventListener和attachEvent的区别:

1、addEventListener有3个参数,attachEvent只有2个参数,默认是冒泡

2、addEventListener的第一个参数是事件类型(例如:click),attachEvent的第一个参数是事件处理函数名称(例如:onclick)

3、this的指向不同,addEventListener中的this,指的是触发的元素,attachEvent中的this指的window

4、为一个事件添加多个事件处理程序,执行的顺序不同,addEventListener会按照添加的处理程序顺序执行,attachEvent的执行顺序是随机的

二、兼容性封装处理:

举例的HTML结构如下:
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>test001</title>
    <style type="text/css">
        .red{color:red;}
    </style>
</head>
<body class="l-bg2">
 <button id="cnt" class="btn">1111</button>
 <button class="btn">2222</button>
 <button class="btn">3333</button>  <div class="page-coat">
     
 </div> </body>
js代码封装如下:
var eles = document.querySelectorAll('.btn') //类数组
//var eles = document.getElementById('cnt') //单个
function addEvent(ele,type,callback){
if(!ele){
return false
};
if(!ele.length){
if(ele.addEventListener){
ele.addEventListener(type,callback,false)
return true;
}else if(ele.attachEvent){
ele['e'+type+callback] = callback;
ele[type+callback] = function(){
ele['e'+type+callback](window.event)
};
ele.attachEvent('on'+type,ele[type+callback])
return true
}
return false
}else{
for(var i=0;i<ele.length;i++){
eventBody(i)
}
}
//处理类数组元素同时绑定事件方法
function eventBody(i){
if(ele[i].addEventListener){
ele[i].addEventListener(type,callback,false);
}else if(ele[i].attachEvent){ ele[i]['e'+type+callback] = callback; ele[i][type+callback] = function(){
ele[i]['e'+type+callback](window.event)
} ele[i].attachEvent('on'+type,ele[i][type+callback])
}
} } function func1(){
alert(this.innerText)
}
//使用方法
addEvent(eles,'click',func1)

这样就解决了解决了上面提到的addEventListener和attachEvent的区别问题。

注意:1、this指向的知识,以上巧妙运用了this指向调用这个函数的对象(比如ele),来保证在IE浏览器中,this指向调用次事件的元素

2、闭包的知识,把for循环的每个 i 值,通过闭包保存,如果是ES6,可以用let,就更方便了

以上目的为了讨论学习,有不完善的地方希望大家原谅,并提出更好的方法,谢谢

 欢迎加入大前端交流群!群号:277942610,VIP新群

原生JS跨浏览器事件封装处理的更多相关文章

  1. js跨浏览器事件对象、事件处理程序

    项目中有时候会不用jquery这么好用的框架,需要自己封装一些事件对象和事件处理程序,像封装AJAX那样:这里面考虑最多的还是浏览器的兼容问题,原生js封装如下:var EventUtil={ //节 ...

  2. 【前端】跨浏览器事件处理程序EventUtil.js个人注释及详解

    <javascript高级程序设计>跨浏览器事件处理程序EventUtil.js个人注释 EventUtil.js // 跨浏览器事件处理程序封装 var EventUtil = { // ...

  3. javascript跨浏览器事件对象类库

    一.前言 学习了javascript事件后,个人总结归纳了跨浏览器事件对象类库,方便以后使用,现分享给大家. 二.事件对象封装 将对浏览器事件对象的操作封装成eventObject.js方便调用 // ...

  4. JQuery和原生JS跨域加载JSON数据或HTML。

    前提:有时候需要在网页上,加载另一个网站上的数据.或者加载另一个网站上的一个页面.Js的Ajax请求不具备跨域功能,可以使用JQuery来实现. 网页端JS代码: $(function () { $. ...

  5. store.js 跨浏览器的localStorage

    store.js 跨浏览器的localStorage 我们总是想要储存一些数据在浏览器端,却对复杂的兼容性头疼,store.js很好的解决了这些问题. store.js ☍ 使用它相当简单: // 储 ...

  6. js 跨浏览器实现事件

    我们知道不同的浏览器实现事件是不同的,就比如说我们常见的有三种方法: 1,dom0处理事件的方法,以前的js处理事件都是这样写的. (function () { var p=document.getE ...

  7. 原生js自动触发事件

    熟悉jquery的童鞋都知道在jq中有一个方法可以自动触发事件,那就是trigger(),那么通过原生js又怎么模拟触发呢? js中添加一个主动触发事件的方法有dispatch.该方法能模拟用户行为, ...

  8. JS跨浏览器的事件处理

    1. 事件流 事件:用户或浏览器自身执行的某种动作.如click(点击事件).mouse***(鼠标事件). 事件流:页面中接收事件的顺序,也可理解为事件在页面中传播的顺序. DOM事件流包括三个阶段 ...

  9. ZeroClipboard / jquery.zclip.min.js跨浏览器复制插件使用中遇到的问题解决

    之前写过一个淘宝优惠券连接PC端转手机端连接的小工具,当时写到将转换好的url复制到剪切板这块时解决了IE和火狐,就是没办法搞定Chrome,知道可以通过flash搞定,但是觉得太麻烦没有仔细研究. ...

随机推荐

  1. maven lean install 的时候出错 Failed to clean project

    问题解决1 : 这种情况是属于  本地有多个  java  线程,关掉其中不用的,或者 都关闭就可以了. 问题解决 2 : Caused by: org.springframework.beans.f ...

  2. jquery.datetimepicker.js 当鼠标离开时,不选中当前时间,以达到清空的目的

    validateOnBlur:true    当鼠标离开时,不选中当前时间,以达到清空的目的 使用方法:   // 时间设置         $('#BankProduct_sale_begin'). ...

  3. 常见的html面试题

    1.doctype作用?标准模式和兼容模式各有什么区别? (1).<doctype>声明位于文档第一行,在<html>标签之前.用于告知浏览器的解析器以什么样的标准解析该文档. ...

  4. ajax上传图片

    选择文件后 ajax上传图片到后台,后台执行保存操作,返回上传的图片路径,显示到页面 需要引入ajaxfileupload.js js代码 <script type="text/jav ...

  5. Bug跟踪的流程

    本文以翼发云协同项目管理系统为例子来讲解Bug跟踪的流程,它以工作流为中心的集成式Bug跟踪软件,它广泛地应用于研发行业的产品缺陷管理 与跟踪.事务跟踪.问题跟踪.任务跟踪.查询跟踪.需求管理.变更跟 ...

  6. SQL注入相关的知识【Mysql为例子】

    以DVWA的sql注入初级为例,结合网上搜索的相关利用方式,总结成这一篇文章,内容会有点跳跃. 大纲: 1.初级手工注入 2.order by的使用 3.union查询注意点 4.Mysql相关的注释 ...

  7. Alamofire源码解读系列(八)之安全策略(ServerTrustPolicy)

    本篇主要讲解Alamofire中安全验证代码 前言 作为开发人员,理解HTTPS的原理和应用算是一项基本技能.HTTPS目前来说是非常安全的,但仍然有大量的公司还在使用HTTP.其实HTTPS也并不是 ...

  8. Map集合概述和特点

    A:Map集合概述和特点(Set底层依赖的是Map) 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接口的不同 Map是双列的(是双列集 ...

  9. Linux下文件误删除恢复案例

    说明:将/etc/profile文件删除,然后恢复 在linux中为什么讲文件删除还能恢复呢? 详见:文件删除原理 http://blog.csdn.net/grantlee1988/article/ ...

  10. MySQL 查询重复的数据,以及部分字段去重和完全去重

    1.查找表中多余的重复记录(多个字段) select * from vitae a where (a.peopleId,a.seq) in  (select peopleId,seq from vit ...