对象在JavaScript中引用,但在使用事件侦听器时不引用
object in javascript reference by this but not when using event listener
为什么this
没有引用对象,myObject
?
当我这样做时console.log(this)
返回undefined
...为什么?
Javascript:
var myObject = {
product: document.getElementById('product'),
button: document.getElementById('btn'),
productView: function(){
if (this.product.className === 'grid') {
this.product.className = 'list';
} else {
this.product.className = 'grid';
}
},
clickHandler: function(e) {
var o = this;
console.log(this);
o.productView();
e.preventDefault();
},
init: function (){
this.button.addEventListener('click', this.clickHandler, false);
}
};
myObject.init();
演示
非常感谢
事件的处理程序方法中的.this
是指正在单击的对象。使用类似 var self = myObject;
的东西,然后使用 self
而不是 this
。
您需要
将this
绑定到对象的正确上下文。实现此目的的常见方法是将局部this
的引用分配给 init 函数中的另一个变量:
init: function (){
var that = this;
this.button.addEventListener('click', function(e) {that.clickHandler(e)}, false);
}
调用this.clickHandler()
会将this
设置为对象。但是,您只是将函数传递给addEventListener
,浏览器将在调用函数时设置自定义this
值。
如果要绑定当前this
值,请使用 this.clickHandler.bind(this)
。bind
返回的函数也将接收"错误"的this
值,但它使用绑定的、正确的this
值调用clickHandler
。
首先,只需将"this"用于您的点击处理程序...
clickHandler: function(e) {
console.log(this);
this.productView();
e.preventDefault();
}
然后你有几个选择。这里有两个...
选项 A:
init: function (){
var o = this;
this.button.addEventListener('click', function(e){
o.clickHandler(e);
}, false);
}
选项 B:
init: function (){
this.button.addEventListener('click', this.clickHandler.bind(this), false);
}
我问了一个关于这些选项中哪一个是可取的相关问题:什么时候应该使用 JavaScript 引用对象而不是 .bind()?
相关文章:
- Highslide(iframe的侦听器)
- 如何在for循环中添加事件侦听器
- 选项卡侦听器未被来自后台脚本的消息激活
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 加载侦听器上的函数触发得太早
- 无法将事件侦听器附加到画布
- JavaScript在添加侦听器时丢失引用
- 如何从函数引用元素(从事件侦听器调用)
- 对象在JavaScript中引用,但在使用事件侦听器时不引用
- 在侦听器函数 (Javascript) 中调用方法时引用错误
- 将GC清除其侦听器中引用的已移除元素变量
- 与许多事件侦听器和函数引用一个对象相比,什么是更好的方法
- 事件引用在作为方法传递的事件侦听器回调上未定义
- 通过函数引用删除函数中的所有事件侦听器
- Javascript:循环遍历数组以创建侦听器,通过引用和值调用发出问题
- 在没有处理程序引用的情况下覆盖侦听器,是否可以访问Ext.data.store上的(可能是私有的)事件属性
- 如何通过侦听器引用数组中的当前dom元素来更改活动
- 引用事件侦听器中的工具提示,使其在悬停时保持打开状态
- & # 39;这个# 39;在事件侦听器中总是引用相同的对象