Javascript IE8没有得到这个'来自attachEvent

时间:2014-04-26 14:01:15

标签: javascript

这是一个更大类的方法

myMethod.prototype.click=function(func){

 if (window.addEventListener) {
  this.selArray[i].addEventListener('click', func, false);
} else if (window.attachEvent) {
  this.selArray[i].attachEvent('onclick', func);
}


return this;

}

如果我煽动传递这个功能......

myInstance.click(

    function () {
    alert(this.id)
    }
);

...警告' undefined'在IE 8中,但返回在Firefox和Safari中附加click事件的DOM对象的ID。

1 个答案:

答案 0 :(得分:1)

是的,attachEvent并不像addEventListener那样完善。你可以这样做:

if (window.addEventListener) {
  this.selArray[i].addEventListener('click', func, false);
} else if (window.attachEvent) {
  this.selArray[i].attachEvent('onclick', func.bind(this.selArray[i]));
}

使用Function#bind确保this是您要挂钩事件的元素。您必须在旧浏览器(如IE8)上填充/填充Function#bind,搜索“es5 shim”以获取选项。

或者,如果您不想使用Function#bind,请在调用click时使用闭包:

myMethod.prototype.click=function(func){
    var elm = this.selArray[i];
    if (window.addEventListener) {
      elm.addEventListener('click', func, false);
    } else if (window.attachEvent) {
      elm.attachEvent('onclick', function(e) {
        return func.call(elm, e || window.event);
      });
    }

    return this;
}

附注:仅提供attachEvent的浏览器在事件对象上也没有preventDefaultstopPropagation彻底填充程序(例如jQuery或PrototypeJS或其他各种库中的填充程序)添加了这些填充程序。相当于preventDefaulte.returnValue = false;;等同于stopPropagation的是e.cancelBubble = true;