J'ai un éditeur de base basé sur execCommand
l'exemple présenté ici. Il existe trois façons de coller du texte dans la execCommand
zone:
- Ctrl+V
- Clic droit -> Coller
- Clic droit -> Coller en tant que texte brut
Je souhaite autoriser le collage uniquement de texte brut sans balisage HTML. Comment puis-je forcer les deux premières actions à coller du texte brut?
Solution possible: La façon dont je peux penser est de définir l'auditeur pour les événements de keyup pour ( Ctrl+ V) et de supprimer les balises HTML avant de coller.
- Est-ce la meilleure solution?
- Est-il à toute épreuve d'éviter tout balisage HTML en pâte?
- Comment ajouter un auditeur au clic droit -> Coller?
javascript
html
dom-events
execcommand
Googlebot
la source
la source
Réponses:
Il interceptera l'
paste
événement, annulera lepaste
et insérera manuellement la représentation textuelle du presse-papiers:http://jsfiddle.net/HBEzc/ . Cela devrait être le plus fiable:
Je ne suis pas sûr de la prise en charge de plusieurs navigateurs.
la source
text
contient du HTML (par exemple, si vous copiez du code HTML en texte brut), il le collera en fait en HTML. Voici une solution, mais ce n'est pas très joli: jsfiddle.net/HBEzc/3 .var text = (event.originalEvent || event).clipboardData.getData('text/plain');
offre un peu plus de compatibilité entre navigateurs<div></div>
ce contenu sera ajouté en tant qu'élément enfant de l'élément contenteditable. Je l'ai corrigé comme ceci:document.execCommand("insertText", false, text);
insertHTML
etinsertText
ne fonctionne pas dans IE11, maisdocument.execCommand('paste', false, text);
fonctionne très bien. Bien que cela ne semble pas fonctionner dans d'autres navigateurs> _>.Je n'ai pas pu obtenir la réponse acceptée ici pour fonctionner dans IE, alors j'ai fait quelques recherches et suis venu à cette réponse qui fonctionne dans IE11 et les dernières versions de Chrome et Firefox.
la source
Une solution proche comme pimvdb. Mais cela fonctionne avec FF, Chrome et IE 9:
la source
content
affectation des variables de court-circuit . J'ai trouvé que l'utilisationgetData('Text')
fonctionne avec plusieurs navigateurs, vous pouvez donc effectuer cette affectation une seule fois comme ceci:var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
il vous suffira alors d'utiliser la logique pour la commande coller / insérer entre les navigateurs.document.selection.createRange().pasteHTML(content)
... juste testé sur IE11 et ça ne marche pas comme ça.document.execCommand('insertText', false, content)
ne fonctionne pas à partir de IE11 et Edge. De plus, les dernières versions de Chrome prennent désormais en chargedocument.execCommand('paste', false, content)
, ce qui est plus simple. Ils pourraient être obsolètesinsertText
.Bien sûr, la question est déjà répondue et le sujet très ancien mais je veux fournir ma solution car elle est simple et propre:
Ceci est dans mon événement de collage sur mon contenteditable-div.
L'autre partie provient d'un autre article SO que je ne pouvais plus trouver ...
UPDATE 19.11.2014: L'autre SO-post
la source
Aucune des réponses publiées ne semble vraiment fonctionner sur plusieurs navigateurs ou la solution est trop compliquée:
insertText
n'est pas prise en charge par IEpaste
commande entraîne une erreur de débordement de pile dans IE11Ce qui a fonctionné pour moi (IE11, Edge, Chrome et FF) est le suivant:
Notez que le gestionnaire de collage personnalisé n'est nécessaire / fonctionne que pour les
contenteditable
nœuds. Comme les champstextarea
simples et lesinput
champs simples ne prennent pas du tout en charge le collage de contenu HTML, il n'y a donc rien à faire ici.la source
.originalEvent
gestionnaire d'événements (ligne 3) pour que cela fonctionne. Ainsi , les regards de ligne complète comme ceci:const text = ev.clipboardData ? ev.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
. Fonctionne dans les derniers Chrome, Safari, Firefox.Firefox ne vous permet pas d'accéder aux données du presse-papiers, vous devrez donc faire un «hack» pour le faire fonctionner. Je n'ai pas été en mesure de trouver une solution complète, mais vous pouvez le corriger pour les pâtes ctrl + v en créant une zone de texte et en la collant à la place:
la source
Je travaillais également sur un collage de texte brut et j'ai commencé à détester toutes les erreurs execCommand et getData, alors j'ai décidé de le faire de manière classique et cela fonctionne comme un charme:
Le code avec mes notations peut être trouvé ici: http://www.albertmartin.de/blog/code.php/20/plain-text-paste-with-javascript
la source
Le code ci-dessus fonctionne pour moi dans IE10 et IE11 et fonctionne maintenant également dans Chrome et Safari. Non testé dans Firefox.
la source
Dans IE11, execCommand ne fonctionne pas bien. J'utilise le code ci-dessous pour IE11
<div class="wmd-input" id="wmd-input-md" contenteditable=true>
est ma boîte div.J'ai lu les données du presse-papiers à partir de window.clipboardData et je modifie le textContent de div et donne le signe caret.
Je donne un timeout pour définir le caret, car si je ne règle pas le timeout, un caret va à la fin de div.
et vous devriez lire clipboardData dans IE11 de la manière ci-dessous. Si vous ne le faites pas, le caractère de nouvelle ligne n'est pas géré correctement, donc caret va mal.
Testé sur IE11 et chrome. Cela peut ne pas fonctionner sur IE9
la source
Après avoir longuement cherché et essayé, j'ai trouvé en quelque sorte une solution optimale
la source
OK car tout le monde essaie de contourner les données du presse-papiers, de vérifier l'événement de pression de touche et d'utiliser execCommand.
J'ai pensé à ça
CODE
la source