2009-10-15 14 views
23

私はdoop.phpへのこのajaxコールを持っています。Ajax jquery successスコープ

function doop(){ 
     var old = $(this).siblings('.old').html(); 
     var new = $(this).siblings('.new').val(); 

     $.ajax({ 
      url: 'doop.php', 
      type: 'POST', 
      data: 'before=' + old + '&after=' + new, 
      success: function(resp) { 
       if(resp == 1) { 
        $(this).siblings('.old').html(new); 
       } 
      } 
     }); 

     return false; 
    } 

私の問題は$(this).siblings('.old').html(new);ラインは、行うことになって何やっていないことです。

ありがとう.. すべての有益なコメント/回答が投票されます。

更新:問題の半分はスコープ(私はそれを明確に助け答えてくれてありがとう)だったが、残りの半分は私が同期的にAJAXを使用しようとしているということです表示されます。私は新しい投稿を作成しました

+8

ワウワウワワワワ。 'new'は予約語です:https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Reserved_Words –

+3

新しいことを心配しないでください。コードをもっと分かりやすくするために新しいコードを追加しました – Chris

答えて

24

まずはnewa reserved wordです。その変数の名前を変更する必要があります。あなたの質問に答えるために

、はい、あなたは成功コールバックの外側変数にthisを保存して、あなたの成功のハンドラのコード内でそれを参照する必要があります。

var that = this; 
$.ajax({ 
    // ... 
    success: function(resp) { 
     if(resp == 1) { 
      $(that).siblings('.old').html($new); 
     } 
    } 
}) 

これはclosureと呼ばれています。

+0

うーん、変わったことをやってみましたが、私は 'var saveit = $(this);;を実行しました。私は今これを試してみましょう..また、新しいことについて心配する必要はありません、それは私のコードの中で別のものと呼ばれています。 – Chris

+0

@Chris:re: 'new'、私は多くを考えました。 :) –

+0

@Chris:クロージャが機能しない場合は、 'doop'自体が' this'を参照していることを確認してください。たとえば 'doop()'を呼び出すだけなら 'this'は' window'オブジェクトを指しています。 –

5

thisは、実行機能が適用されたオブジェクトにバインドされています。それは$.ajaxの実装に応じて、(いくつかのAJAXの応答オブジェクト、またはグローバルオブジェクト(window)、または何か他のものである可能性があります。

私は$に入る前に、変数に$(this)をキャプチャする必要がありますか。 ajax呼び出しを呼び出して、$ .ajax呼び出しにパラメータとして渡すか、匿名の成功関数に渡す必要がありますか?問題が解決する場合は、$ .ajax?

に渡します。

関数を定義する前に、thisの値を取得する方法が本当に必要です。これを行う方法はクロージャを作成することです。別の変数を指定します(例: self):

function doop() { 
    var old = $(this).siblings('.old').html(); 
    var new = $(this).siblings('.new').val(); 

    var self = this; 

    $.ajax({ 
     url: 'doop.php', 
     type: 'POST', 
     data: 'before=' + old + '&after=' + new, 
     success: function(resp) { 
      if(resp == 1) { 
       $(self).siblings('.old').html(new); 
      } 
     } 
    }); 

    return false; 
} 

success関数が呼び出されたときselfの値を保持し、あなたが期待どおりに動作しなければなりません。

+0

ありがとう+1。これはcrescentfreshの答えと同じで、 "問題の一部"を解決します。より多くのトラブルシューティングで質問を更新します。 – Chris

46

あなたはhttp://api.jquery.com/jQuery.ajax/

function doop(){ 
    var old = $(this).siblings('.old').html(); 
    var newValue = $(this).siblings('.new').val(); 

    $.ajax({ 
     url: 'doop.php', 
     type: 'POST', 
     context: this, 
     data: 'before=' + old + '&after=' + newValue, 
     success: function(resp) { 
      if(resp == 1) { 
       $(this).siblings('.old').html(newValue); 
      } 
     } 
    }); 

    return false; 
} 

のようにコンテキスト設定を使用する必要があります「これは、」成功のスコープへの転送となり、期待通りに機能します。

+0

あなたは本当に 'new'のような予約語を変数名として使うべきではありません。 – Tomalak

+5

+1これは受け入れられる回答でなければなりません。 – Nick

+0

ニックに同意する - これは正しいアプローチです。複数のボタンの1つがクリックされたときなどに呼び出される関数doopがあると、「別の変数で保存する」アプローチは機能しません。 –

関連する問題