Javascript:当事件处理程序是对象的多个实例时,如何从事件处理程序中获得正确的对象实例
Javascript: How to get the right instance of an object from an event handler when their are multiple instances of the object
我创建了一个对象,当我有一个对象实例时,它的工作效果很好。这不是实际的Object,但概念是一样的。
function foo(name){
this.name = name;
}
foo.prototype.CreateElement = function(){
var newElement = document.createElement("a");
that = this;
newElement.onclick = function(){
that.SayName(this);
};
document.getElementsByName("body")[0].appendChild(newElement);
}
foo.prototype.SayName = function(LinkObj){
alert(this.name);
LinkObj.href = "http://google.com";
}
有人告诉我,通过将this
的实例保存到一个变量(在本例中为that
),我仍然可以获得对SayName
方法的正确对象实例的引用。这将使this
表示从onclick
传入的元素的实例。这一切似乎只适用于一个实例,但当我创建对象的多个实例时,最后一个实例就是onclick
事件中提供的实例。
我初始化了两个类似的对象
var ObjOne = new foo("Ted");
ObjOne.CreateElement();
var ObjTwo = new foo("Steve");
ObjTwo.CreateElement();
当onclick
为ObjOne
触发时,我得到了ObjTwo
的对象实例,因此this.Name
被设置为Steve
。
有人知道当onclick事件从各种实例中触发时,我如何获得正确的对象实例吗?我想我需要将正确的实例与call
绑定,但我真的不确定如何绑定。
提前感谢,希望这不会让人困惑。
问题是这一行:
that = this;
您在未使用var
的情况下声明了that
,这意味着它是全局,即您的所有实例都在更新相同的全局that
变量。改为:
var that = this;
则that
将是每个的本地。(也就是说,CreateElement函数的每个闭包都是本地的。)
演示:http://jsfiddle.net/SEsLJ/
此外,document.getElementsByName
应该是document.getElementsByTagName
(假设您实际上没有给body一个等于"body"的name属性)。
相关文章:
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- Meteor应用程序无法运行-对象#<编译器>没有方法'主机'
- Windows 8 Javascript应用程序XML对象
- getSript在同一对象上多次添加处理程序
- 在这个使用hasOwnProperty的对象扩展程序中有一个错误,I'我不确定那个bug是什么,也不确定这个扩展
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 读取在具有IE的工作程序中生成的对象URL
- JavaScript1.7区分数组和对象的迭代程序
- 为什么Javascript程序员更喜欢在代码中重复字符串作为常量,而不是使用枚举类型的对象
- 扩展引导程序的typeahead以便获取对象而不是字符串
- 向调用全局javascript函数的对象添加处理程序
- 动态添加对象的jQuery事件处理程序
- 如何打开文件对象(HTML)并在谷歌应用程序脚本中解析它
- 如何在事件处理程序中获取 javascript 事件对象
- 如何将事件处理程序存储在变量中,并在以后将其绑定到对象
- 使用 Jasmine 测试对象中的事件处理程序
- 在帮助程序处获取对象值的车把,无需使用数据进行编译
- 谷歌应用程序脚本-正在尝试使用getUrl.TypeError:在对象工作表中找不到函数getUrl
- 我怎么能在IONIC应用程序中使用Json对象而不是硬编码对象呢
- 如何将php/ajax-req制作成面向对象程序