2017-08-17 4 views
1

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

+0

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. –

+0

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

+0

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. –

Répondre

0

En regardant votre dernier commentaire, vous pouvez essayer quelque chose comme la mise en œuvre des signets dans CKEditor mais plus durable. Comme je l'ai expliqué, les marque-pages originaux sont supprimés lorsque vous publiez des données sur le serveur ou que vous passez simplement en mode source et inversement. Qui plus est, les plages vides que je suggérerais d'utiliser sont supprimées par l'éditeur car elles n'ont aucune représentation visuelle et sont considérées comme des ordures.

Qu'est-ce que vous pouvez faire est d'utiliser protectedSource pour protéger votre marque personnalisée couvre:

var editor = CKEDITOR.replace('editor1', { 
    language: 'en', 
    protectedSource : /<span.*class="my-break-point".*\/>/g 
}); 

Ensuite vous devrez venir avec un code personnalisé qui insérera <span class="my-break-point"/> dans l'éditeur HTML chaque fois que vous en avez besoin et de garder trace de signets afin qu'il supprime le précédent lorsque le suivant est inséré.

Bien sûr, ce n'est qu'un exemple de base. Vous pouvez avoir un signet pour la sélection réduite ou deux signets pour le début/la fin de la sélection si la sélection n'est pas réduite.

S'il vous plaît essayez d'insérer des signets d'abord et voir ce qui est inséré dans HTML pour effondrés et des sélections non-effondrés: - https://docs.ckeditor.com/ckeditor4/docs/#!/api/CKEDITOR.dom.range-method-createBookmark - https://docs.ckeditor.com/ckeditor4/docs/#!/api/CKEDITOR.dom.range-method-createBookmark2

Exemple de code:

var range = editor.getSelection().getRanges()[0]; 
var bm = range.createBookmark(); 

Si quelque chose ne sait pas, s'il vous plaît faites le moi savoir.

+0

Merci beaucoup pour votre aide. J'ai commencé à jouer avec les signets pour voir ce qui se passait. Au début, il semblait parfait mais en effet, ils ne sont pas durables. Je peux sérialiser l'objet bookmark et l'enregistrer dans la base de données, mais je ne peux pas revenir à ce signet si je recharge le document (même s'il a été enregistré aussi). La création de mes propres signets est la prochaine étape. Je vais essayer ce que vous avez suggéré. Cependant, je sens que je ne comprends toujours pas pourquoi il est si difficile d'obtenir "l'adresse" du signe dans le document (ou l'arbre des noeuds). – Xosted

+0

Pour mettre un marque-page au bon endroit, j'ai besoin de la position du signe dans le document (son «adresse»), quelle que soit sa forme ou sa forme. Je ne comprends pas pourquoi je ne peux pas simplement enregistrer cette information "adresse" dans un db et revenir plus tard à ce point. – Xosted