多种方法实现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 相关文章推荐
javascript fullscreen全屏实现代码
Apr 09 Javascript
jquery 元素相对定位代码
Oct 15 Javascript
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
Feb 10 Javascript
使用jQuery实现更改默认alert框体
Apr 13 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
JS onkeypress兼容性写法详解
Apr 27 Javascript
JS button按钮实现submit按钮提交效果
Nov 01 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
Sep 12 Javascript
Vue中的无限加载vue-infinite-loading的方法
Apr 08 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
Apr 16 jQuery
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
基于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
在PWS上安装PHP4.0正式版
2006/10/09 PHP
PHPLog php 程序调试追踪工具
2009/09/09 PHP
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
微信小程序实现购物车小功能
2020/12/30 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
保证书范文大全
2014/04/28 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
初中运动会前导词
2015/07/20 职场文书
趣味运动会赞词
2015/07/22 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
如何在Python项目中引入日志
2021/05/31 Python