路过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>
解释: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,"