JavaScript get-Daten in der Zwischenablage auf einfügen-event (Cross-browser)
Wie kann eine web-Anwendung erkennen, ein paste-Ereignis und rufen Sie die Daten eingefügt werden?
Möchte ich entfernen Sie HTML-Inhalt, bevor der text eingefügt werden in einem rich-text-editor.
Reinigung der text nach eingefügt werden, danach funktioniert, aber das problem ist, dass alle Formatierungen verloren. Ich kann zum Beispiel schreiben Sie einen Satz im editor, und machen es Fett, aber wenn ich fügen Sie neuen text, alle Formatierungen verloren. Ich will sauber nur der text, der eingefügt wird, und lassen Sie alle vorherigen Formatierungen unangetastet.
Idealerweise sollte die Lösung funktioniert auf allen modernen Browser (z.B. MSIE, Gecko, Chrome und Safari).
Beachten Sie, dass MSIE hat clipboardData.getData()
, aber ich konnte nicht finden, eine ähnliche Funktionalität für andere Browser.
InformationsquelleAutor Alex | 2010-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die situation geändert hat, seit dem schreiben dieser Antwort: nun, dass Firefox unterstützt in version 22, die alle gängigen Browser unterstützen nun den Zugriff auf die Daten aus der Zwischenablage in ein paste-Ereignis. Sehen Nico Brennt ' s Antwort für ein Beispiel.
In der Vergangenheit war dies im Allgemeinen nicht möglich, eine cross-browser Weg. Das wäre ideal, um in der Lage sein, um die eingefügten Inhalte über die
paste
Ereignis, das ist möglich in neueren Browsern aber nicht bei einigen älteren Browsern (insbesondere Firefox < 22).Wenn Sie brauchen, um die Unterstützung für ältere Browser, was Sie tun können, ist ziemlich verwickelt und ein bisschen ein hack, funktioniert auch in Firefox 2+, IE 5.5+ und WebKit-Browsern wie Safari oder Chrome. Neuere Versionen von TinyMCE und CKEditor, diese Technik zu verwenden:
designMode
aus-und call -focus()
auf die textarea, so bewegen Sie den Cursor und effektiv umleiten, die pastedesignMode
wieder auf, stellt dem Benutzer die Auswahl und fügt den text in.Beachten Sie, dass dies nur funktioniert die Tastatur einfügen von Ereignissen und nicht-Pasten aus dem Kontextmenü oder Bearbeiten von Menüs. Durch die Zeit, die die paste-event feuert, ist es zu spät leiten Sie die Einfügemarke in das Textfeld (in einigen Browsern zumindest).
In dem unwahrscheinlichen Fall, dass Sie brauchen, um Unterstützung für Firefox 2, beachten Sie, dass Sie benötigen, um die textarea-Komponente im übergeordneten Dokument, anstatt den WYSIWYG-editor-iframe-Dokument im browser.
designMode
ist eine Boolesche Eigenschaft vondocument
und macht die gesamte Seite bearbeitet werden, wenntrue
. WYSIWYG-Editoren meist ein iframe-Element mitdesignMode
auf als bearbeitbaren Bereich. Speichern und wiederherstellen der Benutzer-Auswahl erfolgt dann eine Möglichkeit im IE und anderen in anderen Browsern, wie dem einfügen den Inhalt in den editor. Sie benötigen einTextRange
im IE und eineRange
in anderen Browsern.Wie würden Sie capture mit der rechten Maustaste -> einfügen?
Sie können entdecken es über die
paste
Ereignis, sondern es ist generell zu spät, um dann leiten Sie die paste in ein anderes element, so dass dieser hack nicht funktionieren. Der fallback in den meisten Editoren ist es zu zeigen ein Dialogfeld für den Benutzer auf "einfügen".Einige mehr info auf: Firefox wird nicht zulassen, Sie verschieben Sie den Fokus zu einem anderen element in der
paste
Veranstaltung, aber es wird Ihnen erlauben, löschen Sie den Inhalt des Elements (und speichern Sie es auf eine variable, also können Sie Sie später wiederherstellen). Wenn dieser container eindiv
(funktioniert wahrscheinlich für eineiframe
auch), dann kannst du mit dem Rad dann durch die eingefügten Inhalte mit der normalen dom-Methoden, oder um es als string mitinnerHTML
. Sie können dann wieder den vorherigen Inhalt derdiv
und einfügen, was Inhalte, die Sie mögen. Oh, und Sie verwenden den gleichen timer hack wie oben. Ich bin überrascht, dass TinyMCE nicht tun...Ich bin nicht einverstanden - es ist ein unelegant und komplizierten Weg, um make-up für den Mangel an eine vernünftige API. Es wäre besser in der Lage sein, um die eingefügten Inhalte direkt aus dem paste-Ereignis begrenzt möglich, die in einigen Browsern.
InformationsquelleAutor Tim Down
Lösung #1 (nur-Text-Format und erfordert Firefox 22+)
Werke für IE6+, FF 22+, Chrome, Safari, Edge
(Nur getestet in IE9+, aber sollte funktionieren für niedrigere Versionen)
Wenn Sie Unterstützung brauchen, für das einfügen von HTML-oder Firefox <= 22, siehe Lösung #2.
HTML
JavaScript
JSFiddle: https://jsfiddle.net/swL8ftLs/12/
Beachten Sie, dass diese Lösung verwendet den parameter 'Text' für die
getData
- Funktion, die ist nicht standard. Jedoch, es funktioniert in allen Browsern in der Zeit des Schreibens.Lösung #2 (HTML und funktioniert für Firefox <= 22)
Getestet in IE6+, FF 3.5+, Chrome, Safari, Edge
HTML
JavaScript
JSFiddle: https://jsfiddle.net/nicoburns/wrqmuabo/23/
Erklärung
Den
onpaste
Veranstaltung derdiv
hat diehandlePaste
Funktion angehängt und übergeben ein einziges argument: dieevent
- Objekt für das Ereignis paste. Von besonderem Interesse für uns ist dieclipboardData
Eigenschaft dieses Ereignis, das ermöglicht den Zugriff auf die Zwischenablage, die in nicht-ie-Browser. Im IE das äquivalent istwindow.clipboardData
, das hat zwar ein etwas anderes API.Siehe Ressourcen-Abschnitt weiter unten.
Die
handlepaste
Funktion:Diese Funktion hat zwei Niederlassungen.
Die ersten Prüfungen für die Existenz von
event.clipboardData
und prüft, ob estypes
Eigenschaft enthält: 'text/html' (types
kann entweder einDOMStringList
was wird überprüft mit dencontains
Methode, oder eine Zeichenfolge, die überprüft wird die Verwendung derindexOf
- Methode). Wenn alle diese Bedingungen erfüllt sind, dann können wir gehen, wie in die Lösung #1, nur mit "text/html "statt" text/plain". Dies funktioniert derzeit in Chrome und Firefox 22+.Wenn diese Methode nicht unterstützt wird (alle anderen Browser), dann haben wir
DocumentFragment
waitForPastedData
FunktionDie
waitforpastedata
Funktion:Diese Funktion ersten Umfragen für die eingefügten Daten (einmal pro 20ms), die notwendig ist, weil es nicht angezeigt sofort. Wenn die Daten erschienen:
Die
processpaste
Funktion:Nicht beliebige Dinge mit den eingefügten Daten. In diesem Fall können wir nur warnen, den Daten, die Sie tun können, was Sie wollen. Sie werden wahrscheinlich wollen, führen Sie die eingefügten Daten durch irgendeine Art von Daten Desinfektions-Prozess.
Speichern und wiederherstellen der position des Cursors
In einem realen sitution würden Sie wahrscheinlich wollen, um die Auswahl zu speichern, bevor, und danach wieder abzurufen (Set cursor position auf contentEditable <div>). Sie können dann legen Sie die eingefügten Daten an der position des Cursors, wenn der Benutzer initiiert die Aktion einfügen.
Ressourcen:
Vielen Dank an Tim nach Unten, um zu suggerieren, die Verwendung von ein DocumentFragment, und abligh für den Fang ein Fehler in Firefox durch den Einsatz von DOMStringList anstelle einer Zeichenfolge für clipboardData.Typen
DocumentFragment
anstattinnerHTML
aus mehreren Gründen: Erstens, Sie halten alle vorhandenen event-Handler; zweitens, speichern und wiederherstelleninnerHTML
nicht garantiert ist, erstellen Sie eine identische Kopie der früheren DOM; drittens, Sie können dann speichern Sie die Auswahl alsRange
anstatt zu faff um mit dem hinzufügen von marker-Elemente oder die Berechnung von text-offsets (das ist das, was Sie würde tun müssen, wenn Sie verwendet werdeninnerHTML
).Es ist in der Tat ein Blitz ohne Inhalt (FONC?), das wird natürlich schlimmer, wenn die Verarbeitung des eingefügten Inhalts einige Zeit in Anspruch nimmt. Btw, warum ist die Gewinnung einer
DocumentFragment
ein Schmerz im IE? Es ist das gleiche wie in anderen Browsern, es sei denn, Sie verwenden einen Bereich undextractContents()
es zu tun, das ist nicht mehr prägnant ist als die alternative in jedem Fall. Ich habe realisiert ein Beispiel für Ihre Technik, über Feingliedrige, um die Dinge schön und einheitlich in allen Browsern: jsfiddle.net/bQeWC/4.Der jsFiddle demo, die ich gepostet in den Kommentaren helfen.
Es scheint, dass es nicht mehr funktioniert auf Firefox 28 ist (mindestens) für Windows. Es geht nie aus der
waitforpastedata
FunktionFYI: Edge unterstützt nun das Lesen von Daten mit dem MIME-Typ
text/html
mit dem W3C-Clipboard-API. In der Vergangenheit ein solcher Versuch würde eine exception werfen. Also man muss nicht mehr diesen workaround/hack für Edge.InformationsquelleAutor Nico Burns
Einfache version:
Mit
clipboardData
Demo : http://jsbin.com/nozifexasu/edit?js,Ausgabe
Edge, Firefox, Chrome, Safari, Opera getestet.
Hinweis: denken Sie Daran zu prüfen, input/output am server-Seite auch (wie PHP strip tags)
besten cross-browser Antwort gefunden, so weit. fügen Sie den code nur für den IE und seine perfekt.
Welcher code würde Hinzugefügt werden, um diese Arbeit zu machen, die mit dem IE?
Dies funktioniert im IE (ah, süß, im Gegensatz DH)
window.clipboardData.getData('Text');
e.preventDefault(); if (e.clipboardData) { content = (e.originalEvent || e).clipboardData.getData('text/plain'); document.execCommand('insertText', false, content); } else if (window.clipboardData) { content = window.clipboardData.getData('Text'); document.selection.createRange().pasteHTML(content); }
InformationsquelleAutor l2aelba
Ich geschrieben habe, ein kleines proof-of-concept für Tim Downs Vorschlag hier mit off-screen-textarea. Und hier geht der code:
Einfach kopieren und fügen Sie den gesamten code in eine html-Datei und versuchen Sie, fügen Sie (mit Strg-v) text aus der Zwischenablage irgendwo auf das Dokument.
Ich habe es getestet in IE9 und neue Versionen von Firefox, Chrome und Opera. Klappt auch ganz gut. Auch ist es gut, dass man jede Tastenkombination, die er lieber triger diese Funktionalität. Natürlich nicht vergessen die jQuery-Quellen.
Fühlen Sie sich frei, um diesen code zu verwenden und wenn Sie kommen mit einigen Verbesserungen oder Probleme bitte posten Sie zurück. Beachten Sie auch, dass ich kein Javascript-Entwickler, so kann ich Sie etwas verpasst haben (=>machen Sie Ihre eigene testign).
Haben Sie versucht, neu zu installieren? 😉
Oder vielleicht ist es nicht immer 91: stackoverflow.com/questions/3834175/... Egal, ich bin ziemlich sicher, dass die jQuery-Griffe alles für Sie, nur e-check.ctrlKey oder e.metaKey denke ich.
e.ctrlKey oder e.metaKey ist Teil des JavaScript-DOM, nicht jQuery: developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
Ich glaube nicht, dass das funktioniert für rechts-Klick und einfügen. Viele Menschen nehmen diesen Ansatz.
InformationsquelleAutor JanM
Basierend auf l2aelba anwser. Dies wurde getestet auf FF, Safari, Chrome, IE (8,9,10 und 11)
Danke!!! Du hast mich gerettet mein Tag. 🙂
bestätigt dies funktioniert mit IE11
InformationsquelleAutor tmorell
Diese macht nicht benutzen, setTimeout().
Habe ich verwendet diese großer Artikel zu erreichen, cross-browser-Unterstützung.
Dieser code wird erweitert mit Auswahl-handle vor dem einfügen:
demo
InformationsquelleAutor
Für Reinigung der eingefügte text und ersetzt den zurzeit ausgewählten text durch den eingefügten text die Sache ist ziemlich trivial:
JS:
InformationsquelleAutor Matt Crinklaw-Vogt
Diese sollte auf allen Browsern, die Unterstützung der onpaste event und die mutation observer.
Diese Lösung geht einen Schritt weiter als immer nur der text, es eigentlich ermöglicht Ihnen das Bearbeiten der eingefügten Inhalte, bevor es in ein element eingefügt.
Es arbeitet mit contenteditable, onpaste event (unterstützt von allen gängigen Browsern) en mutation Beobachter (unterstützt Chrome, Firefox und IE11+)
Schritt 1
Erstellen eines HTML-Elements mit contenteditable
Schritt 2
In Ihrem Javascript-code hinzufügen, wird das folgende Ereignis
Müssen wir binden pasteCallBack, da die mutation Beobachter wird asynchron aufgerufen werden.
Schritt 3
Fügen Sie die folgende Funktion zu Ihrem code
}
Was der code tut:
Vielen Dank Tim Nach Unten
Finden Sie in diesem Beitrag die Antwort:
Holen Sie sich die eingefügten Inhalte auf dem Dokument auf einfügen-Ereignis
InformationsquelleAutor Mouser
Lösung, die für mich funktioniert ist das hinzufügen von Ereignis-listener einfügen Ereignis, wenn Sie einfügen, um eine Texteingabe.
Seit paste-Ereignis geschieht, bevor der text im input-Veränderungen, in meinem auf Ereignisprozedur paste erstelle ich eine latente Funktion in der ich prüfen, für Veränderungen in meinem input-Feld, das passiert ist, einfügen:
Horror, leider ist ein Teil unserer job-Beschreibung 😉 Aber ich Stimme zu, dies ist ein hack und hacks sollte NUR verwendet werden, wenn alle anderen Optionen erschöpft sind.
InformationsquelleAutor Lex
Dieser war zu lang für einen Kommentar auf Nico ' s Antwort, die ich glaube nicht, dass funktioniert auf Firefox mehr (nach den Kommentaren), und hat nicht funktioniert für mich auf Safari.
Erstens, Sie jetzt zu sein scheinen in der Lage zu Lesen direkt aus der Zwischenablage. Anstatt code wie:
verwenden:
weil Firefox hat einen
types
Feld, das eineDOMStringList
die nicht implementierttest
.Nächste Firefox wird nicht zulassen, einfügen, es sei denn, der Schwerpunkt liegt in einer
contenteditable=true
Feld.Schließlich, Firefox wird nicht zulassen, fügen Sie zuverlässig es sei denn, der focus ist in einem
textarea
(oder vielleicht Eingang), die nicht nurcontenteditable=true
aber auch:display:none
visibility:hidden
War ich versucht zu verbergen das Textfeld, so konnte ich machen, fügen Sie über eine JS VNC-emulator (d.h., es würde zu einem remote-client und es gab keine wirklich
textarea
etc, einfügen in). Ich fand zu verbergen versucht das Textfeld in die oben genannten Symptome gab, wo es funktionierte manchmal, aber in der Regel nicht auf der zweiten einfügen (oder, wenn das Feld gelöscht wurde um zu verhindern, dass das einfügen der gleichen Daten doppelt) als das Feld den Fokus verloren und würde nicht richtig wieder es trotzfocus()
. Die Lösung, die ich kam, war um es aufz-order: -1000
machen esdisplay:none
, die es machen, wie von 1px 1px, und alle Farben transparent. Igitt.Auf der Safari der zweite Teil der oben genannten gilt, d.h. Sie müssen eine
textarea
die nichtdisplay:none
.InformationsquelleAutor abligh
Erste in den Sinn kommt ist die pastehandler von google ' s closure lib
http://closure-library.googlecode.com/svn/trunk/closure/goog/demos/pastehandler.html
Sie sind richtig, und auch dies funktioniert nur mit Texteingabefelder, nicht rich-text-Editoren.
broken-link-404
InformationsquelleAutor tDo
Dieser arbeitete für mich :
window.clipboardData
.InformationsquelleAutor Timmy Duncan
Dieser Lösung ist, ersetzen Sie die html-tag, es ist einfach und cross-browser; überprüfen Sie dieses jsfiddle: http://jsfiddle.net/tomwan/cbp1u2cx/1/, core code:
Hinweis: sollten Sie einige arbeiten über xss-filter auf der Rückseite, da diese Lösung nicht gefiltert werden können Zeichenfolgen wie " <<>>'
.text() arbeiten schön 🙂 für plain-text
InformationsquelleAutor TomWan
Können Sie dies tun auf diese Weise:
verwenden Sie dieses jQuery-plugin für pre & post einfügen Veranstaltungen:
Nun können Sie dieses plugin verwenden;:
Erklärung
Ersten Satz eine uid für alle vorhandenen Elemente als data-Attribut.
Dann vergleichen Sie alle Knoten POST-PASTE-Ereignis. Also durch den Vergleich erkennen Sie das neu eingefügte einen, weil Sie dann eine uid, dann entfernen Sie einfach style/class/id-attribute von neu erstellten Elementen, so dass Sie können halten Sie Ihre älteren Formatierung.
InformationsquelleAutor Peeyush
InformationsquelleAutor Roman Yudin
Lassen Sie den browser einfügen wie gewohnt in Ihrem Inhalt editierbaren div-und dann nach dem einfügen swap alle span-Elemente verwendet für benutzerdefinierte text-Stile mit dem text selbst. Dies scheint zu funktionieren in internet-explorer und den anderen Browsern habe ich versucht...
Dieser Lösung davon ausgegangen, dass Sie jQuery und Sie nicht möchten, formatieren von text in Ihre Inhalte bearbeitbar divs.
Die plus-Seite ist, dass es super einfach.
span
tag? Ich könnte mir vorstellen, die Frage war über alle tags.InformationsquelleAutor DaveAlger
InformationsquelleAutor Ivan
Einfache Lösung:
InformationsquelleAutor lama12345
Dies ist eine vorhandene code oben gepostet, aber ich habe aktualisiert es für den IE, der Fehler war, wenn der bestehende text wird ausgewählt und eingefügt wird, nicht löschen Sie die ausgewählten Inhalte. Dies wurde behoben, indem die folgenden code
Finden Sie unter vollständiger Beispielcode
InformationsquelleAutor Ravi Selvaraj