2010-01-13 16 views
8

Ich habe ein Textfeld, dass ich das paste Ereignis mit JQuery binden bin. Wenn ich zuerst etwas in das Formularfeld einfügen und seine val() protokollieren, wird eine leere Zeichenfolge zurückgegeben. Ebenso, wenn ich wieder in das Feld einfügen, gibt es den vorherigen Wert vor Einfügen zurück. Im Wesentlichen habe ich eine Race Condition oder Sequencing Problem, aus Mangel an einem besseren Begriff. Es scheint, dass das Formularfeld erst nach dem Einfügen aktualisiert wird.Wie erhalte ich den Wert eines Feldes während des Einfügens?

Gibt es eine Möglichkeit, den Wert des Feldes nach zu überprüfen, das Einfügen-Ereignis wurde abgeschlossen und das Feld ist tatsächlich ausgefüllt? Ich möchte den tatsächlichen Feldwert, nicht die ClipboardData, da ich weiß, dass dies eine IE-only-Funktion ist.

$('#url').bind('paste', function(e) { 
    alert($(this).val()); 
}); 
+0

können Sie nicht Change Event anstelle von Paste verwenden? – kender

+0

@kender - Nur wenn das OP warten möchte, bis der Benutzer den Fokus von der Eingabe wegbewegt. –

+2

Ein wichtiger Punkt: Das 'paste'-Ereignis existiert seit der Version 5 im IE, hat es aber erst relativ spät in andere Browser geschafft. Firefox 2 zum Beispiel hat es nicht. –

Antwort

16

Es stellt sich eine anständige Lösung ist es, den Rückruf in einem setTimeout(), mit einer Verzögerung von 0 Millisekunden wickeln, um es asynchron zu machen.

Mein neuer Code ist:

var urlField = $('#url'); 
urlField.bind('paste', function(e) { 
    setTimeout(function() { 
     alert(urlField.val()); 
    }, 0); // note the 0 milliseconds 
}); 

Dank DigitalBush's Masked Input Plugin, es verwendet diese Technik in der gesamten Quelle.

+0

Ich möchte erwähnen, dass dies bei allen latenten Operationen funktioniert, die darauf angewiesen sind, den Wert des Feldes zu erhalten. – Soviut

Verwandte Themen