Je cherche un moyen de faire 2 choses très basiques. Je veux juste récupérer la position du signe dans le texte. Ensuite, je veux placer le curseur dans une position spécifique dans le texte. Le but est de pouvoir modifier le texte par programmation.CKEditor 4: Comment obtenir et définir la position du curseur/curseur?
J'ai trouvé beaucoup de gens qui essayaient de faire des choses semblables mais pas tout à fait ce que je voulais. En fait, la plupart des solutions examinent le code HTML, recherchant des plages et des éléments DOM. Peut-être que c'est la voie à suivre, mais je n'ai pas trouvé de solution de travail.
Vous cherchez à obtenir la position du curseur. J'ai trouvé la solution suivante à partir de diverses sources (this one par exemple):
var selection = e.editor.getSelection();
var range = selection.getRanges()[0];
var cursor_position = range.startOffset;
Mais cela ne répond pas à mon problème. Dans le texte suivant:
d'Apple
Archers
Accent
Si le curseur est placé successivement directement après l'un de chaque mot, il renvoie 1 à chaque fois. Ce que je voudrais, c'est obtenir 1 quand positionné après le 1er A, puis 6 lorsqu'il est placé après le 2ème A, puis finalement 13 après le 3ème. En d'autres termes, il s'agit plus de savoir quelle position de caractère est le curseur à dans le texte. Cela devrait me permettre d'insérer du texte après le Xème caractère dans le texte par exemple.
Merci d'aider
Pour obtenir la position du curseur, vous devez jouer avec la sélection et les plages. Notez cependant que vous n'obtiendrez pas le résultat 1,6,13 attendu car ** CKEditor utilise le HTML en arrière-plan ** et non du texte brut. Si votre tâche est de retourner la position du curseur dans le texte de douleur en ignorant le HTML, s'il vous plaît préparez-vous pour beaucoup de frustration et de douleur, car vous aurez certainement dans de nombreux cas de bord. –
Bonjour @ j.swiderski, merci pour votre réponse. En fait, cela ne me dérange pas de jouer avec les gammes et la sélection si longtemps que j'arrive au résultat attendu. Mais jusqu'à présent, je ne vois pas comment. J'ai illustré le résultat par un comptage de lettres mais il m'est égal d'avoir la position décrite comme "Row1/Range3/Offset4", si longue qu'elle permet de renvoyer le curseur exactement où il était (en langage utilisateur "après un lettre dans un mot "). Les plages seules (comme dans le code donné) ne semblent pas suffisantes. – Xosted
S'il vous plaît voir https://dom.spec.whatwg.org/#interface-range et un ancien https://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level -2-Range-introduction car il a IMHO de bons exemples et de meilleures définitions. En général, chaque plage a un noeud de départ (startContainer) et un décalage dans ce noeud de départ. ** Les offsets sont relatifs à startContainer ** et ne montrent pas la position dans le document entier. Si vous avez réduit la sélection dans Apple ou Archers, par exemple '
A^pple
A^rchers
' alors le décalage est relatif au paragraphe (plage startContainer) et non par ex. corps. –