2010-01-13 16 views
8

Tengo un campo de texto que vincula el evento paste al uso de JQuery. Cuando pego algo por primera vez en el campo de formulario y registro su val(), devuelve una cadena en blanco. Del mismo modo, si vuelvo a pegar en el campo, devuelve el valor anterior antes de pegar. Básicamente, tengo una condición de carrera o secuenciación, por falta de un término mejor. Parece que el campo de formulario no se actualizará hasta que el evento pegar se complete.¿Cómo obtener el valor de un campo durante el evento pegar?

¿Hay alguna manera de verificar el valor del campo después de el evento de pegado se ha completado y el campo está realmente ocupado? Quiero el valor real del campo, no el clipboardData, ya que sé que es una característica solo de IE.

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

¿No puedes usar change event en lugar de paste? – kender

+0

@kender: solo si el OP quiere esperar hasta que el usuario aleje el foco de la entrada. –

+2

Un punto importante: el evento 'paste' ha existido en IE desde la versión 5 pero solo recientemente lo ha hecho en otros navegadores. Firefox 2, por ejemplo, no lo tiene. –

Respuesta

16

Resulta una solución decente es envolver la devolución de llamada en un setTimeout(), con un retraso de 0 milisegundos, con el fin de que sea asíncrono.

Mi nuevo código es:

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

Gracias a DigitalBush's Masked Input Plugin, utiliza esta técnica en toda la fuente.

+0

Me gustaría mencionar que esto funciona en cualquier operación latente que se base en obtener el valor del campo. – Soviut

Cuestiones relacionadas