[英]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.