J'ai ce HTML simple comme exemple:
<div id="editable" contenteditable="true">
text text text<br>
text text text<br>
text text text<br>
</div>
<button id="button">focus</button>
Je veux une chose simple - lorsque je clique sur le bouton, je veux placer le curseur (curseur) à un endroit spécifique dans le div modifiable. De la recherche sur le Web, j'ai ce JS attaché au clic de bouton, mais cela ne fonctionne pas (FF, Chrome):
var range = document.createRange();
var myDiv = document.getElementById("editable");
range.setStart(myDiv, 5);
range.setEnd(myDiv, 5);
Est-il possible de définir manuellement la position du curseur de cette manière?
setSelectionRange()
fonction de la réponse que j'ai écrite ici: stackoverflow.com/questions/6240139/… . Comme je l'ai noté dans la réponse, il y a diverses choses qu'il ne gère pas correctement / systématiquement, mais cela peut être suffisant.document.createRange
(ouwindow.getSelection
, mais il n'ira pas aussi loin).La plupart des réponses que vous trouvez sur le positionnement du curseur contentable sont assez simplistes en ce sens qu'elles ne concernent que les entrées avec du texte simple. Une fois que vous utilisez des éléments html dans le conteneur, le texte saisi est divisé en nœuds et distribué généreusement dans une arborescence.
Pour définir la position du curseur, j'ai cette fonction qui boucle autour de tous les nœuds de texte enfant dans le nœud fourni et définit une plage allant du début du nœud initial au caractère chars.count :
J'appelle ensuite la routine avec cette fonction:
Le range.collapse (false) place le curseur à la fin de la plage. Je l'ai testé avec les dernières versions de Chrome, IE, Mozilla et Opera et elles fonctionnent toutes très bien.
PS. Si quelqu'un est intéressé, j'obtiens la position actuelle du curseur en utilisant ce code:
Le code fait le contraire de la fonction set - il obtient le window.getSelection (). FocusNode et focusOffset en cours et compte à rebours tous les caractères de texte rencontrés jusqu'à ce qu'il atteigne un nœud parent avec l'ID de containerId. La fonction isChildOf vérifie juste avant d'exécuter que le nœud fourni est en fait un enfant du parentId fourni .
Le code devrait fonctionner directement sans changement, mais je viens pris d'un plugin jQuery j'ai développé ont donc piraté un couple de cette de - laissez - moi savoir si quelque chose ne fonctionne pas!
la source
node.id
et je m'identifieparentId
sans exemple. Merci :)Si vous ne souhaitez pas utiliser jQuery, vous pouvez essayer cette approche:
editableDiv
votre élément modifiable, n'oubliez pas de définir unid
pour lui. Ensuite, vous devez obtenir votreinnerHTML
de l'élément et couper toutes les conduites de frein. Et réglez simplement l'effondrement avec les arguments suivants.la source
la source
Il est très difficile de placer le curseur dans la bonne position lorsque vous avez un élément avancé comme (p) (span) etc. Le but est d'obtenir (texte de l'objet):
la source
J'écris un surligneur de syntaxe (et un éditeur de code de base), et j'avais besoin de savoir comment taper automatiquement un caractère de guillemet simple et déplacer le curseur (comme beaucoup d'éditeurs de code de nos jours).
Voici un extrait de ma solution, grâce à l'aide de ce fil, aux documents MDN et à de nombreuses vidéos de surveillance de la console moz.
Ceci est dans un élément div contenteditable
Je laisse cela ici en guise de remerciement, réalisant qu'il existe déjà une réponse acceptée.
la source
J'ai fait ceci pour mon simple éditeur de texte.
Différences par rapport aux autres méthodes:
usage
selection.ts
la source
J'ai remanié la réponse de @ Liam. Je l'ai mis dans une classe avec des méthodes statiques, j'ai fait que ses fonctions reçoivent un élément au lieu d'un #id, et quelques autres petits ajustements.
Ce code est particulièrement utile pour fixer le curseur dans une zone de texte riche que vous pourriez créer
<div contenteditable="true">
. J'étais coincé là-dessus pendant plusieurs jours avant d'arriver au code ci-dessous.edit: Sa réponse et cette réponse ont un bug impliquant d'appuyer sur Entrée. Puisque enter ne compte pas comme un caractère, la position du curseur est perturbée après avoir appuyé sur Entrée. Si je parviens à corriger le code, je mettrai à jour ma réponse.
edit2: Épargnez-vous beaucoup de maux de tête et assurez-vous que le vôtre l'
<div contenteditable=true>
estdisplay: inline-block
. Cela corrige certains bugs liés à la mise en<div>
place de Chrome au lieu d'<br>
appuyer sur Entrée.Comment utiliser
Code
la source
Je pense que ce n'est pas simple de placer le curseur sur une position dans un élément contenteditable. J'ai écrit mon propre code pour cela. Il contourne l'arborescence des nœuds en calculant le nombre de caractères restants et place le curseur dans l'élément nécessaire. Je n'ai pas beaucoup testé ce code.
J'ai également écrit du code pour obtenir la position actuelle du curseur (je n'ai pas testé):
Vous devez également savoir que range.startOffset et range.endOffset contiennent un décalage de caractère pour les nœuds de texte (nodeType === 3) et un décalage de nœud enfant pour les nœuds d'élément (nodeType === 1). range.startContainer et range.endContainer peuvent faire référence à n'importe quel nœud d'élément de n'importe quel niveau de l'arborescence (bien sûr, ils peuvent également faire référence à des nœuds de texte).
la source
Basé sur la réponse de Tim Down, mais il recherche la dernière «bonne» ligne de texte connue. Il place le curseur à la toute fin.
De plus, je pourrais aussi vérifier récursivement / itérativement le dernier enfant de chaque dernier enfant consécutif pour trouver le dernier nœud de texte "bon" absolu dans le DOM.
la source