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.
- Copie la cadena
foo
en su portapapeles. - Haga clic derecho en el campo textarea y seleccione 'Pegar'. Nada aparece en el elemento div.
- 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.
[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
'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
@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. –