IE 8 EventUtil 实现this问题


    function handler(){
        alert(this.id);
    }
    var EventUtil = {
        addHandler: function(element, type, handler){
            if(element.addEventListener){
                element.addEventListener(type, h, false);
            }else if(element.attachEvent){
                element.attachEvent.apply("on"+type, h);
            }else{
                element["on"+type] = h;
            }
        },
        removeHandler: function(element, type, handler){
            if(element.removeEventListener){
                element.removeEventListener(type, h, false)
            }else if(element.detachEvent){
                element.detachEvent("on"+type, h);
            }else{
                element["on"+type] = null;
            }
        }

    };

对于这个问题, this指向的是window ,  这里需要通过call和apply 绑定handler

unction (element, type, handler) {
var h = function (){
  return handler.apply(element, arguments);
};

若还要移除,就用你以前的实现,然后每次注册事件处理器时,绑定他:


function fBindThis(a_This, a_fTarget) {
  return function() { return a_fTarget.apply(a_This, arguments); };
}


用的时候:
var h = fBindThis(elem, 你原来的事件处理器);
EventUtil.addHandler(elem, "click", h);
EventUtil.removeHandler(elem, "click", h);



你要是对局部变量h的使用不满意,可以把h存到elem上,但是,这么做你必须非常小心,要把名字起得特殊点,一定要避免与浏览器定义的名称冲突。


当需要在元素上簿记时,我一般这么做:
elem.App_Data = elem.App_Data || {}; // 把所有应用程序的数据放到这个对象里
elem.App_Data.onclick = fBindThis(elem, 你原来的事件处理器); // 绑定this
EventUtil.addHandler(elem, "click", elem.App_Data.onclick); // 注册
EventUtil.removeHandler(elem, "click", elem.App_Data.onclick); // 注销


我的程序需要的一切和elem相关的数据,都存入elem.App_Data,这可以最大程度的避免名称冲突。注意第一行的写法,elem.App_Data可能已经创建过了,所以用逻辑或运算,避免覆盖掉之前的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值