2012-03-25 14 views
7

Veo que cuando trato de leer el valor de un campo textarea cuando se llama a su función onpaste, obtengo el valor anterior del campo (el anterior a la operación de pegado), no el nuevo (el que está después del pegado operación).¿Cómo obtener el nuevo valor de un campo de entrada de texto en pegar?

Aquí es una demostración de este comportamiento: http://jsfiddle.net/qsDnr/

Una copia del código de la siguiente manera:

<!DOCTYPE html> 
<html> 
<head> 
<title>On Paste</title> 
<script type="text/javascript"> 
var textareaElement; 
var previewElement; 

function update() 
{ 
    previewElement.innerHTML = textareaElement.value; 
} 

window.onload = function() { 
    textareaElement = document.getElementById('textarea'); 
    previewElement = document.getElementById('preview'); 
    textareaElement.onpaste = update  
} 
</script> 
</head> 
<body> 
<textarea id="textarea"> 
</textarea> 
<div id="preview"> 
</div> 
</body> 
</html> 

puede confirmar el comportamiento con los siguientes pasos.

  1. Copie la cadena foo en su portapapeles.
  2. Haga clic derecho en el campo textarea y seleccione 'Pegar'. Nada aparece en el elemento div.
  3. Haga clic derecho en el campo textarea y seleccione 'Pegar' de nuevo. foo aparece en el elemento div.

Desde Quiero que el elemento div para mostrar siempre lo que se actualizó en el elemento de área de texto con la operación de pegado, la salida deseada es foo y foo foo en el paso 2 y el paso 3, respectivamente.

Una forma he logrado obtener la salida deseada es al retrasar la llamada update() función con window.setTimeout(), así que en vez de

textareaElement.onpaste = update  

Tengo

textareaElement.onpaste = function() { 
    window.setTimeout(update, 100); 
}; 

este tiempo (demo: http://jsfiddle.net/cwpLS/) Esto hace lo que quiero. Sin embargo, esto se parece más a una solución alternativa que a una forma directa de hacer lo que quiero. Me gustaría saber si hay alguna forma alternativa o mejor de hacerlo.

+0

[Este evento] (https://developer.mozilla.org/en/DOM/element.onpaste) se envía cuando el usuario * intenta * pegar texto - puede significar que onpass se activa antes de que se pegue el texto. – Joseph

+0

'event.clipboardData.getData ('text/plain')' permite obtener contenido, se pegará, pero no estoy seguro de que esté disponible en todos los navegadores, y el texto actual y la selección también deben tenerse en cuenta. Me temo que tendrás que usar el tiempo de espera o seguir 'onkeyup' /' onmouseup'. – kirilloid

+0

@Joseph Estoy de acuerdo.Estoy tratando de determinar si el problema que estoy tratando de resolver se resuelve mejor con 'setTimeOut' como lo he explicado en esta publicación o si hay mejores formas de resolver este problema. –

Respuesta

3

Estoy bastante seguro de que la solución setTimeout es la única manera de lograr el efecto deseado o intentar acceder al objeto del portapapeles, lo que puede complicarse si se usa el navegador anterior &.

0

No hay manera directa de hacerlo en el navegador cruzado. Vea el enlace a continuación sobre el comportamiento en Firefox.

Mozilla

Hay actualmente no hay manera de DOM-sólo para obtener el texto que se está pegada; Tendrás que usar un nsIClipboard para obtener esa información.

También por favor eche un vistazo a stackoverflow link que discuten sobre otras posibilidades.

Cuestiones relacionadas