2012-03-25 5 views
7

Ich sehe, dass, wenn ich versuche, den Wert aus einem Textarea Feld zu lesen, wenn seine onpaste Funktion aufgerufen wird, bekomme ich den alten Wert des Feldes (der vor dem Einfügen), nicht der neue Wert (der nach dem Einfügen Betrieb).Wie erhalte ich den neuen Wert eines Textfeld-Eingabefeldes beim Einfügen?

Hier ist eine Demonstration dieses Verhalten: http://jsfiddle.net/qsDnr/

Eine Kopie des Codes folgt:

<!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> 

Sie das Verhalten mit den folgenden Schritten bestätigen können.

  1. Kopieren Sie die Zeichenfolge foo in Ihre Zwischenablage.
  2. Klicken Sie mit der rechten Maustaste auf das Textfeld, und wählen Sie "Einfügen". Nichts erscheint im div-Element.
  3. Klicken Sie mit der rechten Maustaste auf das Textfeld, und wählen Sie erneut "Einfügen". foo erscheint im div-Element.

Da ich das div-Element will immer zeigen, was mit dem Einfügen in dem Textelement aktualisiert wurde, ist die gewünschte Ausgabe foo und foo foo in Schritt 2 und 3 jeweils.

Ein Weg, ich es geschafft haben, ist die gewünschte Ausgabe zu erhalten, indem die update() Funktionsaufruf mit window.setTimeout() verzögert, so dass anstelle von

textareaElement.onpaste = update  

Ich habe

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

diesmal (Demo: http://jsfiddle.net/cwpLS/). Das macht was ich will. Dies ist jedoch eher ein Workaround als ein einfacher Weg, um das zu tun, was ich will. Ich würde gerne wissen, ob es einen alternativen oder besseren Weg gibt, dies zu tun.

+0

[Dieses Ereignis] (https://developer.mozilla.org/de/DOM/element.onpaste) wird gesendet, wenn der Benutzer * versucht * Text einzufügen - kann bedeuten, dass onpaste ausgelöst wird, bevor der Text eingefügt wird. – Joseph

+0

'event.clipboardData.getData ('text/plain')' erlaubt es, Inhalte zu bekommen, würde eingefügt werden, aber ich bin nicht sicher, dass es in jedem Browser verfügbar ist und der aktuelle Text und die Auswahl sollten ebenfalls berücksichtigt werden. Ich fürchte, Sie müssen Timeout verwenden oder 'onkeyup' /' onmouseup' verfolgen. – kirilloid

+0

@Joseph Ich stimme zu.Ich versuche herauszufinden, ob das Problem, das ich lösen möchte, am besten mit 'setTimeOut' gelöst wird, wie ich es in diesem Beitrag erklärt habe oder ob es bessere Möglichkeiten gibt, dieses Problem zu lösen. –

Antwort

3

Ich bin ziemlich sicher, dass Sie SetTimeout Lösung ist die einzige Möglichkeit, den gewünschten Effekt zu erreichen, oder versuchen Sie auf die Zwischenablage Objekt zugreifen - die kann unordentlich, wenn Sie für browserübergreifende & alten Browser-Unterstützung gehen.

0

Es gibt keine direkte Möglichkeit, dies im Browser zu tun. Sehen Sie den folgenden Link über das Verhalten in Firefox.

Mozilla

Es gibt derzeit keine DOM-einzige Möglichkeit, den Text zu erhalten, eingefügt wird; Sie müssen ein NSIClipboard verwenden, um diese Informationen zu erhalten.

Schauen Sie sich auch die stackoverflow link an, die über andere Möglichkeiten diskutieren.

Verwandte Themen