附加一个onchange对象是一个闭包吗?

时间:2016-01-13 22:45:04

标签: javascript html internet-explorer-6 onchange createelement

我之前搜索了过去的帖子hereherehere,并且无法找到对我有用的答案。这应该是一个基本问题,但我不理解我发现的帖子。他们似乎没有使用这个参数解决问题。

我想以编程方式添加带有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>

如果我使用下面这一行,相反,我们不会打算关闭,而这个&#39;这个&#39;将对象分配给.onchange属性时引用事件,而不是更改事件时的事件?

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

我是一个相对较新的网络程序员,但是长期以来德尔福程序员。关闭仍然让我头疼。我很感激你的帮助。

另外,我阅读here关于使用addEventListener和旧版本IE的问题,并且页面上的最后一篇文章提供了解决方法。但我不明白它是如何运作的。

编辑 - 那么传递其他参数怎么样?似乎许多事件处理程序需要具有特定于附加元素的参数。似乎无法添加具有任何参数的侦听器。

1 个答案:

答案 0 :(得分:1)

如果您在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元素。 / p>

jQuery使得很多事件处理变得更加简单,这是许多人使用它的原因之一,它还使各种浏览器之间的方法规范化,因此您不必编写相同代码的多个版本(在大多数情况下)