关于js注册事件的常用方法


Posted in Javascript onApril 03, 2013

不解释,看代码:

;(function(){
    //进行库封装,防止对象污染
    window['cm']={};
/**
    *给对象注册事件
    */
    var addListener=function(element,type,fn){
        if(typeof element == 'undefined') return false;
        if(element.addEventListener){
            element.addEventListener(type,fn,false);
        }else if(element.attachEvent){
            //将事件缓冲到该标签上,已解决this指向window(现fn内this指向element)和移除匿名事件问题
            var _EventRef='_'+type+'EventRef';
            if(!element[_EventRef]){
                element[_EventRef]=[];
            }
            var _EventRefs=element[_EventRef];
            var index;
            for(index in _EventRefs){
                if(_EventRefs[index]['realFn']==fn){
                    return;
                }
            }
            var nestFn=function(){
                fn.apply(element,arguments);
            };
            element[_EventRef].push({'realFn':fn,'nestFn':nestFn});
            element.attachEvent('on'+type,nestFn);
        }else{
            element['on'+type]=fn;
        }
    };
    window['cm']['addListener']=addListener;
    /**
    *移除对象上已注册事件
    */
    var removeListener=function(element,type,fn){
        if(typeof element == 'undefined') return false;
        if(element.removeEventListener){
            element.removeEventListener(type,fn,false);
        }else if(element.detachEvent){
            var _EventRef='_'+type+'EventRef';
            if(!element[_EventRef]){
                element[_EventRef]=[];
            }
            var _EventRefs=element[_EventRef]
            var index;
            var nestFn;
            for(index in _EventRefs){
                if(_EventRefs[index]['realFn']==fn){
                    nestFn=_EventRefs[index]['nestFn'];
                    if(index==_EventRefs.length-1){
                        element[_EventRef]=_EventRefs.slice(0,index);
                    }else{
                        element[_EventRef]=_EventRefs.slice(0,index).concat(_EventRefs.slice(index+1,_EventRefs.length-1));
                    }
                    break;
                }
            }
            if(nestFn){
                element.detachEvent('on'+type,nestFn);
            }
        }else{
            element['on'+type]=null;
        }
    };
})();

 

Javascript 相关文章推荐
javascript下阻止表单重复提交、防刷新、防后退
Aug 17 Javascript
js 表格隔行颜色
Dec 02 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
jquery动态增加删减表格行特效
Nov 20 Javascript
Javascript 字符串模板的简单实现
Feb 13 Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 Javascript
jQuery 3.0十大新特性
Jul 06 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
Feb 07 Javascript
VUE实现图片验证码功能
Nov 18 Javascript
js实现经典贪吃蛇小游戏
Mar 19 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
Jul 19 Javascript
vue props default Array或是Object的正确写法说明
Jul 30 Javascript
JavaScript栏目列表隐藏/显示简单实现
Apr 03 #Javascript
JS模板实现方法
Apr 03 #Javascript
JS实现标签页效果(配合css)
Apr 03 #Javascript
JS实现下拉框的动态添加(附效果)
Apr 03 #Javascript
js去字符串前后空格5种实现方法及比较
Apr 03 #Javascript
终于解决了IE8不支持数组的indexOf方法
Apr 03 #Javascript
jQuery布局插件UI Layout简介及使用方法
Apr 03 #Javascript
You might like
PHP在Web开发领域的优势
2006/10/09 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
php防止sql注入的方法详解
2017/02/20 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
JS 时间显示效果代码
2009/08/23 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
JavaScript中的Math.LN2属性用法详解
2015/06/12 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
深入理解vue Render函数
2017/07/19 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
Python中非常实用的一些功能和函数分享
2015/02/14 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
python3 深浅copy对比详解
2019/08/12 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
业务副厂长岗位职责
2014/01/03 职场文书
运动会入场解说词300字
2014/01/25 职场文书
应届生找工作求职信
2014/06/24 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
淘宝好评语句大全
2014/12/31 职场文书
小学重阳节活动总结
2015/03/24 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
如何使用python包中的sched事件调度器
2022/04/30 Python
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android