多种方法实现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 相关文章推荐
如何在标题栏显示框架内页面的标题
Feb 03 Javascript
利用原生JavaScript获取元素样式只是获取而已
Oct 08 Javascript
png在IE6 下无法透明的解决方法汇总
May 21 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
Aug 11 Javascript
js实现文字截断功能
Sep 14 Javascript
vue axios整合使用全攻略
May 24 Javascript
JavaScript创建对象的常用方式总结
Aug 10 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
jQuery表单校验插件validator使用方法详解
Feb 18 jQuery
js实现表格数据搜索
Aug 09 Javascript
Openlayers实现地图全屏显示
Sep 28 Javascript
JavaScript枚举选择jquery插件代码实例
Nov 17 jQuery
基于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生成扭曲及旋转的验证码图片
2013/06/07 PHP
php的4种常见运行方式
2015/03/20 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
PHP文件上传类实例详解
2016/04/08 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
2020/10/28 Javascript
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
python变量命名的7条建议
2019/07/04 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
最小二乘法及其python实现详解
2020/02/24 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
数学系毕业生的自我评价
2014/01/10 职场文书
教师产假请假条范文
2014/04/10 职场文书
机关作风建设自查报告
2014/10/22 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis