2013-06-28 63 views
2

我有一个对象。它初始化一个按钮以提醒“你好!”当它被点击时。为什么这不工作?jQuery使用对象的方法作为事件处理程序

的jsfiddle:http://jsfiddle.net/kUT52/1/

HTML

<button>Test</button> 

JS

var MyObject = { 
    testValue: "Hello!", 

    testFunction: function() { 
    alert(this.testValue); 
    }, 

    init: function(button) { 
    button.click(this.testFunction()); 
    } 
} 

$(document).ready(function(){ 
    var buttonInstance = new MyObject(); 
    var button = $('button'); 
    buttonInstance.init(button); 
}); 
+3

您的代码是没有意义的!你不能像这样初始化一个新的对象字面值。如果你想使用'new'并把它看作“构造函数”,你必须使'MyObject'成为一个函数。否则,'MyObject'是一个对象字面值,你可以静态地访问它 - 'MyObject.testValue' – Ian

+0

头脑风暴@Ian。这使得js对象更有意义,谢谢。 –

回答

10

每当你把()后面一个函数引用,你是执行功能。您必须将函数引用传递给.click,而不是函数返回的内容(除非函数返回要用作事件处理函数的函数)。

例子:

button.click(this.testFunction); 

但现在你有另一个问题:在函数内部,this将参考的DOM元素,而不是对象,所以访问this.testValue将返回undefined

您可以使用jQuery的$.proxy功能来解决这个问题:

button.click($.proxy(this.testFunction, this)); 

现在this将参照对象,你可以通过event.target得到所点击的元素的引用。

1

这是一个对象字面,你通常会使用它像这样:

var MyObject = { 
    testValue: "Hello!", 

    testFunction: function() { 
     alert(MyObject.testValue); 
    }, 

    init: function(button) { 
     button.on('click', this.testFunction); 
    } 
} 

var button = $('button'); 
MyObject.init(button); 

FIDDLE

或传递对象:

var MyObject = { 
    testValue: "Hello!", 

    testFunction: function(e) { 
     alert(e.data.obj.testValue); 
    }, 

    init: function(button) { 
     button.on('click', {obj: this}, this.testFunction); 
    } 
} 

var button = $('button'); 
MyObject.init(button); 

FIDDLE

+0

它得到了警报工作,但仍然警告“未定义”:P –

+0

@DonnyP - 没有注意到!这是因为wintin testFunction的作用域,当这种方式被调用时,这个按钮就是按钮,而不是对象。您必须直接引用该对象,或将'this'作为参数传递。 – adeneo

4

有两个原因:

  • 您正在使用的testFunction()代替testFunction在绑定的事件,所以你会调用该函数并绑定(不确定)的返回值。

  • 当您使用方法作为函数时,它不再附加到对象,因此在调用回调时上下文不会是对象,而是全局的window对象。

使用proxy方法,使与正确的上下文中调用该方法的函数:

button.click($.proxy(this.testFunction, this)); 
+0

感谢Guffa,是否可以使用.bind(this)而不是$ .proxy()? –

+0

@DonnyP是的,他们完成同样的事情 – Ian

+0

@DonnyP:是的,但是这并不适用于所有浏览器。这就是为什么'代理'在那里。 – Guffa

相关问题