使用DOM实现事件响应函数的注册、删除及事件传递的终止
2013-02-28 14:00
453 查看
看代码, 如下:
对部分代码进行说明:
1.var ev = e || event;
firefox将消息对象作为参数传递到响应函数(e),而IE则定义为全局变量event(window下)。
2.window.clickHandlerOnDiv
全局方法可用通过这种方式进行重写。
3.clickHandlerOnDiv(event)
通过HTML注册事件响应也是可以传递参数的。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript"> // inner的响应函数 var clickInner = function(e){ alert(1.1); }; // banner的响应函数 var clickBanner = function(e){ alert(2.1); } // body的响应行数 var clickBody = function(e){ alert(3.1); } // 注册事件响应 var addEventHandler = function(){ var inner = document.getElementById('inner'); var banner = document.getElementById('banner'); var cancelEvevntBtn = document.getElementById('cancelEvevnt'); if(inner.addEventListener){ inner.addEventListener('click',clickInner,true); banner.addEventListener('click',clickBanner,true); document.body.addEventListener('click',clickBody,true); }else if(inner.attachEvent){ inner.attachEvent('onclick',clickInner); } } // 删除事件响应 var removeEventHandler = function(){ var inner = document.getElementById('inner'); var banner = document.getElementById('banner'); var cancelEvevntBtn = document.getElementById('cancelEvevnt'); if(inner.removeEventListener){ inner.removeEventListener('click',clickInner,true); banner.removeEventListener('click',clickBanner,true); document.body.removeEventListener('click',clickBody,true); }else if(inner.detachEvent){ inner.detachEvent('onclick',clickInner); } } // 删除捕获事件响应,IE不知捕获事件流,所以IE下无效 var removeCapEventHandler = function(){ var banner = document.getElementById('banner'); if(banner.removeEventListener){ banner.removeEventListener('click',clickBanner,true); banner.addEventListener('click',function(e){ alert(2.1); e.stopPropagation(); },true); } } // 删除冒泡的事件响应 var removeBubEventHandler = function(){ window.clickHandlerOnDiv = function(e){ alert(2); var ev = e || event; if(ev.stopPropagation){ ev.stopPropagation(); }else { ev.cancelBubble = true; } } } // 给按钮增加响应事件 document.onreadystatechange = function () { if(document.readyState=="complete") { var addBtn = document.getElementById('addEvent'); var removeBtn = document.getElementById('removeEvent'); var removeCaptureEvent = document.getElementById('removeCaptureEvent'); var removeBubbleEvent = document.getElementById('removeBubbleEvent'); if(addBtn.addEventListener){ addBtn.addEventListener('click',addEventHandler,false); removeBtn.addEventListener('click',removeEventHandler,false); removeCaptureEvent.addEventListener('click',removeCapEventHandler,false); removeBubbleEvent.addEventListener('click',removeBubEventHandler,false); }else if(addBtn.attachEvent){ addBtn.attachEvent('onclick',addEventHandler); removeBtn.attachEvent('onclick',removeEventHandler); removeBubbleEvent.attachEvent('onclick',removeBubEventHandler); } } } clickHandlerOnBody = function(e){ alert(3); } clickHandlerOnDiv = function(e){ alert(2); } clickHandlerOnInner = function(e){ alert(1); } </script> <title>Demo System</title> </head> <body id="body" onclick="clickHandlerOnBody()"> body <div id='banner' style="width:100px;height:100px;background-color:red;" onclick="clickHandlerOnDiv(event)"> banner <div id='inner' style="width:50px;height:50px;background-color:yellow;" onclick="clickHandlerOnInner()">inner</div> </div> <br> <input id="addEvent" value="添加事件监听" type="button"/> <input id="removeEvent" value="取消事件监听" type="button"/> <input id="removeCaptureEvent" value="停止捕获事件流" type="button"/> <input id="removeBubbleEvent" value="停止冒泡事件流" type="button"/> </body> </html>
对部分代码进行说明:
1.var ev = e || event;
firefox将消息对象作为参数传递到响应函数(e),而IE则定义为全局变量event(window下)。
2.window.clickHandlerOnDiv
全局方法可用通过这种方式进行重写。
3.clickHandlerOnDiv(event)
通过HTML注册事件响应也是可以传递参数的。
相关文章推荐
- jQuery使用load函数访问Struts2中的Action实现局部刷新和注册事件
- iOS开发:使用响应链方法实现传值及事件传递
- jQuery使用bind函数实现绑定多个事件的方法
- 使用委托在用户自定义控件中实现事件响应
- 不使用引用和全局变量实现函数参数传递
- 给事件响应函数传递参数
- 101 事件 [~ie8] 删除事件 以及同一个注册函数进行屏蔽
- vuejs2.0实现分页组件,使用$emit进行事件监听数据传递
- 使用Extjs组件实现Top-Left-Main布局并且增加事件响应
- vuejs2.0实现分页组件,使用$emit进行事件监听数据传递
- UIButton事件函数中删除自身导致崩溃 和 触摸事件继续传递
- 安卓入门 使用android创建一个项目 从启动activity中响应按钮事件 启动另一个activity 并传递参数
- delphi中用代码实现注册Ocx和Dll(有点怪异,使用CallWindowProc来调用指定函数DllRegisterServer)
- A标签上使用onclick事件,js函数响应成功,单会刷新当前页面陷阱
- Python def函数的定义、使用及参数传递实现代码
- windows中使用Findwindow函数与FindWindowEx函数来实现自动控制、触发第三方软件事件的方法
- C# 线程中使用Timer,并向其触发的事件(函数)中传递参数
- 使用Bootstrap的popover标签中嵌入插件,并且为插件注册事件实现Ajax与后台交互
- 使用jQuery查找注册到某个DOM对象的事件处理函数
- 使用委托在用户自定义控件中实现事件响应