J'ai un div contentable où je dois insérer du texte à la position du curseur,
Cela peut être facilement fait dans IE par document.selection.createRange().text = "banana"
Existe-t-il une manière similaire de l'implémenter dans Firefox/Chrome?
(Je sais qu'une solution existe ici , mais elle ne peut pas être utilisée dans un div contentable et semble maladroite)
Je vous remercie!
La fonction suivante insérera du texte à la position du curseur et supprimera la sélection existante. Il fonctionne dans tous les navigateurs de bureau traditionnels:
function insertTextAtCursor(text) {
var sel, range;
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode( document.createTextNode(text) );
}
} else if (document.selection && document.selection.createRange) {
document.selection.createRange().text = text;
}
}
MISE À JOUR
Sur la base des commentaires, voici un code pour enregistrer et restaurer la sélection. Avant d'afficher votre menu contextuel, vous devez stocker la valeur de retour de saveSelection
dans une variable, puis passer cette variable dans restoreSelection
pour restaurer la sélection après avoir masqué le menu contextuel et avant d'insérer du texte.
function saveSelection() {
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
return sel.getRangeAt(0);
}
} else if (document.selection && document.selection.createRange) {
return document.selection.createRange();
}
return null;
}
function restoreSelection(range) {
if (range) {
if (window.getSelection) {
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else if (document.selection && range.select) {
range.select();
}
}
}
window.getSelection()
.Selection.getRangeAt(0).insertNode()
pour ajouter un nœud de texte.Si nécessaire, déplacez la position du curseur derrière le texte ajouté avec Selection.modify()
. (Non normalisé, mais cette fonctionnalité est prise en charge dans Firefox, Chrome et Safari)
function insertTextAtCursor(text)
{
let selection = window.getSelection();
let range = selection.getRangeAt(0);
range.deleteContents();
let node = document.createTextNode(text);
range.insertNode(node);
for(let position = 0; position != text.length; position++)
{
selection.modify("move", "right", "character");
};
}
// <div contenteditable id="myeditable">
// const editable = document.getElementById('myeditable')
// editable.focus()
// document.execCommand('insertHTML', false, '<b>B</b>anana')
document.execCommand('insertText', false, 'banana')