2012-06-10 16 views
14

tengo esto ahora:Javascript onpaste

<input type="text" placeholder="Paste text" onPaste="alert(this.value);">

Esto hace de hecho el trabajo, con la excepción, devuelve una ventana de alerta en blanco. No tengo ningún valor. ¿Ayuda?

Respuesta

36

El evento onpaste se desencadena antes de que cambie value. Es necesario algo como un setTimeout:

<input type="text" placeholder="Paste text" onPaste="var e=this; setTimeout(function(){alert(e.value);}, 4);">​ 

Estoy almacenando una referencia a this dentro de una var global como this no es accesible dentro del ámbito de una función de tiempo de espera que se adjunta al objeto de ventana.

Estoy usando 4 milisegundos como tiempo de espera, ya que es el mínimo intervalo/tiempo de espera válido en la especificación HTML5. Editar: Como se indicó en los comentarios, también puede usar 0 milisegundos como timeOut, que se vuelve a calcular automáticamente en 4. jsPerf tests.

Fiddle

Es posible también utilizar una llamada de función dentro de su onpaste paso de eventos this como un parámetro para evitar su mezcla con HTML JS demasiado. :)

Y aquí es una función fácil de leer y que se puede utilizar en múltiples entradas:

function pasted(element) { 
    setTimeout(function(){ 
     alert(element.value); 
    }, 0); //or 4 
}​ 

que puede ser llamado simplemente con onPaste="pasted(this)" para cualquier entrada.

Fiddle

+2

El tiempo de espera se puede establecer en cero – scriptin

+3

@DmitryScriptin Sí, puede, pero en la especificación HTML5 se interpretará como 4 incluso si lo configura en 0 (hay algunos casos de prueba en jsperf para probarlo), así que usé un número válido para evitar nuevos cálculos. :) –

+2

Prefiero "0" para un "evento en cola", ya que entonces no tengo que adivinar cuál es el * intento * (eso y hace un código consistente) aunque solo * omitir * el valor también debería ser suficiente. No habrá ** impacto ** en el rendimiento para un "recálculo". –

9

Esto es porque el onpaste desencadena el evento antes el contenido que se pegan en el elemento (link) así que no es todavía en el momento que lo maneja.

Los navegadores modernos admiten métodos para obtener datos del portapapeles dentro del controlador de eventos. Consulte JavaScript get clipboard data on paste event (Cross browser) para los intentos de solución entre navegadores.

Además, siempre puede evitar su problema simplemente iniciando un temporizador en la función del controlador de eventos (10ms debería ser suficiente) que verificaría su valor de entrada más tarde.