簡體   English   中英

附加一個onchange對象是一個閉包嗎?

[英]Is attaching an onchange object a closure?

我先前在這里這里這里搜索過SO帖子,但對我來說無法回答。 這應該是一個基本問題,但我不理解我發現的帖子。 他們似乎沒有使用參數解決。

我想以編程方式添加帶有onchange事件的輸入,這樣最終結果如下:

 <input type="button" onchange="handleButtonOnChange(this)">ClickMe</input>

我正在研究一個在舊的Delphi應用程序中使用嵌入式IE6瀏覽器的項目,所以我必須有一個IE6兼容的解決方案(是的,IE6很糟糕,但有理由我暫時堅持使用它)。

我最初的嘗試是這樣的:

var DaySelect = document.createElement("select");
DaySelect.id = ParentID+"-day";
DaySelect.disabled = true;
MonthSelect.onchange="handleDayChange(this);"  //<--- not correct
Parent.appendChild(DaySelect);

然后我讀到.onchange應該被分配一個對象,而不是一個字符串,並且應該使用它:

MonthSelect.onchange=handleDayChange;  //<--- '(this)' removed

但在我看來,這將導致這個元素(注意缺少這個參數)

 <input type="button" onchange="handleButtonOnChange">ClickMe</input>

如果我使用下面的行,而不是這將成為一個閉包,'this'將引用該對象被分配給.onchange屬性時的事件,而不是當時的事件。改變事件?

//Does the line below make a closure?  
MonthSelect.onchange=handleDayChange(this);  //<-- What does 'this' refer to?

我是一個相對較新的網絡程序員,但長期以來德爾福程序員。 關閉仍然讓我頭疼。 我很感激任何幫助。

另外,我在這里閱讀有關使用addEventListener以及舊版IE的問題,並且頁面上的最后一篇文章提供了解決方法。 但我不明白它是如何工作的。

編輯 - 那么傳遞其他參數呢? 似乎許多事件處理程序需要具有特定於附加元素的參數。 似乎無法添加具有任何參數的偵聽器。

如果您在JS中創建元素,則顯示一個簡單的閉包:

var DaySelect = document.createElement("select");
DaySelect.id = ParentID+"-day";
DaySelect.disabled = true;
MonthSelect.onchange=function(){handleDayChange(DaySelect);};
Parent.appendChild(DaySelect);

由於函數是在創建元素的范圍內創建的,因此可以使用相同的變量。

編輯:

可以使用此方法傳遞其他參數,例如,我們創建並附加的匿名函數,因為處理程序仍將向其發送事件對象:

function(e){handleDayChange(DaySelect, e);};

在事件對象中,您將可以訪問事件目標,但在您的示例中,事件目標和“this”不是同一個元素,因此處理程序無法知道DaySelect元素。

jQuery使得很多事件處理變得更加簡單,這是許多人使用它的原因之一,它還使各種瀏覽器之間的方法規范化,因此您不必編寫相同代碼的多個版本(在大多數情況下)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM