js addEventListener attachEvent用法

路过http://tieba.baidu.com/f?kz=1059891418,发现个事件绑定js很精简,特记录下

<script>
function bind(o,e,f){
   var g=function(){f.apply(o,arguments)},
   k="__"+e;o[k]=o[k]||[],o[k][f]=g;
   !-[1,]?o.attachEvent("on"+e,g)
   :o.addEventListener(e,g,0);
};

function unbind(o,e,f){
   var k="__"+e,g;o[k]=o[k]||[],g=o[k][f];
   !-[1,]?o.detachEvent("on"+e,g)
   :o.remvoeEventListener(e,g,0||false);
   delete g;
};

bind(document,"click",function(e){
   var o=e.target||e.srcElement;
   alert(o.tagName);
});
</script>
JavaScript

解释:k="__"+e;o[k]=o[k]||[],o[k][f]=g;

元素["__"+事件名][函数代码]=函数指针;这样就把一个函数以事件名和函数代码为索引保存在了元素里,"__"存在的目的只是为了让它不与元素的默认方法冲突

!-[1,]//判断是否IE浏览器

[1,]这个残缺的数组对IE而言是数组,而对其他浏览器而言是这个只是一个数字,前面的负号把这个强制转换成了数值型,而在IE中它不是一个数字因此是NaN,在其他浏览器中就是0-1也就是-1,-1实际上就是true的原型,然后再经过布尔运算-1变成false,NaN变成true

实际上[1,]在转换成数值型的时候中间还有一个转换成字符型的过程,它调用的自己的默认方法toString,因此第一次返回的分别是一个字符型的"1"和字符型的"1,"

原文地址:https://www.cnblogs.com/knightyj/p/3471586.html