2012-03-13 14 views
5
events: { "paste .youtube-url" : "addUrl" } 

addUrl: function(){ 
    console.log(this.$(".youtube-url").val()); 

lo que permite decir pego "malo" en el cuadro de texto primera vezevento paste es despedido antes de que el texto está en cuadro de texto

salida de la consola: (una cadena vacía)

entonces, si me pega añadir algo así como "codificador"

salida de la consola: mala

vez de lo que está dentro de la caja "badcoder", creo que esto es porque el evento de pseudo pegar se dispara antes de que se inserte el texto.

Respuesta

8

En lugar de usar el evento paste, puede usar el evento keyup que se dispara si alguien pega, pero también se dispara después de que se actualizó el valor de la entrada.

ACTUALIZACIÓN

buen comentario de @Micah (y @JohnnyO). He aquí una solución que he encontrado para trabajar:

$('input').on('paste', function() { 
    var that = this; 
    setTimeout(function() { 
     alert(that.value); 
    }, 0); 
});​ 

Esto establece un tiempo de espera de lo que el código que se lee el valor de la entrada sólo se ejecuta después de que el resto del código en la pila de ejecución ha sido. Solo probé en Chrome 21 pero el timeout de tiempo cero parece ser el truco.

Demostración: http://jsfiddle.net/H4K4R/

+1

NOTA: Como #JohnnyO menciona, el evento 'keyup' no se activará si el menú contextual se usa para pegar. – Micah

+0

@Micah Buena captura. ** Actualicé ** mi respuesta con otro método. – Jasper

+0

'events: {" change .youtube-url ":" addUrl "}' puede ser otra opción, pero el evento no se dispara hasta que el foco haya salido del cuadro de texto. – Micah

4

La respuesta por @Jasper sólo funciona cuando el encolamiento por el teclado. Cuando use el mouse y el menú contextual para pegar, no obtendrá un evento de teclado. El mejor evento para observar es el evento de 'entrada'. Lamentablemente, para las versiones de IE anteriores a la 9, tendrá que mirar el evento 'propertychange' en su lugar porque no admiten 'entrada'. 'propertychange' no burbujea, por lo que no podrá conectar este evento como lo hace con Backbone, y en su lugar deberá enlazarlo directamente con el elemento '.youtube-url'.

Cuestiones relacionadas