Javascript IE8没有得到';这';来自attachEvent
这是一个更大类的方法Javascript IE8没有得到';这';来自attachEvent,javascript,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; } 如果我
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)
}
);
…在IE 8中发出“未定义”警报,但返回在Firefox和Safari中单击事件附加到的DOM对象的ID。对,
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]));
}
它使用函数#bind
来确保此
是挂接事件的元素。在较旧的浏览器(如IE8)上,必须使用shim/polyfill函数#bind
,搜索“es5 shim”中的选项
或者,如果您不想使用函数#bind
,请在调用时使用闭包,然后单击:
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
的浏览器在事件对象上也没有preventDefault
或stopPropagation
。一个彻底的垫片(比如jQuery、PrototypeJS或其他各种库中的垫片)会添加这些内容。preventDefault
的等价物是e.returnValue=false代码>;stopPropagation
的等效值为e.cancelBubble=true代码>好吧,那么IE8&9就不需要这些了?@user1209203:IE8需要。IE9及以上版本不支持,因为它们提供了addEventListener
。好的,谢谢您的帮助,我可能会让IE8用户升级他们的浏览器。@user1209203:由您决定。首先,我可能会检查一下你的站点统计数据,因为一般统计数据显示IE8仍然有6%(statcounter)到21%(net applications)的全局浏览器用户。。。但和往常一样,重要的是你自己网站的统计数据。我的意思是,这是浏览器最微不足道的差异之一,需要处理…:-)