和一个朋友讨论了一下,DOM2绑定方式都是有名的函数,匿名的处理起来有些麻烦,而且即使是有名的函数,在IE低版本的浏览器也是解除不掉的,this指向需要修改,着实费了一番功夫,这个是兼容ie低版本的,可能代码不是最优的,希望朋友们提出优化意见或者需要改进的地方,话不多说,上菜:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
</head> <script>
function addEvent(obj,ev,fn){
var fnName = getFuncName(fn) || Math.random()+''+Math.random(); //如果函数名不存在的话 则取两次随机数(避免重复)作为函数存入的key值
var func = function(){ //将函数专为匿名函数并改变this指向 低版本ie下的必然操作 标准下如此操作没有副作用
fn.apply(obj,arguments);
}
obj.funByEv = obj.funByEv || {}
obj.funByEv[ev] = obj.funByEv[ev] || [];
var _json = {}; //新建的json
_json[fnName] = func; //key:传进来的函数的名字 value:传进来的函数转变的匿名函数
obj.funByEv[ev].push( _json ); //将json push到数组里
if(obj.addEventListener){
obj.addEventListener(ev,func,false);
}else{
obj.attachEvent('on'+ev,func);
}
} function removeEvent(obj,ev,fn){
var fnName = getFuncName(fn); //函数名 getFuncName()内部处理 如果传匿名函数或没有传函数 则返回null 否则返回函数名
var iBtn = false; //用来结束数组循环查找的开关
var len = obj.funByEv[ev].length;
if(fn&&fnName){ //如果传进来数组 且数组有名字 则走if语句
  for(var i=0;i<len;i++){ //循环 解除绑定对象的属性下对应事件的数组
for(var j in obj.funByEv[ev][i] ){ //在数组每项中 用json的key与解除的函数匹配
if (j == fnName){ //匹配成功 则删除对应的函数
obj.removeEventListener ? obj.removeEventListener(ev,obj.funByEv[ev][i][fnName],false) : obj.dettachEvent('on'+ev,obj.funByEv[ev][i][fnName]);
iBtn = true; //删除后 则可以结束循环
}
}
if(iBtn)break; //非常重要 同一个函数绑定给同个对象多次,这里认为解除哪个都一样(也许是有区别的,) 所以解除掉一个后,就退出数组循环
  }
}else{ //如果没有传函数,或者传入的是匿名函数 对不起 干掉所有绑定的
for(var i=0;i<len;i++){ //同if操作.只是不用去匹配 json的key和需要解除的函数的名字
for(var k in obj.funByEv[ev][i]){ //原因? 干掉每一个 当然不用去匹配了
obj.removeEventListener ? obj.removeEventListener(ev,obj.funByEv[ev][i][k],false) : obj.detachEvent('on'+ev,obj.funByEv[ev][i][k]);
}
}
}
} function getFuncName(fn){
if(!fn)return null; //如果没有传函数名,则返回空
var reg = /\bfunction\s+([^(]+)/; //正则匹配函数名
var result = fn.toString().match(reg); //通过正则表达式在函数转的字符串中得到数组
return result ? result[1] : null; //取出第一个子项的结果 即为函数名 若没有找到
}
</script>
<script>
addEvent(window,'load',onLoad); function onLoad(){
   var oDiv = document.getElementsByTagName('div')[0];
addEvent(oDiv,'click',function(){alert(this)});
addEvent(oDiv,'click',_a);
addEvent(oDiv,'click',_b);
addEvent(oDiv,'click',_b);
addEvent(oDiv,'mouseover',function(){this.style.background='black'});
removeEvent(oDiv,'mouseover'); }
function _a(){
alert(1);
}
function _b(){
alert(2);
}
function _c(){
alert(3);
} </Script>
<body> <div>1111111111</div>
</body>
</html>

js中邦定事件与解绑支持匿名函数的更多相关文章

  1. js中鼠标滚轮事件详解

    js中鼠标滚轮事件详解   (以下内容部分内容参考了http://adomas.org/javascript-mouse-wheel/ ) 之前js 仿Photoshop鼠标滚轮控制输入框取值中已使用 ...

  2. JS中的event 对象详解

    JS中的event 对象详解   JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...

  3. 从零开始学 Web 之 jQuery(六)为元素绑定多个相同事件,解绑事件

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  4. 【转载】C# 中的委托和事件(详解:简单易懂的讲解)

    本文转载自http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html C# 中的委托和事件(详解) C# 中的委托和事件 委托和事件在 ...

  5. JS中的计时器事件

    JS可以实现很多java代码不易完成的功能.这里学习一些js中的计时器事件. JavaScript 一个设定的时间间隔之后来执行代码,称之为计时事件. 主要通过两个方法来实现: 1.setInterv ...

  6. js中中括号,大括号使用详解

    js中中括号,大括号使用详解 一.总结 一句话总结:{ } 是一个对象,[ ] 是一个数组 1.js大括号{}表示什么意思? 对象 { } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或 ...

  7. js中的计时器事件`setTimeout()` 和 `setInterval()`

    js中的计时器事件 在js中,通常会有一些事件,我们需要让它 间隔一段时间之后再发生,或者 每隔一段时间 发生一次,那就需要用到我们js中的计时事件 计时事件主要有两种: setTimeout() - ...

  8. react第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制)

    第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制) 课程目标 深入理解和掌握事件的冒泡及捕获机制 理解react中的合成事件的本质 在react组件中合理的使用原生事件 ...

  9. 5月23日笔记-js绑定事件、解绑事件、复合事件

    each() $("p").each(function(i,ele){ //alert(ele.innerHTML); alert($("p:eq("+i+&q ...

随机推荐

  1. [hdu5113]Black And White2014北京赛区现场赛B题(搜索加剪枝)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Black And White Time Limit: 2000/2000 MS ...

  2. java程序的10个调试技巧

    参看下面链接:http://www.kuqin.com/java/20120906/330130.html

  3. li浮动引起ul高度坍陷的解决方法

    我们都知道float在CSS中的作用是使元素脱离正常的文档流并使其移动到其父元素的“最左边”或“最右边”.元素浮动之后,它脱离当前正常的文档流,所以无法撑开其父元素,造成父元素的高度塌陷.如下的代码就 ...

  4. Mysql 配置慢查询日志(SlowQueryLog)以及使用日志分析工具

    [ 查看系统关于慢查询的设置 ] mysql> show variables like '%slow%'; +---------------------------+-------------- ...

  5. shell之rm -rf的别名设置

    vim ~/.bashrc alias rm='read -p "Are you ready?" y && [ $y == "y" ] & ...

  6. C语言编译过程简介

    刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C语言的编译原理做一下小小的总结,这样也能 ...

  7. Ext4 MVC CRUD操作

    项目目录结构如下: (1)index.html <!DOCTYPE html> <html> <head> <title>用户管理</title& ...

  8. C# Exception类

    一.异常类 1.在C#中所有的异常都是使用一个异常类型的示例对象表示的,这些异常类型都是继承自System.Exception类型,或者直接使用System.Exception类型的实例对象: 2.在 ...

  9. lisp构造表

    CONS 操作符 我们刚刚学习了如何拆分一个表,现在学习如何合并一个表. CONS 操作符就是做这件事情的. 假设有一个列表 (1 2 3) ,我们做一下 CAR 操作: (car '(1 2 3)) ...

  10. Shell变量替换,命令替换,转义字符

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value ...