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


    解决顺序问题:我们不用浏览器自带的事件池了,而是自己模拟标准浏览器的事件池实现,具体代码如下:

    /*
        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;
            }
        }
        
    }
    //创建事件池,并且把需要给当前元素绑定的方法依次的增加到事件池中
    function on(curEle,evenType,evenFn){
        if(!curEle["myEvent"+evenType]){
            curEle["myEvent"+evenType] = [];
        }
        var ary = curEle["myEvent"+evenType];
        for(var i = 0;i<ary.length;i++){
            var cur = ary[i];
            if(cur===evenFn){
                return;
            }
        }
        ary.push(evenFn);
        //执行on的时候,我们给当前元素绑定了一个点击的行为,当点击的时候执行run方法:run方法中的this是当前元素curEle,并且浏览器给run传递一个MouseEvent事件对象
        // curEle.addEventListener(evenType,run,false);
        bind(curEle,evenType,run)
    
    }
    //在自己的事件池中把某一个方法移除
    function off(curEle,evenType,evenFn){
        var ary = curEle["myEvent"+evenType];
        for(var i = 0;i<ary.length;i++){
            var cur = ary[i];
            if(cur===evenFn){
                ary.splice(i,1);
                break;
    
            }
        }
    }
    //我们只给当前元素的点击行为绑定一个方法run,当触发点击的时候执行的是run方法,我在run方法中根据自己存储的方法顺序分别的在把这些方法执行
    
    function run(e){
        // this 当前点击的对象curEle
        e = e || window.event;
        var flag = e.target?true:false;
        if(!flag){
            e.target = e.srcElement;
    
        }
        //获取自己事件池中绑定的那些方法,并且让这些方法依次的执行就可以了
        var ary = this["myEvent"+e.type];//e.target也代表curEle
        for(var i = 0;i<ary.length;i++){
            var tempFn = ary[i];
            tempFn.call(this,e);
        }
    }
  • 相关阅读:
    html的转码玉反转码
    获取url据对路径写法
    CSS 外边距合并
    页面禁制选中元素的 背景变蓝的通用写法
    centos7.3上安装oracle11.2.4RAC
    通过ansible检查所有服务器根目录磁盘使用情况
    解决es集群启动完成后报master_not_discovered_exception(hostname有错误)
    tidb4.0执行大型sql报没有tmp目录错处理(ERROR 1105 (HY000): open /tmp/1000_tidb/MC4wLjAuMDo0MDAwLzAuMC4wLjA6MTAwODA)
    aix磁盘创建pv、lv
    aix6.1安装oracle
  • 原文地址:https://www.cnblogs.com/diasa-fly/p/7240209.html
Copyright © 2020-2023  润新知