javascript中綁定帶參數的事件響應函數

來源:互聯網
上載者:User

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對象。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.