javascript - js事件监听代码
PHP中文网
PHP中文网 2017-04-10 15:44:34
[JavaScript讨论组]
<p id="p1">aaaaaaaa</p>
<p id="p2">bbbbbbbb</p>
//这是看别人的代码有3点疑惑下面addEvent方法里的代码,我用段点去执行了下面的代码
window.onload = function(){
    var op = document.getElementById('p1');
    var op2 = document.getElementById('p2');
    function change(){
        alert(this);
    }
    
    addEvent(op,'click',change);
    
    op2.onclick = function(){
        removeEvent(op,'click',change);
    };
    
    function addEvent(obj,event,fn){
        //1、程序走进这里执行的是obj['bind'+event]
        obj['bind'+event] = obj['bind'+event] || {};
        //2、而程序走到下面这里确执行的是function(){fn.call(obj);}
        //   不应该是执行obj['bind'+event]['bind'+fn]这个吗?
        obj['bind'+event]['bind'+fn] = obj['bind'+event]['bind'+fn] || function(){fn.call(obj);}
        //3、这样写obj['bind'+event]['bind'+fn]是事件吗?
        //   转换过来不是一个复合数组了吗?obj["bindclick","bindchange"];
        obj.attachEvent('on'+event,obj['bind'+event]['bind'+fn]);
        
    }
    function removeEvent(obj,event,fn){
        if( obj['bind'+event] &&  obj['bind'+event]['bind'+fn]){
            obj.detachEvent('on'+event , obj['bind'+event]['bind'+fn]);
        }
    }
    
};
PHP中文网
PHP中文网

认证0级讲师

全部回复(1)
巴扎黑

你需要明白 js 中 || 的含义, 你可以在浏览器调试中实验一下几组 code

var d = 1||'test';
console.log(d); // 1
d = 0||'test'; 
console.log(d); // test

看明白这个之后就能理解这个绑定了
直白的说 || 前面如果是 true 那结果返回的值也就是 true 而如果是 false 就返回的是右边的值
再来看你这绑定

function addEvent(obj,event,fn){
    //1、程序走进这里执行的是obj['bind'+event]
    obj['bind'+event] = obj['bind'+event] || {};
    //2、而程序走到下面这里确执行的是function(){fn.call(obj);}
    //   不应该是执行obj['bind'+event]['bind'+fn]这个吗?
    obj['bind'+event]['bind'+fn] = obj['bind'+event]['bind'+fn] || function(){fn.call(obj);}
    //3、这样写obj['bind'+event]['bind'+fn]是事件吗?
    //   转换过来不是一个复合数组了吗?obj["bindclick","bindchange"];
    obj.attachEvent('on'+event,obj['bind'+event]['bind'+fn]);
}

1 obj['bind'+event] = obj['bind'+event] || {}; 如果 obj['bind'+event]true 那返回的就是 obj['bind'+event] 否则就是 {} 赋值给 obj['bind'+event]
2 和1相同的意思, 不一定必须执行的就是 obj['bind'+event]['bind'+fn]
3 转换过来的并不是一个复合数组, 这也是对象的一种调用方式, 如果 eventClick , fnWhat 相当于调用 obj.bindClick.bindWhat, obj 是个对象, 里面有个 bindClick 这个变量, 这下面又有 bindWhat 这个函数, 把这个函数给 attachEvent 来做 onClick 事件绑定的方法

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号