2009-05-08 15 views
3

に私はWebサービスへのAJAX要求を行うため、このコードを持っている「この」の値。コールバック関数

handleReceive関数の最初の行に "reqが定義されていません"という問題があります。それは4回呼び出されるので、私は上記のコードがサーバーに要求を送信することを知っています。

どうすればこの問題を解決できますか?

+0

this.responseText .. not this.req.responseText( 'this'はXHRオブジェクトを参照しています) – James

答えて

4

クラシッククロージャー問題。コールバックを取得すると、クロージャは実際には既にHTTPオブジェクトを参照しています。

あなたは、誰かが示唆するように次の操作を行うことができます。

var that = this; 
this.req.onreadystatechange = function() { this.handleReceive.apply(that, []); }; 

か、単に次のようにします。

var that = this; 
this.req.onreadystatechange = function() { that.handleReceive(); }; 
+0

ありがとう!レコードの :作業コードは、次のとおり \t \t handleReceive:関数(){ \t \t \t IF(this.readyState == 4){ \t \t \t \t VAR応答=評価( "(" + this.responseText + ")"); \t \t \t \t alert(response); \t \t \t \t \t} – Tominator

2

あなたはMyCodeでこれに変数参照元をmakeingことにより、これを解決することができます。 Like

var MyCode = { 
    req: new XMLHttpRequest(), // firefox only at the moment 

    self = this 

    ... 
} 

次に、この代わりに自己を参照することができます。

0

変更この:これに

this.req.onreadystatechange = this.handleReceive; 

var self = this; 
this.req.onreadystatechange = function() { self.handleReceive(); } 

これはあなたの問題を解決する必要があるクロージャを作成します。あなたは

var that = this; 
this.req.onreadystatechange = function() { this.handleReceive.apply(that, []); }; 

this.req.onreadystatechange = this.handleReceive; 

を変更することにより、それを動作させることができるはず

0

Function.prototype.applyのは、明示的にthisと関数の引数ながら機能を呼び出すために使用することができます。