js学习总结----DOM2兼容处理重复问题

在解决this问题之后,只需要在每次往自定义属性和事件池当中添加事件的时候进行一下判断就好了,具体代码如下

/*
    bind:处理DOM2级事件绑定的兼容性问题(绑定方法)
    @parameter:
        curEle->要绑定事件的元素
        evenType->要绑定的事件类型("click","mouseover")
        evenFn->要绑定的方法
*/
function bind(curEle,evenType,evenFn){
    if(‘addEventListener‘ in document){
        curEle.addEventListener(evenType,evenFn,false);
        return;
    }
    //给evenFn化妆 并且把化妆前的照片贴在自己对应的脑门上
    var tempFn = function(){
        evenFn.call(curEle)
    }
    tempFn.photo = evenFn;
    //首先判断自定义属性之前是否存在,不存在的话创建一个,由于要存储多个化妆后的结果,所以我们让其值是一个数组
    if(!curEle["mybind"+evenType]){//根据不同的事件类型是不同的数组
        curEle["mybind"+evenType] = [];
    }
    //解决重复问题:每一次自己在往自定义属性对应的容器中添加前,看一下是否已经存在,存在的话就不用重新的添加了,同理也不需要往事件池里面存储了
    var ary = curEle["mybind"+evenType];
    for(var i = 0;i<ary.length;i++){
        var cur = ary[i];
        if(cur.photo === evenFn){
            return;
        }
    }
    ary.push(tempFn);
    curEle.attachEvent("on"+evenType,tempFn);
    //这里的开始想法是改变this的指向,把this不指向window
    /*
        box.attachEvent("onclick",function(){
            fn1.call(box)
        })
        这样虽然解决了this的问题,但是又抛出了一个新的问题,不知道该如何删除了(我们不知道匿名函数是谁)
        var tempFn = function(){
            fn1.call(box)
        }
        box.attachEvent("onclick",tempFn);
        box.detachEvent("onclick",tempFn);
    */
}

function unbind(curEle,evenType,evenFn){
    if(‘removeEventListener‘ in document){
        curEle.removeEventListener(evenType,evenFn,false);
        return;
    }
    //拿evenFn到curEle["myBind"]这里找化妆后的结果,找到之后再事件池中把化妆后的结果移除事件池
    var ary = curEle[‘myBind‘+evenType];
    for(var i = 0;i<ary.length;i++){
        if(ary[i].photo===evenFn){
            ary.splice(i,1)//找到后 把自己存储的容器中对应的移除掉
            curEle.detachEvent("on"+evenType,ary[i]);//在把事件池中对应的也移除掉
            break;
        }
    }

}
时间: 2024-11-07 03:01:11

js学习总结----DOM2兼容处理重复问题的相关文章

js学习总结----DOM2兼容处理顺序问题

解决顺序问题:我们不用浏览器自带的事件池了,而是自己模拟标准浏览器的事件池实现,具体代码如下: /* bind:处理DOM2级事件绑定的兼容性问题(绑定方法) @parameter: curEle->要绑定事件的元素 evenType->要绑定的事件类型("click","mouseover") evenFn->要绑定的方法 */ function bind(curEle,evenType,evenFn){ if('addEventListener

js学习总结----ajax兼容处理及惰性思想

封装代码如下: // var xhr = null; // //为了兼容IE6及更低的版本:如果第一个不支持,则浏览器会报错,后面就不在执行了 // try{ // xhr = new ActiveXObject("Microsoft.XMLHTTP"); // }catch(e){ // } // if(new ActiveXObject("Microsoft.XMLHTTP")){ // xhr = new ActiveXObject("Microso

JS学习笔记-事件绑定

一.传统事件模型 传统事件模型中存在局限性. 内联模型以HTML标签属性的形式使用,与HTML混写,这种方式无疑造成了修改以及扩展的问题,已经很少使用了. 脚本模型是将事件处理函数写到js文件中,从页面获取元素进行对应事件函数的绑定以触发执行.但也存在不足之处: 1.一个事件绑定多个事件监听函数,后者将覆盖前者. 2.需要限制重复绑定的情况 3.标准化event对象 二.现代事件绑定 DOM2级事件定义了两个方法用于添加.删除事件:addEventListener().removeEventLi

Ext JS学习第五天 Ext_window组件(二)

此文用来记录学习笔记 •上一讲我们已经学过了window的使用,那么在这将中,我们将结合然后把Ext中需要注意的地方,以及组建的使用给予介绍.indow做几个Web开发的经典示例. •ExtWeb实战300例: –例1:点击按钮打开一个window,window重复创建的问题 •重点分析:这个问题是初学者经常会犯错的地方,一般来说简单的代码不会产生此问题,但是如果以后代码复杂以后,这个问题如果发生调试起来会非常麻烦!! 附上栗子代码 1 Ext.onReady(function () { 2 3

JS学习笔记-OO疑问之对象创建

问一.引入工厂,解决重复代码 前面已经提到,JS中创建对象的方法,不难发现,基本的创建方法中,创建一个对象还算简单,如果创建多个类似的对象的话就会产生大量重复的代码. 解决:工厂模式方法(添加一个专门创建对象的方法,传入参数避免重复) function createObject(name,age){ var obj =new Object(); //创建对象 obj.name = name; obj.age = age; obj.run = function(){ return this.nam

Angular JS学习笔记

之前的学习方法有点盲目,建议以后只看与工作有关的内容,并且多问那些是只和工作有关联的. 遇到问题的时候,项目不急的话,自己研究,项目急的话,马上问. 方法不对,再努力也没有用. Angular JS学习网站:http://www.zouyesheng.com/angular.html#toc7 [  项目有关的内容 ] ng-model ng-click ng-options ng-repeat ng-if ng-show ng-hide ng-controller ng-href(有印象) {

JS求多个数组的重复数据

今天朋友问了我这个问题:JS求多个数组的重复数据 注: 1.更准确的说是只要多个数组中有两个以上的重复数据,那么这个数据就是我需要的 2.单个数组内的数据不存在重复值(当然如果有的话,你可以去重) 3.耗时问题,这一点很重要 源代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>获取多个数组中

video.js学习笔记

在开发的项目中,有视频播放这个功能,找了好多前端的插件,最后决定时用video.js . 什么是video.js? video.js是一个开源的HTML5  jquery 视频插件,这个插件可以用来处理Flash 视频,也可以很好的支持H5,它还是一个多平台支持的产品. video.js的优点 它是开源免费的,可以在github很容易的获取到最新的源码. 使用起来非常容易,只要花几秒中就可以夹起一个视频播放页面. 它几乎兼容所有的浏览器,并且优先使用HTML5,在不支持的浏览器中,会自动生成Fa

JS学习:JavaScript的核心

分享到 分类 JS学习   发布 ourjs  2013-12-02 注意 转载须保留原文链接,译文链接,作者译者等信息. 作者: JeremyWei  原文: JavaScript The Core 对象 原型链 构造函数 执行上下文栈 执行上下文 变量对象 活动对象 作用域链 闭包 This 总结 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 面向读者:经验丰富的程序员,专家. 我们以思考对象的概念做为开