Ich habe einen grundlegenden Editor, der darauf basiert, execCommand
dem hier vorgestellten Beispiel zu folgen. Es gibt drei Möglichkeiten, Text in den execCommand
Bereich einzufügen :
- Ctrl+V
- Rechtsklick -> Einfügen
- Rechtsklick -> Als Nur-Text einfügen
Ich möchte zulassen, dass nur einfacher Text ohne HTML-Markup eingefügt wird. Wie kann ich die ersten beiden Aktionen zwingen, einfachen Text einzufügen?
Mögliche Lösung: Ich kann mir vorstellen, den Listener für Keyup-Ereignisse für ( Ctrl+ V) festzulegen und HTML-Tags vor dem Einfügen zu entfernen .
- Ist es die beste Lösung?
- Ist es kugelsicher, HTML-Markups beim Einfügen zu vermeiden?
- Wie füge ich einen Listener zu Rechtsklick -> Einfügen hinzu?
javascript
html
dom-events
execcommand
Googlebot
quelle
quelle
Antworten:
Es wird das
paste
Ereignis abfangen, das Ereignis abbrechenpaste
und die Textdarstellung der Zwischenablage manuell einfügen:http://jsfiddle.net/HBEzc/ . Dies sollte am zuverlässigsten sein:
Ich bin mir jedoch nicht sicher, ob Cross-Browser unterstützt wird.
quelle
text
HTML enthält (z. B. wenn Sie HTML-Code als einfachen Text kopieren), wird es tatsächlich als HTML eingefügt. Hier ist eine Lösung dafür, aber sie ist nicht sehr hübsch: jsfiddle.net/HBEzc/3 .var text = (event.originalEvent || event).clipboardData.getData('text/plain');
bietet etwas mehr Cross-Browser-Kompatibilität<div></div>
, wird der Inhalt als untergeordnetes Element des inhaltsbearbeitbaren Elements hinzugefügt. Ich habe es so behoben:document.execCommand("insertText", false, text);
insertHTML
undinsertText
arbeite nichtdocument.execCommand('paste', false, text);
funktioniert . Obwohl das dann in anderen Browsern nicht zu funktionieren scheint> _>.Ich konnte die akzeptierte Antwort hier nicht bekommen, um im IE zu arbeiten, also habe ich ein bisschen herumgesucht und bin zu dieser Antwort gekommen, die in IE11 und den neuesten Versionen von Chrome und Firefox funktioniert.
quelle
Eine enge Lösung als pimvdb. Aber es funktioniert mit FF, Chrome und IE 9:
quelle
content
. Ich habe festgestellt, dass die VerwendunggetData('Text')
browserübergreifend funktioniert, sodass Sie diese Zuweisung nur einmal wie folgt vornehmen können:var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
Dann müssten Sie nur die Logik für den browserübergreifenden Befehl zum Einfügen / Einfügen verwenden.document.selection.createRange().pasteHTML(content)
... nur auf IE11 getestet und es funktioniert nicht so.document.execCommand('insertText', false, content)
funktioniert nicht ab IE11 und Edge. Außerdem unterstützen jetzt die neuesten Versionen von Chromedocument.execCommand('paste', false, content)
, was einfacher ist. Sie könnten veraltet seininsertText
.Natürlich ist die Frage bereits beantwortet und das Thema sehr alt, aber ich möchte meine Lösung anbieten, da es einfach und sauber ist:
Dies ist in meinem Einfügeereignis auf meinem contenteditable-div.
Der else-Teil stammt aus einem anderen SO-Post, den ich nicht mehr finden konnte ...
UPDATE 19.11.2014: Der andere SO-Beitrag
quelle
Keine der veröffentlichten Antworten scheint wirklich browserübergreifend zu funktionieren, oder die Lösung ist zu kompliziert:
insertText
wird vom IE nicht unterstütztpaste
Befehls führt zu einem Stapelüberlauffehler in IE11Was für mich (IE11, Edge, Chrome und FF) funktioniert hat, ist Folgendes:
Beachten Sie, dass der benutzerdefinierte Einfüge-Handler nur für
contenteditable
Knoten benötigt wird / funktioniert . Da sowohltextarea
einfache als auch einfacheinput
Felder das Einfügen von HTML-Inhalten überhaupt nicht unterstützen, muss hier nichts unternommen werden.quelle
.originalEvent
den Event-Handler (Zeile 3) loswerden , damit dies funktioniert. Die komplette Linie sieht also so aus :const text = ev.clipboardData ? ev.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
. Funktioniert in den neuesten Versionen von Chrome, Safari und Firefox.In Firefox können Sie nicht auf die Daten der Zwischenablage zugreifen, daher müssen Sie einen "Hack" durchführen, damit sie funktionieren. Ich konnte keine vollständige Lösung finden, aber Sie können sie für Strg + V-Einfügungen beheben, indem Sie stattdessen einen Textbereich erstellen und einfügen:
quelle
Ich habe auch an einer einfachen Texteinfügung gearbeitet und angefangen, alle execCommand- und getData-Fehler zu hassen. Deshalb habe ich mich für die klassische Methode entschieden und es funktioniert wie ein Zauber:
Den Code mit meinen Notationen finden Sie hier: http://www.albertmartin.de/blog/code.php/20/plain-text-paste-with-javascript
quelle
Der obige Code funktioniert für mich in IE10 und IE11 und jetzt auch in Chrome und Safari. Nicht in Firefox getestet.
quelle
In IE11 funktioniert execCommand nicht gut. Ich benutze den folgenden Code für IE11
<div class="wmd-input" id="wmd-input-md" contenteditable=true>
ist meine Div-Box.Ich lese Zwischenablagedaten aus window.clipboardData und ändere den textContent von div und gebe caret.
Ich gebe eine Zeitüberschreitung für das Einstellen von Caret, denn wenn ich keine Zeitüberschreitung einstelle, geht ein Caret zum Ende von div.
und Sie sollten clipboardData in IE11 wie folgt lesen. Wenn Sie dies nicht tun, wird Newline Caracter nicht richtig behandelt, sodass Caret schief geht.
Getestet auf IE11 und Chrom. Es funktioniert möglicherweise nicht auf IE9
quelle
Nach langem Suchen und Ausprobieren habe ich irgendwie eine optimale Lösung gefunden
quelle
OK, da alle versuchen, die Daten der Zwischenablage zu umgehen, das Tastendruckereignis zu überprüfen und execCommand zu verwenden.
Ich habe daran gedacht
CODE
quelle