下面绑定事件的代码,进行了兼容性处理,能够被所有浏览器支持:

function addEvent(obj,type,handle){
try{ // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本
obj.addEventListener(type,handle,false);
}catch(e){
try{ // IE8.0及其以下版本
obj.attachEvent('on' + type,handle);
}catch(e){ // 早期浏览器
obj['on' + type] = handle;
}
}
}

这里使用 try{ ... } catch(e){ ... } 代替 if ... else... 语句,避免浏览器出现错误提示。

bindEvent(element, eventName, func) —— 绑定func到element的eventName事件上(不重复绑定)

unBindEvent(element, eventName, func) —— 删除element上的eventName事件上的func函数。

下面是这两个函数的源码:

// ---------- 事件绑定与删除绑定 ---------- //
function bindEvent(element, eventName, func) {
var events = element['the'+eventName]; //用于保存某个事件序列
if(!events) { //如果不存在一个序列,则创建它,并加入HTML标记当中的onEvent = function(){}形式的绑定
events = element['the'+eventName] = [];
if (element['on'+eventName]) { events.push(element['on'+eventName]); }
} //检测是否为重复绑定
for(var i=; i<events.length; i++) {
if(events[i] === func) { flag = true; break; }
} // 非重复绑定,则加入该函数事件
if(i >= events.length) { events.push(func); } // 重新定义这个事件的执行方式
element['on'+eventName] = function(event) {
event = event || (function() { //修复IE的事件对象
var e = window.event;
e.preventDefault = function() { e.returnValue = false; }
e.stopPropagation = function() { e.cancelBubble = true; }
//根据需要继续修复
return e;
})();
//顺序执行这些函数
for(var i=; i<events.length; i++) { events[i].call(element, event); }
}
} // 删除事件绑定
function unBindEvent(element, eventName, func) {
var events = this['the'+eventName];
//如果不存在一个事件序列
if(!events) { return false; } //检测该函数是否存在该事件序列当中
for(var i=; i<events.length; i++) {
if(func === events[i]) {
[].splice.call(events, i, );
return true;
}
} // 函数不存在该事件序列当中
return false;
}

该事件绑定函数具有如下特点:

1、在事件函数中,this指向的是当前元素

2、每个事件其实是一个有序列,按顺序执行这个序列。

3、正确的传递了event对象。对于event对象在W3C标准与IE中的不同之处可以做出修复,本例修复了事件冒泡与阻止默认行为。

4、本机测试通过IE、Firefox、Chrome、Opera、Safari(可以说通用主流浏览器)

5、支持删除事件绑定

当然,还得拿来做一个测试,下面是测试的代码:

<!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 type="text/css">
#test {background-color: #f00; }
</style>
<script type="text/javascript" src="event.js"></script>
<script type="text/javascript">
bindEvent(window, 'load', function() {
var ul = document.getElementById("test");
var a = document.getElementById("baidu"); bindEvent(ul, 'click', function(e){
alert("我是" + this + "元素, 你点击了我!");
}); bindEvent(a, 'click', function(e) {
alert("我是" + this + ",你点击了我!");
}); });
</script>
</head> <body>
<ul id="test">
<p class="t">Hello,world!</p>
<p>Hello,<a href="http://www.baidu.com" id="baidu">百度</a>!</p>
<li id="haha" class="t">afasdfsa</li>
<li>sfk</li>
<li class="t">sdklfajsfjk</li>
<li>end</li>
<li class="te">of</li>
</ul>
<ol id="test2">
<li class="t">附加的第一项</li>
<li class="t">附加的第二项</li>
<li class="t">附加的第三项</li>
</ol>
</body>
</html>

首先,点击红色的UL试试看 —— 将预期弹出:你好,我是HTMLUListElement元素,你点击了我!

好的,再点一下其中的百度链接 ——

预期弹出:你好,我是http://www.baidu.com/,你点击了我!

非预期弹出:你好,我是HTMLULlistElement元素,你点击了我?

为什么非预期弹出?——对,这就是事件的冒泡,当我们点击百度的链接后,该事件将产生冒泡,过程如:<a> -- <li> -- <ul> -- <body> -- document。而ul我们绑定了一个单击事件,所以这时将触发其click事件,而出了非预期弹出。

那么如何阻止?在绑定百度链接的函数体后追加一行:e.stopPropagation(),再次测试:非预期弹出已经没有了。

如果我只想在点击百度链接时,弹出对话框,而不跳转到百度去呢?在绑定百度链接的函数体再次追加一行:e.preventDefault();

测试完毕!具有怀疑精神的朋友可以Copy之后,另做其它测试!!!!

转载自web前端开发

JavaScript中绑定事件监听函数的通用方法addEvent() 和 事件绑定之bindEvent()与 unBindEvent()函数的更多相关文章

  1. 事件监听和window.history以及自定义创建事件

    1.事件监听window.addEventListener方法: Window.addEventListener(event, function, useCapture); useCapture:表示 ...

  2. Android事件监听(二)——点击鼠标事件

    Button.ImageButton事件监听(setOnClickListener) 方法一:通过匿名内部类实现 代码如下: package com.note.demo2; import androi ...

  3. 关于实现自定义Dialog和实现Dialog里view的事件监听的两种方法

    一.自定义dialog. 二.实现dialog里view的事件监听 1.自定义dialog比较简单.在实例化new的时候,加入样式,布局就行了.或者重写dialog. 2.实现dialog里view的 ...

  4. Javascript事件监听

    FireFox : addEventListener()方法 IE : attachEvent()方法 为HTML元素添加一个事件监听, 而不是直接对元素的事件属性(如:onclick.onmouse ...

  5. 利用JavaFx开发RIA桌面应用-事件监听

    1 事件监听 最近利用javaFX开发桌面客户端,碰到需要给各种UI控件添加事件监听,在这里做一个简单的小结,供日后参考. 2 分类处理 在JavaGUI 和Android中,事件通常通过实现list ...

  6. Android 事件监听处理

    事件监听的处理模型包括三个成员:事件源.事件以及事件监听器. 基于监听的事件处理模型一般包括几个步骤: 1.获取普通界面组件: 2.实现事件监听器类 3.将监听器对象注冊给普通组件 当事件源上发生指定 ...

  7. Java swing(awt):事件监听机制的实现原理+简单示例

    (1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回 ...

  8. [转]addEventListener() 方法,事件监听

    转载  白杨-M  http://www.cnblogs.com/baiyangyuanzi/p/6627401.html addEventListener() 方法,事件监听 你可以使用 remov ...

  9. addEventListener() 方法,事件监听

    知识点1:addEventListener() 方法,事件监听,可以使用 removeEventListener() 方法来移除事件的监听. 语法 element.addEventListener(e ...

随机推荐

  1. 在nginx日志的access log中记录post请求的参数值

    背景:有时程序偶出现参数少了或没有提交到下一个链接Url里后出现问题,如何查呢,最好的办法是在nginx上的加post参数,以定位到问题才有可能对某个UIR的代码出现的问题进行排查. og_forma ...

  2. Android开发新手学习总结(六)——android开发目录结构【图文版】

    转载链接:http://bbs.itcast.cn/thread-87059-1-1.html?rss 既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最 ...

  3. MVC 中301永久重定向

    public class PermanentRedirectResult : ViewResult { public string Url { get; set; } public Permanent ...

  4. 原生态PHP+mysql 实现分页

    <?php/** * 数据分页 * 时间:2016-07-06 *//**1传入页码**/ $page = $_GET['p'];/**2根据页码取数据:php->mysql处理**/$h ...

  5. 定位和xml解析和gson解析加上拉加载,下拉刷新

    这里的上拉加载,下拉刷新用到是依赖包 Mainactivity,xml解析和定位 package com.exmple.autolayout; import java.util.List; impor ...

  6. DataGrid新增行数据

    本文将介绍一下,如何通过Jquery MiniUI来添加Datagrid一行. 1.效果展示: ↓ 2.具体代码: <script type="text/javascript" ...

  7. 深入理解JavaScript闭包【译】

    在<高级程序设计>中,对于闭包一直没有很好的解释,在stackoverflow上翻出了一篇很老的<JavaScript closure for dummies>(2016)~ ...

  8. linux下TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...

  9. HTML、JavaScript之单双引号转义

    一.HTML : 双引号:" 单引号:&apos; 二.JavaScript: 双引号:\" 单引号:\'

  10. HTML 链接 - href

    链接 在HTML的学习中,链接的标签发挥着很大的作用,HTML 使用超级链接与网络上的另一个文档相连.几乎可以在所有的网页中找到链接.点击链接可以从一张页面跳转到另一张页面. 比如说:实例 创建超级链 ...