Gibt es eine Möglichkeit, das Einfügeereignis in JavaScript abzufangen und den Rohwert abzurufen, ihn zu ändern und den Wert des zugehörigen DOM-Elements auf den geänderten Wert festzulegen?
Zum Beispiel habe ich einen Benutzer, der versucht, eine Zeichenfolge mit Leerzeichen zu kopieren und einzufügen, und die Länge der Zeichenfolge überschreitet die maximale Länge meines Textfelds. Ich möchte den Text abfangen, die Leerzeichen entfernen und dann den Wert des Textfelds mit dem Änderungswert festlegen.
@pimvdb: Ihr jsFiddle-Beispiel funktioniert nicht in Firefox, IE oder Opera.
– Tim unten
17. Mai 11 um 23:53 Uhr
@Tim Down: Danke, dass du es bemerkt hast, die Funktion der browserübergreifenden Zwischenablage scheint ein Problem zu sein.
– pimvdb
19. Mai ’11 um 18:33 Uhr
Maerik
Sie können das Paste-Ereignis abfangen, indem Sie einen “onpaste”-Handler anhängen und den eingefügten Text abrufen, indem Sie “window.clipboardData.getData('Text')” im IE oder “event.clipboardData.getData('text/plain')” in anderen Browsern.
Beispielsweise:
var myElement = document.getElementById('pasteElement');
myElement.onpaste = function(e) {
var pastedText = undefined;
if (window.clipboardData && window.clipboardData.getData) { // IE
pastedText = window.clipboardData.getData('Text');
} else if (e.clipboardData && e.clipboardData.getData) {
pastedText = e.clipboardData.getData('text/plain');
}
alert(pastedText); // Process and handle text...
return false; // Prevent the default handler from running.
};
Wie @pimvdb feststellt, müssen Sie “e.originalEvent.clipboardData” bei Verwendung von jQuery.
Wenn ich den obigen Code im IE mache, mache ich aber folgendes: myElement.Value = pastedText.split(' ').join(''); es setzt den Wert auf den ursprünglich eingefügten Wert. Irgendwelche Ideen? Ich habe diesen Scheck hinzugefügt alert(myElement.Value); und gebe true zurück und der Wert sieht in meiner Warnung korrekt aus, wird aber auf meiner Seite nicht korrekt angezeigt.
– Brandon
17. Mai ’11 um 18:43 Uhr
Indem Sie „true“ zurückgeben, erlauben Sie, dass der standardmäßige „Paste“-Handler nach Ihrem eigenen Handler auftritt, der nur den Text ohne Ihre benutzerdefinierte Verarbeitung einfügt. Die Rückgabe von „false“ verhindert, dass der Standard-Paste-Handler ausgeführt wird (weshalb ich dies in meinem Beispiel getan habe).
– Maerik
17. Mai 11 um 18:54 Uhr
Es sieht so aus, als ob Firefox keine Zwischenablageoperationen zulässt …
– Maerik
17. Mai ’11 um 18:55 Uhr
Für diejenigen, die wie ich nach dem letzten Teil des Puzzles suchten, “den Wert des Textfelds mit dem geparsten Wert festlegen”, habe ich Folgendes verwendet, um das endgültige Einfügen durchzuführen: “document.execCommand(“insertText”, false, pastedText );”
– Christopher Alun Lewis
17. November 16 um 15:42 Uhr
@Veve, das funktioniert nicht, wenn Sie irgendeine Art von Manipulation durchführen pastedText. Richtig?
– Claudio
28. April 17 um 17:32 Uhr
Tim unten
Zufällig habe ich heute früher eine ähnliche Frage beantwortet. Kurz gesagt, Sie brauchen einen Hack, um das Caret-Zeichen in einen Textbereich außerhalb des Bildschirms umzuleiten, wenn das Einfügeereignis ausgelöst wird.
$(document).ready(function() {
$("#editor").bind('paste', function (e){
$(e.target).keyup(getInput);
});
function getInput(e){
var inputText = $(e.target).val();
alert(inputText);
$(e.target).unbind('keyup');
}
});
Craig Silber
Ich musste ein “Trimmen” für alles einfügen, was eingefügt wurde (alle führenden und nachgestellten Leerzeichen entfernen), während die Verwendung der Leertaste weiterhin zulässig war.
Für Strg+V, Umschalt+Einfügen und Einfügen mit der rechten Maustaste funktioniert Folgendes in FF, IE11 und Chrome seit dem 22.04.2017:
$(document).ready(function() {
var lastKeyCode = 0;
$('input[type="text"]').bind('keydown', function(e) {
lastKeyCode = e.keyCode;
});
// Bind on the input having changed. As long as the previous character
// was not a space, BS or Del, trim the input.
$('input[type="text"]').bind('input', function(e) {
if(lastKeyCode != 32 && lastKeyCode != 8 && lastKeyCode != 46) {
$(this).val($(this).val().replace(/^s+|s+$/g, ''));
}
});
});
Zwei Vorbehalte:
Wenn beim Einfügen bereits Text vorhanden ist, wird das gesamte Ergebnis getrimmt, nicht nur das, was eingefügt wird.
Wenn der Benutzer Leerzeichen oder BS oder Entf eingibt und dann einfügt, erfolgt kein Trimmen.
.
6245900cookie-checkEinfügeereignis in Javascript abfangenyes
Sicher, zB stackoverflow.com/questions/2242442/…. Oder: jsfiddle.net/6skZQ.
– pimvdb
17. Mai ’11 um 18:02 Uhr
@pimvdb: Ihr jsFiddle-Beispiel funktioniert nicht in Firefox, IE oder Opera.
– Tim unten
17. Mai 11 um 23:53 Uhr
@Tim Down: Danke, dass du es bemerkt hast, die Funktion der browserübergreifenden Zwischenablage scheint ein Problem zu sein.
– pimvdb
19. Mai ’11 um 18:33 Uhr