这是一个更大类的方法
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。
答案 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
的浏览器在事件对象上也没有preventDefault
或stopPropagation
。 彻底填充程序(例如jQuery或PrototypeJS或其他各种库中的填充程序)添加了这些填充程序。相当于preventDefault
是e.returnValue = false;
;等同于stopPropagation
的是e.cancelBubble = true;
。