Javascript 类变量在元素事件中不可见?
我希望创建一个web应用程序,这意味着HTML元素必须是非常动态的,因为它们将被创建,并由不同的其他元素处理。 因此,我决定使用类——非常成功,直到处理事件的时候。Chrome告诉我,这是一个可疑的类,它将它与未定义的变量混淆Javascript 类变量在元素事件中不可见?,javascript,html,class,user-interface,visibility,Javascript,Html,Class,User Interface,Visibility,我希望创建一个web应用程序,这意味着HTML元素必须是非常动态的,因为它们将被创建,并由不同的其他元素处理。 因此,我决定使用类——非常成功,直到处理事件的时候。Chrome告诉我,这是一个可疑的类,它将它与未定义的变量混淆 function SpanInputPair(element) { span = document.createElement("span"); this.Span = getNextInputID(); span.style.display =
function SpanInputPair(element) {
span = document.createElement("span");
this.Span = getNextInputID();
span.style.display = "none";
span.id = this.Span;
element.appendChild(span);
input = document.createElement("input");
input.type = "text";
this.Input = getNextInputID(); // request a new ID for this element and save into this class
input.id = this.Input; // Attach it onto the element for future finding :/ (slow)
element.appendChild(input);
input.focus();
span.onclick = function() {
var input = getInput(this.Input); // this.Input cannot be seen?
var span = getInput(this.Span);
input.value = span.innerHTML;
toggleDisplay(input);
toggleDisplay(span);
input.focus();
}
input.onblur...
行“var input=getInput(this.input);”是问题所在,因为Chrome告诉我它不再看到“this.input”。我知道这一点,因为我可以运行这一行,用实际值替换“this.Input”,它返回元素fine。
正如您所看到的,我创建了一个文本框,动态地跨越并设置它们的ID以供将来使用,这是因为我以前试图将元素本身保存在类中,并在事件中使用它-同样的问题,所以我尝试使用document.getElementByID()在每个事件的文档中查找它。
奇怪的是,它似乎没有关注它刚刚创建的文本框(如果这也可能是问题的一部分,我不知道)。
这个项目完全是从零开始创建的,没有使用任何库。
所以我的问题是,你能解释一下为什么元素的事件在创建它的类中看不到任何变量吗?我怎样才能解决这个问题
我还没有看到这篇文章,因为许多人正在使用JQuery之类的库和/或不使用类,问题是特定于借助类的内部变量进行事件处理的。单击函数中的“this”值是单击的元素。这里就是您刚刚创建的
在定义click函数时,您需要返回此函数的值。(问题也可能是:当<代码> SpjnPutoPux/Cux>函数被调用时,‘这个’的值是什么?您可能想考虑一下。”
您可以这样做,将其添加到闭包中:
var thisInput = this.Input;
...
span.onclick = function() {
var input = getInput(thisInput);
下一行的
this.Span将出现同样的问题。单击函数中的'this'值是单击的元素。这里就是您刚刚创建的
在定义click函数时,您需要返回此函数的值。(问题也可能是:当<代码> SpjnPutoPux/Cux>函数被调用时,‘这个’的值是什么?您可能想考虑一下。”
您可以这样做,将其添加到闭包中:
var thisInput = this.Input;
...
span.onclick = function() {
var input = getInput(thisInput);
下一行的this.Span也会有同样的问题。虽然它可能没有太多意义,但在JavaScript中是正常的,因为它的值在您声明的本地函数中已更改。因此,您必须正确理解如何在JavaScript中声明和使用函数:
JavaScript中的函数有一个称为上下文的东西,这意味着每个函数都绑定到一个特定的对象。如果我们在脚本中声明一个函数,它将绑定到全局对象(浏览器中的窗口)
但是,如果我们试图声明一个方法(属于对象的函数),
这将是一个代表对象本身的神奇变量。每次调用this.my_属性
,都会得到对象属性的值,即“属性”或“方法”
因此,函数的上下文可以更改,就像事件处理程序一样。在您的场景中,事件处理程序是上下文已更改的函数,因此每次您访问它时,它的值将是当您单击它时接收事件的HtmleElement对象
为了解决这个问题,您可以声明一个辅助变量并在处理程序内部使用它。社区的普遍做法是:
var that = this; // Also, the people use 'self' instead of 'that'
span.onclick = function() {
var input = that.input;
// ...
};
使用此解决方法,您不会有任何问题。尽管它可能没有太多意义,但在JavaScript中这是正常的,因为它的值在您声明的本地函数中已更改。因此,您必须正确理解如何在JavaScript中声明和使用函数:
JavaScript中的函数有一个称为上下文的东西,这意味着每个函数都绑定到一个特定的对象。如果我们在脚本中声明一个函数,它将绑定到全局对象(浏览器中的窗口)
但是,如果我们试图声明一个方法(属于对象的函数),
这将是一个代表对象本身的神奇变量。每次调用this.my_属性
,都会得到对象属性的值,即“属性”或“方法”
因此,函数的上下文可以更改,就像事件处理程序一样。在您的场景中,事件处理程序是上下文已更改的函数,因此每次您访问它时,它的值将是当您单击它时接收事件的HtmleElement对象
为了解决这个问题,您可以声明一个辅助变量并在处理程序内部使用它。社区的普遍做法是:
var that = this; // Also, the people use 'self' instead of 'that'
span.onclick = function() {
var input = that.input;
// ...
};
使用此解决方法,您不会有任何问题。此值将是span
元素,而不是窗口。没错,这是一个很大的错误。感谢大家对函数如何创建自己的“this”进行了深入的解释,这确实很有意义,因为我首先将函数用作类。然而,现在存储在该类中的span和input元素被SpanInputPair的每个新实例覆盖,导致输入和span不是基于实例的。。这是否意味着我需要使用“this”?@LeeAllan如果它们是基于实例的,代码是正确的。但如果它们是基于类的,则必须将这些值存储在SpanInputPair的原型中。因此,您必须执行以下操作: