2010-06-10 23 views
0

下面的代码不工作,我凭直觉就想到:的jQuery/JavaScript事件 - 原型事件处理

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()将被称为(和,如果没发生,那在_foo()this变量是为MyObject的一个实例。

有谁知道为什么这不适合传递对象与事件处理工作,以及任何其他模式?

感谢您阅读ING。

布赖恩

+0

在jQuery中有一些附加事件('bind()','live()')和触发事件('trigger()')的方法。我不确定你在这里得到什么。另外,在我看来,如果你想调用一个对象方法,你需要调用它像'this._foo()'而不是'this._foo',否则你正在做任务。这完全有可能我误解了你。 – artlung 2010-06-10 22:12:04

+0

可能重复的[如何访问正确的\'this \'/ context在回调?](http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside -a-callback) – Bergi 2014-02-27 18:59:53

+0

谢谢Bergi。在这个关闭的三年之后,被引用的问题被问到了,那么重复会不会真的走向另一个方向?将这个问题标记为“已经回答”了三年后出现的问题是错误的,并且似乎具有误导性。这个问题不是这个问题的重复吗? – 2014-02-27 19:18:52

回答

4

正如Kenny指出你错过了new。您还需要确保在this_fooMyObject实例
一种方式做到这一点: -

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 你无法避免离开它使用new操作符! :)

2

使用JavaScript创建对象,请使用new

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

正如道格拉斯克罗克福德所建议的,我一直在试图避免使用'new',但是您至少在代码中指出这一个错误是正确的。 :) – 2010-06-10 21:34:38

+0

@Brian:如果不使用'new','MyObject'内的'this'指向'window',而不是'MyObject'的“实例”。我把“instance”放在引号内,因为不想使用'new',你永远不会创建任何东西的实例。 – Matt 2010-06-10 22:10:59

1

这个问题现在有点老了,但还有另一种解决方案。您的问题与上文提到的一样,您错过了“新建”,并且事件处理程序中的“this”引用始终是触发事件的元素,而不是处理事件的对象。

由于您使用的是JQuery,因此有一种简单的方法可以按照您的要求进行操作。使用JQuery.proxy method设置事件处理程序的上下文,以便将对象用作“this”。在你的榜样,你只需要更改线路

input.change(this._foo); 

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

给一个尝试,如果你遇到这个问题与jQuery一次。