jQuery / javascript事件 - 原型事件处理程序

时间:2010-06-10 21:12:59

标签: javascript jquery prototype object closures

以下代码无效,因为我直观地预期:

function MyObject(input) {
   input.change(this._foo);
   this.X = undefined;
}

MyObject.prototype._foo = function() {
   alert("This code is never called");
   // but if it did
   this.X = true;
}

var test_input = $("input#xyz"); // a random, existing input

var m = MyObject(test_input); // attach handler (or try to)

test_input.change(); // trigger event

alert(m.X); // undefined

我希望调用_foo()(如果发生这种情况,this中的_foo()变量将是MyObject的实例化。

有谁知道为什么这不起作用,以及将对象传递给事件处理程序的任何替代模式?

感谢您的阅读。

布赖恩

3 个答案:

答案 0 :(得分:4)

正如Kenny所指出的,你错过了new。您还需要确保this中的_foo引用MyObject实例
一种方法: -

function MyObject( input ) {
    var _this = this;
    input.change( function() {
       // explicitly set the `this` in _foo to `_this`
        _this._foo.call( _this );
    });
   this.X = undefined;
}

MyObject.prototype._foo = function( event ) {
   alert("This is called");
   // and 'this', being 'm', has X set to true
   this.X = true;
   // the textbox must be accessed by 'event.target' not 'this' if you need it
}

var test_input = jQuery("input#xyz"); // a random, existing input

var m = new MyObject(test_input); // attach handler (or try to)

test_input.change(); // trigger event

alert(m.X); // true

P.S 将它遗弃,你无法避免使用新的操作符! :)

答案 1 :(得分:2)

要在Javascript中创建对象,请使用new

var m = new MyObject(test_input); // attach handler (or try to)

答案 2 :(得分:1)

这个问题现在有点老了,但还有另一个解决方案。您的问题就像我提到的那样,您错过了'new',并且事件处理程序中的'this'引用将始终是触发事件的元素,而不是处理事件的对象。

由于您正在使用JQuery,因此有一种简单的方法可以让您按照自己的方式行事。使用JQuery.proxy method设置事件处理程序的上下文,将对象用作“this”。在您的示例中,您只需要更改行

input.change(this._foo);

input.change(jQuery.proxy( this, "_foo" )); 

如果再次遇到JQuery的这个问题,请尝试一下。