Aucune des réponses affichées ne semble vraiment fonctionner sur plusieurs navigateurs ou la solution est trop compliquée :
- La commande
insertText
n'est pas pris en charge par IE
- Utilisation de la
paste
entraîne une erreur de dépassement de pile dans IE11
Ce qui a fonctionné pour moi (IE11, Edge, Chrome et FF) est le suivant :
$("div[contenteditable=true]").off('paste').on('paste', function(e) {
e.preventDefault();
var text = e.originalEvent.clipboardData ? e.originalEvent.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
_insertText(text);
});
function _insertText(text) {
// use insertText command if supported
if (document.queryCommandSupported('insertText')) {
document.execCommand('insertText', false, text);
}
// or insert the text content at the caret's current position
// replacing eventually selected content
else {
var range = document.getSelection().getRangeAt(0);
range.deleteContents();
var textNode = document.createTextNode(text);
range.insertNode(textNode);
range.selectNodeContents(textNode);
range.collapse(false);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
}
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<textarea name="t1"></textarea>
<div style="border: 1px solid;" contenteditable="true">Edit me!</div>
<input />
</body>
Notez que le gestionnaire de collage personnalisé n'est nécessaire/ne fonctionne que dans le cas de contenteditable
des nœuds. Comme les deux textarea
et simple input
ne permettent pas du tout de coller du contenu HTML, il n'y a donc rien à faire ici.