window.getSelection - vs - document.selection
Celui-là marche pour moi :
function getCaretCharOffset(element) {
var caretOffset = 0;
if (window.getSelection) {
var range = window.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
preCaretRange.selectNodeContents(element);
preCaretRange.setEnd(range.endContainer, range.endOffset);
caretOffset = preCaretRange.toString().length;
}
else if (document.selection && document.selection.type != "Control") {
var textRange = document.selection.createRange();
var preCaretTextRange = document.body.createTextRange();
preCaretTextRange.moveToElementText(element);
preCaretTextRange.setEndPoint("EndToEnd", textRange);
caretOffset = preCaretTextRange.text.length;
}
return caretOffset;
}
// Demo:
var elm = document.querySelector('[contenteditable]');
elm.addEventListener('click', printCaretPosition)
elm.addEventListener('keydown', printCaretPosition)
function printCaretPosition(){
console.log( getCaretCharOffset(elm), 'length:', this.textContent.trim().length )
}
<div contenteditable>some text here <i>italic text here</i> some other text here <b>bold text here</b> end of text</div>
La ligne d'appel dépend du type d'événement, pour un événement clé, utilisez ceci :
getCaretCharOffsetInDiv(e.target) + ($(window.getSelection().getRangeAt(0).startContainer.parentNode).index());
pour l'événement souris, utilisez ceci :
getCaretCharOffsetInDiv(e.target.parentElement) + ($(e.target).index())
dans ces deux cas, je m'occupe des lignes de rupture en ajoutant l'indice cible
0 votes
Regardez sa position dans le texte. Ensuite, recherchez la dernière occurrence de '@' avant cette position. Donc, juste un peu de logique de texte.
0 votes
De plus, je ne prévois pas d'autoriser d'autres balises à l'intérieur du <diV>, seulement du texte.
0 votes
Ok, oui je Je suis going to need other tags within the <div>. Il y aura des balises <a>, mais il n'y aura pas d'imbrication...
0 votes
@Bertvan : si le signe d'insertion est à l'intérieur d'un fichier
<a>
à l'intérieur de l'élément<div>
Quel décalage voulez-vous alors ? Le décalage dans le texte à l'intérieur de l'élément<a>
?1 votes
It should never be inside an <a> element. L'élément <a> doit être rendu en html, de sorte que l'utilisateur ne puisse pas réellement y placer le signe d'insertion.
0 votes
Avez-vous trouvé un moyen d'obtenir la position du caret autour des éléments enfants html ? J'essaie de résoudre le même problème :(
0 votes
Cette réponse pourrait vous aider. Le code est meilleur que toutes les réponses données ici. Je ne sais pas s'il fonctionne à 100% pour tout mais il fonctionne pour tout ce dont j'ai besoin. stackoverflow.com/a/64823701/3245937