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.onmouseover=bind(col,mouseover,col);
col.onmouseover=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對象。