function addEventHandler(oTarget, sEventType, fnHandler) {
if (oTarget.addEventListener) { //兼容Mozilla
oTarget.addEventListener(sEventType, fnHandler, false);
} else if (oTarget.attachEvent) {
oTarget.attachEvent("on" + sEventType, fnHandler);
} else {
oTarget["on" + sEventType] = fnHandler;
}
};
/*
* 获得带参数的事件句柄的引用
*
* @param obj 需要绑定事件处理函数的所有者,null 表示 window 对象
* @param func 需要绑定的事件处理函数名
* @param ... 第三个参数开始为绑定事件处理函数的参数,由 0 到多个构成
*/
function bind(obj, handler) {
obj = obj || window;
var args = [];
for(var i =2; i < arguments.length; i++)
{
args.push(arguments[i]);
}
return function() { handler.apply(obj, args) };
};
//采用2级事件模型的方式给响应函数传参数。
addEventHandler(col, "mouseover", bind(col, mouseover, col));
//JavaScript事件属性的方式
col.οnmοuseοver=bind(col,mouseover,col);
col.οnmοuseοver=function(){this.className="mouseover";}
不能用这种:
addEventHandler(col, "mouseover", function(){this.className="mouseover"});
这个中间的this已经不是col了。需要把,这个col对象传递给响应函数。
像下面这样:
addEventHandler(col, "mouseover", bind(col, mouseover, col));
var mouseover = function (obj) {
obj.className = "mouseover";
}
//这样呢?
addEventHandler(col, "mouseover", myCal.mouseover));
mouserover:function(){
this.className="mouseover";
}
当事件发生时,这个this是window对象,而不是myCal对象,也一定是事件源对象。所以也不行!!
注意:addEventHandler(myCal.relation, "focus", myCal.Show) 相当于addEventHandler(myCal.relation, "focus", function(){myCal.Show();})
这样绑定后,当事件产生时,
myCal.Show()中的this将不再表示的是myCal这个对象,而是window对象。
myCal.show(){
this
}
但是如果用这种方式:
idCalendarNext.onclick = function () { myCal.NextMonth() };
myCal.NextMonth(){
this
}中的this还是表示myCal对象。