关于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 相关文章推荐
JQuery 学习笔记 选择器之一
Jul 23 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
Sep 29 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
Mar 25 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
通过js来制作复选框的全选和不选效果
May 22 Javascript
重写document.write实现无阻塞加载js广告(补充)
Dec 12 Javascript
js给网页加上背景音乐及选择音效的方法
Mar 03 Javascript
基于jquery实现最简单的选项卡切换效果
May 08 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
Sep 24 Javascript
Angular2 PrimeNG分页模块学习
Jan 14 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
小程序实现自定义导航栏适配完美版
Apr 02 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的ASCII码转换类
2013/07/05 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
PHP函数microtime()用法与说明
2013/12/04 PHP
php导入模块文件分享
2015/03/17 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
基于jquery的loading效果实现代码
2010/11/05 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
python Django框架实现自定义表单提交
2016/03/25 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python 实现两个线程交替执行
2020/05/02 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
Keras实现DenseNet结构操作
2020/07/06 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
python 实现Harris角点检测算法
2020/12/11 Python
python sleep和wait对比总结
2021/02/03 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
老教师工作总结的自我评价
2013/09/27 职场文书
信息管理员岗位职责
2013/12/01 职场文书
初中体育教学反思
2014/01/14 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
融资租赁计划书
2014/04/29 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
勇敢的心观后感
2015/06/09 职场文书
学生安全责任协议书
2016/03/22 职场文书
python基础之爬虫入门
2021/05/10 Python
如何通过一篇文章了解Python中的生成器
2022/04/02 Python