IE下:
//添加事件句柄 function(oELement,sEvent,fnHandler){ oELement.attachEvent('on' + sEvent,fnHandler); //取消事件句柄 function(oElement,sEvent,fnHandler){ oElement.detachEvent('on' + sEvent,fnHandler); }
其他浏览器下(当然,只有IE8及更早的版本不支持,Opera 7.0 及 Opera 更早版本也不支持):
//添加事件句柄 function(oELement,sEvent,fnHandler){ oElement.addEventListener(sEvent,fnHandler,false); } //取消事件句柄 function(oELement,sEvent,fnHandler){ oElement.removeEventListener(sEvent,fnHandler,false); }
原因:
事件触发顺序有两种:事件捕获与事件冒泡。
1.冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。
2.捕获型事件(event capturing):事件从最不精确的对象(document 对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。
Chrome浏览器支持事件捕获与事件冒泡,添加事件句柄时,默认为true,执行事件捕获,设置为false,为事件冒泡。而IE只支持事件冒泡,因此添加事件句柄的方法不同。
兼容性写法:
<script type="text/javascript"> var EventUtil = { addHandler: function (oElement, sEvent, fnHandler) { oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : oElement.attachEvent("on" + sEvent, fnHandler) }, removeHandler: function (oElement, sEvent, fnHandler) { oElement.removeEventListener ? oElement.removeEventListener(sEvent, fnHandler, false) : oElement.detachEvent("on" + sEvent, fnHandler) }, addLoadHandler: function (fnHandler) { this.addHandler(window, "load", fnHandler) } } </script>
用法实例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>事件练习:封装兼容性添加、删除事件的函数</title> <style> pre{color:green;padding:10px 15px;background:#f0f0f0;border:1px dotted #333;font:12px/1.5 Courier New;} span{color:#999;} </style> <script type="text/javascript"> var EventUtil = { addHandler: function (oElement, sEvent, fnHandler) { oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : oElement.attachEvent("on" + sEvent, fnHandler) }, removeHandler: function (oElement, sEvent, fnHandler) { oElement.removeEventListener ? oElement.removeEventListener(sEvent, fnHandler, false) : oElement.detachEvent("on" + sEvent, fnHandler) }, addLoadHandler: function (fnHandler) { this.addHandler(window, "load", fnHandler) //这里的this是对象本身 } }; EventUtil.addLoadHandler(function () { var aBtn = document.getElementsByTagName("input"); //为第一个按钮添加绑定事件 EventUtil.addHandler(aBtn[1], "click", function () { EventUtil.addHandler(aBtn[0], "click", fnHandler); aBtn[0].value = "我可以点击了" }); //解除第一个按钮的绑定事件 EventUtil.addHandler(aBtn[2], "click", function () { EventUtil.removeHandler(aBtn[0], "click", fnHandler); aBtn[0].value = "毫无用处的按钮" }); //事件处理函数 function fnHandler () { alert("事件绑定成功!") } }) </script> </head> <body> <pre> <script type="text/javascript"> var EventUtil = { addHandler: function (oElement, sEvent, fnHandler) { oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : oElement.attachEvent("on" + sEvent, fnHandler) }, removeHandler: function (oElement, sEvent, fnHandler) { oElement.removeEventListener ? oElement.removeEventListener(sEvent, fnHandler, false) : oElement.detachEvent("on" + sEvent, fnHandler) }, addLoadHandler: function (fnHandler) { this.addHandler(window, "load", fnHandler) } } </script> </pre> <center><input type="button" value="毫无用处的按钮"> <input type="button" value="绑定click"> <input type="button" value="解除绑定"></center> </body> </html>
实例中红色区域是把整个要绑定事项包成一个匿名函数,绑定到window对象load事件上,也就是说加载完成后运行匿名函数包
转自:https://www.jianshu.com/p/af44c7f0e4a6