【问题标题】:Is attaching an onchange object a closure?附加一个 onchange 对象是一个闭包吗?
【发布时间】:2016-04-19 02:59:38
【问题描述】:

我搜索过之前的 SO 帖子 hereherehere,但找不到对我有意义的答案。这应该是一个基本问题,但我不理解我找到的帖子。他们似乎没有使用 this 参数来解决。

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

但在我看来,这会导致这个元素(注意缺少 this 参数)

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

如果我使用下面的行,那么 this 不会关闭,并且“this”将引用对象分配给 .onchange 属性时的事件,而不是在更改事件的时间?

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

我是一个相对较新的 Web 程序员,但长期从事 Delphi 程序员。关闭仍然让我头疼。感谢您在这方面的任何帮助。

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

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

【问题讨论】:

  • 在你的例子中“this”应该指向输入元素吗?
  • 我希望能够让多个元素使用同一个 javascript 处理程序。所以我的想法是处理程序需要传递创建事件的元素。所以是的,“this”将是发起调用的元素。
  • 在您上一个代码/评论问题中,this 指的是全局 window 对象(如果从全局 js 上下文调用)。同样在该代码行中,您将属性分配给函数的返回值,而不是函数本身。您正在那里调用该函数。
  • MonthSelect.onchange="handleDayChange(this);"DaySelect.onchange="handleDayChange(this);" ?
  • @JuanMendes 你是对的。那是一个让我感到困惑的错误。就在我读到你的帖子之前,我抓住了它。我应该早点回来检查。谢谢!

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


【解决方案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 元素。

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

【讨论】:

  • 我会试试这个并回帖。顺便说一句,如果我没有明确传递,被调用的处理程序是否可以使用“this”对象? IE。它是否以某种方式在全球范围内?
  • 调用者(浏览器)将this 设置为在调用处理程序时注册事件的元素。有点像:'myDiv.handler.call(myDiv, event)'
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多