多种方法实现JS动态添加事件


Posted in Javascript onNovember 01, 2013

方法一、setAttribute
var obj = document.getElementById("obj");
obj.setAttribute("onclick", "javascript:alert('测试');");
但是IE不支持用 setAttribute 设置某些属性,包括对象属性、集合属性、事件属性,也就是说用 setAttribute 设置 style、onclick、onmouseover 这些属性在 IE 中是行不通的。

方法二、用 attachEvent 和 addEventListener
IE 支持 attachEvent,object.attachEvent(event,function),例如:

obj.attachEvent("onclick", Foo); 
function Foo() 
{ 
alert("测试"); 
}

或者写成 obj.attachEvent("onclick", function(){alert("测试");});
其它浏览器支持 addEventListener,element.addEventListener(type,listener,useCapture,
obj.addEventListener("click", Foo, false); 
function Foo() 
{ 
alert("测试"); 
}

同样也可写在一起obj.addEventListener("click", function(){alert("测试");}, false);
注意 attachEvent 的事件带 on,如 onclick,而 addEventListener 不带 on,如 click。
考虑兼容性: 
if (window.attachEvent)//兼容IE 
{ 
//IE 的事件代码 
} 
else 
{ 
//其它浏览器的事件代码 
}

上面有两种添加事件的方法,为了同一添加事件的方法,我们不得不再重新写一个通用的添加事件函数:

版本一:

function addEvent(elm, evType, fn, useCapture) { 
if (elm.addEventListener) { 
elm.addEventListener(evType, fn, useCapture);//DOM2.0 
return true; 
} 
else if (elm.attachEvent) { 
var r = elm.attachEvent(‘on‘ + evType, fn);//IE5+ 
return r; 
} 
else { 
elm['on' + evType] = fn;//DOM 0 
} 
}

HTML5工作组的版本:
var addEvent=(function(){ 
if(document.addEventListener){ 
return function(el,type,fn){ 
if(el.length){ 
for(var i=0;i<el.length;i++){ 
addEvent(el[i],type,fn); 
} 
}else{ 
el.addEventListener(type,fn,false); 
} 
}; 
}else{ 
return function(el,type,fn){ 
if(el.length){ 
for(var i=0;i<el.length;i++){ 
addEvent(el[i],type,fn); 
} 
}else{ 
el.attachEvent(‘on‘+type,function(){ 
return fn.call(el,window.event); 
}); 
} 
}; 
} 
})();

方法三、事件 = 函数
例:obj.onclick = Foo;
这种绑定事件的方式,兼容主流浏览器,但如果一个元素上添加多次同一事件呢?
obj.onclick=method1; 
obj.onclick=method2; 
obj.onclick=method3;

如果这样写,那么只有最后绑定的事件,这里是method3会被执行,此时应该用方法二的方法进行事件的绑定

区别IE6、IE7、IE8之间的方法:

var isIE=!!window.ActiveXObject; 
var isIE6=isIE&&!window.XMLHttpRequest; 
var isIE8=isIE&&!!document.documentMode; 
var isIE7=isIE&&!isIE6&&!isIE8; 
if (isIE){ 
if (isIE6){ 


alert(”ie6″); 

}else if (isIE8){ 


alert(”ie8″); 

}else if (isIE7){ 


alert(”ie7″); 

} 
}
Javascript 相关文章推荐
向fckeditor编辑器插入指定代码的方法
May 25 Javascript
超越Jquery_01_isPlainObject分析与重构
Oct 20 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 Javascript
jQuery学习笔记之总体架构
Jun 03 Javascript
node.js中的console.warn方法使用说明
Dec 09 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
Dec 02 Javascript
JavaScript实现简单的四则运算计算器完整实例
Apr 28 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
Mar 09 Javascript
ES6知识点整理之模块化的应用详解
Apr 15 Javascript
React中使用UMEditor的方法示例
Dec 27 Javascript
使用js实现单链解决前端队列问题的方法
Feb 03 Javascript
js实现表单项的全选、反选及删除操作示例
Jun 05 Javascript
基于jquery插件实现常见的幻灯片效果
Nov 01 #Javascript
jQuery Mobile 导航栏代码
Nov 01 #Javascript
js将json格式内容转换成对象的方法
Nov 01 #Javascript
JS实现切换标签页效果实例代码
Nov 01 #Javascript
Javascript delete 引用类型对象
Nov 01 #Javascript
理解Javascript闭包
Nov 01 #Javascript
Javascript 命名空间模式
Nov 01 #Javascript
You might like
php页面缓存ob系列函数介绍
2012/10/18 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
jquery 手势密码插件
2017/03/17 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
python黑魔法之编码转换
2016/01/25 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
Python线性方程组求解运算示例
2018/01/17 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
python变量的存储原理详解
2019/07/10 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
领导证婚人证婚词
2014/01/13 职场文书
新年主持词
2014/03/27 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
党内外群众意见范文
2015/06/02 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书