Comme cela m'a pris une éternité pour comprendre l'utilisation de la nouvelle window.getSelection API que je vais partager pour la postérité. Notez que MDN suggère que window.getSelection bénéficie d'une prise en charge plus large, mais votre avis peut varier.
const getSelectionCaretAndLine = () => {
// our editable div
const editable = document.getElementById('editable');
// collapse selection to end
window.getSelection().collapseToEnd();
const sel = window.getSelection();
const range = sel.getRangeAt(0);
// get anchor node if startContainer parent is editable
let selectedNode = editable === range.startContainer.parentNode
? sel.anchorNode
: range.startContainer.parentNode;
if (!selectedNode) {
return {
caret: -1,
line: -1,
};
}
// select to top of editable
range.setStart(editable.firstChild, 0);
// do not use 'this' sel anymore since the selection has changed
const content = window.getSelection().toString();
const text = JSON.stringify(content);
const lines = (text.match(/\\n/g) || []).length + 1;
// clear selection
window.getSelection().collapseToEnd();
// minus 2 because of strange text formatting
return {
caret: text.length - 2,
line: lines,
}
}
Voici un jsfiddle qui se déclenche au démarrage. Notez cependant que les pressions rapides sur les touches directionnelles, ainsi que les suppressions rapides semblent être des événements à sauter.
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