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可能已经创建过了,所以用逻辑或运算,避免覆盖掉之前的。