关于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 相关文章推荐
dojo随手记 gird组件引用
Feb 24 Javascript
现如今最流行的JavaScript代码规范
Mar 08 Javascript
jQuery中Form相关知识汇总
Jan 06 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
Sep 06 Javascript
基于Jquery代码实现手风琴菜单
Nov 19 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
Aug 24 Javascript
微信小程序模板(template)使用详解
Jan 31 Javascript
基于iScroll实现内容滚动效果
Mar 21 Javascript
对vue v-if v-else-if v-else 的简单使用详解
Sep 29 Javascript
微信小程序音乐播放器开发
Nov 20 Javascript
javascript实现鼠标点击生成文字特效
Dec 24 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的博客ping服务代码
2012/02/04 PHP
php利用事务处理转账问题
2015/04/22 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Python如何读写CSV文件
2020/08/13 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
决心书范文
2014/03/11 职场文书
网络营销策划方案
2014/06/04 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
公司借条范本
2015/05/25 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书