2009-06-15 1 views
4

Ich habe dynamicaly hinzugefügt Eingabefelder wie diese:Wie aktualisiert man den Stil nach dem Ajax-Aufruf in jQuery?

<input id="person__1_badge_number" class="number" type="text" size="12" name="person[][1][badge][number]"/> 

Und wenn ich dieses Feld hinzufügen nenne ich fallowing Funktion:

function please_rebind() { 
    $('.number').bind("change", function() { 
    $.post('/registration/sell/check_badge_number', { number: $(this).val() }, 
    function(data) { 
     $(this).addClass('make_it_red'); 
     alert(data); 
    }, "html"); 
}); 
} 

Und es nicht hinzu, ‚make_it_red‘ Klasse meines Eingang Feld (Ich habe auch versucht, html ('foo') und andere Sachen und es funktioniert auch nicht). Ich denke, es ist, weil ich $ (this) innerhalb anderer Funktionen laufen lasse, aber ich weiß nicht, was ich damit machen soll. $ (this) .val() funktioniert und ich bekomme auch korrekte Antwort (Alarm (Daten)). Kann jemand helfen?

Antwort

6

Ich denke, was passiert ist, dass nach dem Rückruf, der Verweis auf $ (this) ist verloren. Versuchen Sie es so:

function please_rebind() { 
    $('.number').bind("change", function() { 
    var that = $(this); 
    $.post('/registration/sell/check_badge_number', { number: $(this).val() }, 
    function(data) { 
     that.addClass('make_it_red');   
    }, "html"); 
}); 
} 
+0

wollte nur hinzufügen, dass "dies" innerhalb der Rückruf für $ .post bezieht sich auf die Optionen für die angegebene Ajax-Anfrage. – ayaz

+0

Dies ist einer der wiederkehrenden Dornen in JS, die Volatilität von 'this'. Denken Sie daran, diesen Trick zu verwenden, wenn Sie einen Rückruf definieren. Natürlich macht dies die Funktion zu einer vollständigen Schließung, was von IE-Entwicklern leistungsmäßig als "schlechte Praxis" angesehen wird. Sie ziehen es vor, JScript in diesen Fällen nicht performant zu halten. – Javier

2

Sie können das Element von ID-Referenz:

$('#person__1_badge_number').addClass('make_it_red'); 

Auch hängt es davon ab, wie Sie das Element dynamisch eingefügt haben, wenn Sie es gerade als String zu einem gewissen div angehängt, zum Beispiel, kann es nicht an das DOM gebunden sein.

EDIT: Sie können die Element-ID erhalten aus der Bindung, und bauen die Wähler innerhalb der Callback:

function please_rebind() { 
    $('.number').bind("change", function() { 
    var elementId = this.id; 
    $.post('/registration/sell/check_badge_number', { number: $(this).val() }, 
    function(data) { 
     $('#' + elementId).addClass('make_it_red'); 
     alert(data); 
    }, "html"); 
}); 
} 
+0

Danke, es funktioniert, aber Jose Antwort ist klarer. – klew

Verwandte Themen