您的位置:首页 > Web前端 > JavaScript

javascript中绑定带参数的事件响应函数

2012-06-02 14:05 260 查看
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对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: