addEventListener和attachEvent介绍, 原生js和jquery的兼容性写法
也许很多同仁一听到事件监听,第一想到的就是原生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的兼容性写法的更多相关文章
- 常用原生JS方法总结(兼容性写法)
经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...
- 【JS】怎样用原生JS实现jQuery的ready方法
Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,只是与window.onload方法还是有差别的. 总的来说,window. ...
- 原生js 与 jQuery对比
1.原生JS与jQuery操作DOM对比 : https://www.cnblogs.com/QianBoy/p/7868379.html 2.比较jQuery与JavaScript的不同功能实 ...
- 【前端性能】必须要掌握的原生JS实现JQuery
很多时候,我们经常听见有人说jquery有多快多快.在这个各种类库满天飞的时候,不得不说的是,能有原生JS快吗? 是的,明显原生JS要更快,因为诸如JQuery这样的库必须要兼容各种浏览器和低版本和许 ...
- JavaScript中函数和类(以及this的使用<重点>,以及js和jquery讲解,原生js实现jquery)
1.javascript中以函数来表示类: 一般函数是小写开头:function foo() 类开头是大写:function Foo() 实例化类: obj = new Foo() 其他属性就同类是一 ...
- 原生js替换jQuery各种方法-中文版
原文https://github.com/nefe/You-D... 原生JS与jQuery操作DOM对比 You Don't Need jQuery 前端发展很快,现代浏览器原生 API 已经足够好 ...
- 原生js和jquery实现图片轮播特效
本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...
- 原生js和jquery实现图片轮播特效(转)
本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...
- 原生JS和JQuery的区别
1.原生js和jQuery的入口函数加载模式不同 原生js等页面dom加载完成并且图片等资源也加载完成之后才会执行: jQuery则是等页面dom加载完成执行,不会等图片等资源也加载完成: (也就是说 ...
随机推荐
- 怎样在xilinx SDK中显示行号
Window→preferences→editor→test editor 对ecilpse的通用方法 打开Eclipse软件,在菜单中选择窗体--首选项.打开新的窗体. 在新的窗体中依次选择常规-- ...
- Oozie安装与部署
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3885162.html 安装基础环境: Hadoop – 2.2.0 Linux – Centos 6. ...
- C++ 运算符 [] & *、操作符new 修饰符const inline virtual
1. [] 这让我想到静态分配内存和动态分配内存,与数据名称无关 局部变量和临时变量会储存在静态缓存区,随着程序运行完而消亡(例如在循环体中定义的局部变量随着循环体结束,局部变量也会消亡). 内存泄漏 ...
- android应用安全——代码安全(android代码混淆)
android2.3的SDK开始在eclipse中支持代码混淆功能(理论上java都支持混淆,但关键在于如何编写proguard的混淆脚本,2.3的SDK使用简单的配置就可以实现混淆).使用SDK2. ...
- pocket
Pocket是一个离线阅读服务软件. Pocket的主要功能就是将你要阅读或者一时没有读完的网页标记下来,接着同步到服务器端,然后你就可以在不同的设备上阅读.如果你在电脑上网的时间不多,一些东西又来不 ...
- Codeforces Round #365 (Div. 2) D.Mishka and Interesting sum
题目链接:传送门 题目大意:给n个数,m次询问,每次询问区间 l,r 内出现偶数次数的异或和 题目思路:前缀和+离线处理+树状数组 首先可以知道, l,r 内出现奇数次的数的和,就是把 l,r内所有数 ...
- 《从零开始学Swift》学习笔记(Day 56)——命名规范Swift编码规范之命名规范
原创文章,欢迎转载.转载请注明:关东升的博客 程序代码中到处都是自己定义的名字,取一个有样并且符合规范的名字非常重要. 命名方法很多,但是比较有名的,广泛接受命名法有: 匈牙利命名,一般只是命名变量, ...
- 160622、详解JavaScript变量提升
变量在程序中随处可见.它们是一些始终在相互影响,相互作用的的数据和逻辑.正是这些互动使应用程序活了起来. 在JavaScript中使用变量很重要的一方面就是变量的提升 —— 它决定了一个变量何时可以被 ...
- python框架Scrapy报错TypeError: 'float' object is not iterable解决
原因是:Twisted版本高了. 解决办法: 只要把Twisted库降级到16.6.0即可: pip3 install Twisted== 注:Twisted16..0安装后,会自动卸载高版本的Twi ...
- java 如何将实体bean和map互转化 (利用Introspector内省)
// 将一个map对象转化为bean public static void transMap2Bean(Map<String, Object> map, Object obj) { try ...