2009-10-15 8 views
23

Ich habe diesen Ajax Anruf an eine doop.php.Ajax jquery Erfolgsumfang

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; 
    } 

Mein Problem ist, dass die $(this).siblings('.old').html(new); Linie nicht das tut, was es tun soll.

danke .. alle hilfreichen Kommentare/Antworten sind abgestimmt.

Update: es scheint, dass die Hälfte des Problems war der Umfang (danke für die Antworten, die mir geholfen, das zu klären), aber die andere Hälfte ist, dass ich versuche, Ajax in einer synchronen Weise zu verwenden. Ich habe einen neuen Beitrag erstellt

+8

Whoa whoa whoa whoa. 'new' ist ein reserviertes Wort: https://developer.mozilla.org/de/Core_JavaScript_1.5_Reference/Reserved_Words –

+3

Mach dir keine Sorgen um neue, es heißt etwas anderes in meinem Code. Ich nannte es einfach neu, um den Code für euch verständlicher zu machen. – Chris

Antwort

24

Zuerst new ist a reserved word. Sie müssen diese Variable umbenennen.

Ihre Frage zu beantworten, ja, müssen Sie this in einer Variablen außerhalb des Erfolgs Rückruf speichern, und verweisen Sie in Ihrem Erfolg Handler-Code:

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

Dies ist ein closure genannt wird.

+0

Hmm, komisch, ich habe etwas versucht, was dem sehr ähnlich ist, aber du hast 'var saveit = $ (this);' hat nicht funktioniert. Ich werde das jetzt versuchen. Mach dir auch keine Sorgen um Neues, es heißt etwas anderes in meinem Code. – Chris

+0

@Chris: re: 'new', dachte ich mir genauso. :) –

+0

@Chris: Re die Schließung funktioniert nicht, stellen Sie sicher, "Doop" bezieht sich selbst auf die erwartete "this". Wenn Sie zum Beispiel 'doop()' aufrufen, zeigt 'this 'nur auf das' window' Objekt. –

5

this ist an das Objekt gebunden, auf das die ausführende Funktion angewendet wurde. Das könnte einige AJAX-Antwort-Objekt oder das globale Objekt sein (window), oder etwas anderes (abhängig von der Implementierung von $.ajax.

Muss ich $ (this) in eine Variable erfassen, bevor die $ eingeben. Ajax-Aufruf, und dann übergeben Sie es als Parameter an den $ .ajax Aufruf? Oder muss ich es an die anonyme Erfolgsfunktion weitergeben? Wenn das das Problem lösen wird, wo übergebe ich es an die $ .ajax?

Sie brauchen in der Tat eine Möglichkeit, den Wert von this vor Festlegung der success Funktion zu erfassen. einen Verschluss Erstellen der Art und Weise, dies zu tun ist. Sie müssen sich d efine eine separate Variable (z.B. 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; 
} 

Die success Funktion den Wert von self beibehalten, wenn sie aufgerufen wird, und sollte so tun, als Sie erwartet haben.

+0

Danke +1. Dies ist das gleiche wie die Antwort von crescentfresh und es löst "einen Teil des Problems" .. wird die Frage mit mehr Fehlersuche aktualisieren. – Chris

46

Sie sollen die Einstellung Kontext verwenden, wie in 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; 
} 

„this“ Transfer zum Erfolg Umfang sein wird und wie erwartet verhalten.

+0

Sie sollten reservierte Wörter wie 'new' nicht als Variablennamen verwenden. – Tomalak

+5

+1 Dies sollte die akzeptierte Antwort sein. – Nick

+0

Einverständnis mit Nick - das ist der richtige Ansatz. Beachten Sie, dass der Ansatz "in einer anderen Variablen speichern" nicht funktioniert, wenn Sie die Funktion "doop" aufrufen, wenn Sie auf eine der Schaltflächen klicken oder eine andere solche Duplizierung. –