也许很多同仁一听到事件监听,第一想到的就是原生js的 addEventListener()事件,的确如此,当然如果只是适用于现代浏览器(IE9、10、11 | ff, chorme, safari, opera(非windows系统自带,可安装的Browsers) ),你只需要了解这一个事件的正确拼写和参数就OK啦。

但是小生仅今天要介绍的是 添加事件监听的兼容性写法,所以,如果同仁们无需做兼容的话,建议只是了解或略过 哈/....

首先,介绍一下,事件监听的事件有两个,对,你没听错,是两个:

First: element.addEventListener(event,function(e),useCapture) 

   适用范围: 现代浏览器(IE9、10、11 | ff, chorme, safari, opera)

   参数介绍:

     event: 必须。字符串,指定事件名。(注: 不要是 on+'someEvent', just 'someEvent' is ok).

     function: 必须。指定要事件触发时执行的函数。

       (注:function(e) e:事件对象会作为第一个参数传入函数, 事件对象的类型取决于特定的事件,例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。)

     useCapture: 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。

       (注:true:function(e) 在捕获阶段执行, false:function(e)在冒泡阶段执行,(默认为 false ). 

Second: element.attachEvent(eType,function(e))

  适用范围:IE 6、7、8

  参数介绍:

    eType: 必须。字符串,事件名称,含“on”,比如“onclick”、“onmouseover”、“onkeydown”等。

    function:必须。定要事件触发时执行的函数。

详细了解 参考:http://www.jb51.net/article/18220.htm (本人觉得 参数介绍上 比较细)

由于以上两个事件的适用范围有所不同,所以催生了以下的兼容写法(上代码):

1.原生 Javascript 写法:

 var EventUtil = {

     // 添加事件监听
add: function(element, type, callback){ if(element.addEventListener){
element.addEventListener(type, callback, false);
} else if(element.attachEvent){
element.attachEvent('on' + type, callback);
} else {
element['on' + type] = callback;
}
}
}

  使用方式:

 var at = document.getElementbyId('atemp');
EventUtil.add(at, 'click', function(){ console.log('被点击了');
});

  扩展:

 var EventUtil = {

     // 添加事件监听
add: function(element, type, callback){ if(element.addEventListener){
element.addEventListener(type, callback, false);
} else if(element.attachEvent){
element.attachEvent('on' + type, callback);
} else {
element['on' + type] = callback;
}
}, // 移除事件监听
remove: function(element, type, callback){ if(element.removeEventListener){
element.removeEventListener(type, callback, false);
} else if(element.detachEvent){
element.detachEvent('on' + type, callback);
} else {
element['on' + type] = null;
} }, // 跨浏览器获取 event 对象
getEvent: function(event){ return event ? event : window.event;
}, // 跨浏览器获取 target 属性
getTarget: function(event){ return event.target || event.srcElement;
}, 阻止事件的默认行为
preventDefault: function(event){ if(event.preventDefault){
event.preventDefault();
} else {
event.returnValue = false;
}
}, // 阻止事件流或使用 cancelBubble
stopPropagation: function(){ if(event.stopPropagation){
event.stopPropagation();
} else {
event.cancelBubble = true;
}
} };

2.jQuery $.fn.extend 写法(此方法在js方法上进行的 改进,如下)

 $.fn.extend({
addEvent:function( type, handle, bool){
var el, thisLen=this.length;
bool?bool=bool:bool=false;
if( thisLen == 1){
el = this[0]; //jquery对象转成 js对象
el.addEventListener ? el.addEventListener(type, handle, bool ):
el.attachEvent('on'+type, handle);
}else {
for( var i=0;i<thisLen;i++ ){
el = this[i];
el.addEventListener ? el.addEventListener(type, handle, bool ):
el.attachEvent('on'+type, handle);
}
}
}
}

  使用方式:

$('p').addEvent('click',function(e){ alert(‘哦,我被点啦。。。’); });

  

  扩展:

    同上扩展(不再描述)

ok,打完收工!!!

addEventListener和attachEvent介绍, 原生js和jquery的兼容性写法的更多相关文章

  1. 常用原生JS方法总结(兼容性写法)

    经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...

  2. 【JS】怎样用原生JS实现jQuery的ready方法

    Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,只是与window.onload方法还是有差别的. 总的来说,window. ...

  3. 原生js 与 jQuery对比

    1.原生JS与jQuery操作DOM对比  :   https://www.cnblogs.com/QianBoy/p/7868379.html 2.比较jQuery与JavaScript的不同功能实 ...

  4. 【前端性能】必须要掌握的原生JS实现JQuery

    很多时候,我们经常听见有人说jquery有多快多快.在这个各种类库满天飞的时候,不得不说的是,能有原生JS快吗? 是的,明显原生JS要更快,因为诸如JQuery这样的库必须要兼容各种浏览器和低版本和许 ...

  5. JavaScript中函数和类(以及this的使用<重点>,以及js和jquery讲解,原生js实现jquery)

    1.javascript中以函数来表示类: 一般函数是小写开头:function foo() 类开头是大写:function Foo() 实例化类: obj = new Foo() 其他属性就同类是一 ...

  6. 原生js替换jQuery各种方法-中文版

    原文https://github.com/nefe/You-D... 原生JS与jQuery操作DOM对比 You Don't Need jQuery 前端发展很快,现代浏览器原生 API 已经足够好 ...

  7. 原生js和jquery实现图片轮播特效

    本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...

  8. 原生js和jquery实现图片轮播特效(转)

    本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...

  9. 原生JS和JQuery的区别

    1.原生js和jQuery的入口函数加载模式不同 原生js等页面dom加载完成并且图片等资源也加载完成之后才会执行: jQuery则是等页面dom加载完成执行,不会等图片等资源也加载完成: (也就是说 ...

随机推荐

  1. 【vijos】1789 String(组合计数+奇怪的题)

    https://vijos.org/p/1789 我yy了一下发现我的方法没错啊,为嘛才80分..(后来看了题解,噗,还要判断k>n和k=1的情况QAQ 当k=1的时候,答案显然是m^n 当k& ...

  2. 【BZOJ】2015: [Usaco2010 Feb]Chocolate Giving(spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2015 这种水题真没啥好说的.. #include <cstdio> #include & ...

  3. (转)java中Executor、ExecutorService、ThreadPoolExecutor介绍

    转自: http://blog.csdn.net/linghu_java/article/details/17123057 ScheduledThreadPoolExecutor介绍: http:// ...

  4. jquery动态调整div大小使其宽度始终为浏览器宽度

    需要设置宽度为整个浏览器宽度的div,当然我们可以使用相对布局的方式做到这一点,下面是具体实现,大家可以参考下 有时候我们需要设置宽度为整个浏览器宽度的div,当然我们可以使用相对布局的方式做到这一点 ...

  5. SourceTree --转载 SourceTree大文件上传提示POST git-receive-pack (chunked)相关问题记录

    前两天,更新了百度地图的SDK,更新完了通过SourceTree上传到Github 结果提示 :POST git-receive-pack (chunked), 在网上查询之后了解到这个提示的原因是因 ...

  6. win 8升级win8.1的几个问题

        对于习惯了win7来说的小朋友,win8的使用简直有种想砸电脑的冲动啊,特别是玩游戏的小朋友,win8各种bug.对于游戏.咳咳,我只是多说了,我们都是爱学习的好孩子,少玩游戏,少撸.简单说一 ...

  7. 认识tornado(一)

    tornado 源码包中 demos 目录下包含一些示例程序,就从最简单的 helloworld.py 来看一个 tornado 应用程序的代码结构. 完整的实例程序如下: 01 #!/usr/bin ...

  8. Leetcode-Resotre IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  9. [LeetCode] Factorial Trailing Zeros

    Well, to compute the number of trailing zeros, we need to first think clear about what will generate ...

  10. Java日期类:Date和Calendar的使用

    总是使用这两个类,总是需要百度.还不如一次全部整理完. 一.介绍: Date 类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年 ...