Comment faire pour déplacer le curseur à la fin de contenteditable entité
J'ai besoin de déplacer le curseur à la fin de contenteditable
noeud comme sur Gmail widget notes.
J'ai lu les threads sur StackOverflow, mais ces solutions sont basées sur l'utilisation des intrants et ils ne fonctionnent pas avec contenteditable
éléments.
Vous devez vous connecter pour publier un commentaire.
Il y a aussi un autre problème.
La Nico Brûlures's solution fonctionne si le
contenteditable
div ne contient pas d'autres multilined éléments.Par exemple, si une div qui contient d'autres divs, et ces autres divs contenir d'autres trucs à l'intérieur, peut se produire des problèmes.
Afin de les résoudre, j'ai arrangé la solution suivante, qui est une amélioration de la Nico's:
Utilisation:
De cette façon, le curseur est certainement positionné à la fin du dernier élément, éventuellement imbriqués.
EDIT #1: pour être plus générique, l'instruction while devrait tenir également compte de toutes les autres balises qui ne peut pas contenir de texte. Ces éléments sont nommés vide éléments, et dans cette question il existe quelques méthodes sur la façon de tester si un élément est vide. Donc, en supposant qu'il existe une fonction appelée
canContainText
qui renvoietrue
si l'argument n'est pas un vide de l'élément, la ligne de code suivante:doit être remplacé par:
EDIT #2: Le code ci-dessus est entièrement mis à jour, avec tous les changements décrits et discutés
Uncaught TypeError: Cannot read property 'nodeType' of null
et c'est à partir de la getLastChildElement fonction appelée. Savez-vous ce qui pourrait être à l'origine de ce problème?Geowa4 est la solution pour un textarea, mais pas pour un contenteditable élément.
Cette solution est de déplacer le curseur à la fin d'une contenteditable élément. Il devrait fonctionner dans tous les navigateurs qui supportent contenteditable.
Il peut être utilisé par un code similaire:
selection.modify('move', 'left', 'character')
. Fonctionne dans Chrome pour moi, voir Sélection#modifier et Sélection docs.selectNodeContents
partie de Nico me donnait des erreurs dans Chrome et FF (n'a pas à tester d'autres navigateurs) jusqu'à ce que j'ai découvert que j'ai apparemment besoin d'ajouter.get(0)
à l'élément que j'étais en train de nourrir la fonction. Je suppose que cela a à voir avec moi à l'aide de jQuery au lieu de nu JS? J'ai appris cela d' @jwarzech question 4233265. Merci à tous!.get(0)
récupère l'élément dom jQuery qui stocke en interne. Vous pouvez également ajouter[0]
, ce qui est équivalent à.get(0)
dans ce contexte.document
dedocument.createRange()
pourrait être le même document que le nœud (élément de), vous essayez de sélectionner est en...Rangy
bibliothèque?var range = rangy.createRange().selectNodeContents(contentEditableElement).collapse(false); rangy.getSelection().setSingleRange(range);
devrait fonctionner (bien que je n'ai pas testé). C'est essentiellement la première bifurcation de la fonction ci-dessus avec DOM gamme des appels remplacé par longiligne appels.range.collapse(false); range.setEnd(contentEditableElement, 2);
Si vous n'avez pas de soins sur les navigateurs plus anciens, celui-ci a fait l'affaire pour moi.
Il est possible de régler le curseur à la fin, la plage:
setCaretToEnd()
à chaque fois invoquer uniquement lorsque vous en avez besoin: par exemple, après le Copier-Coller, ou après la restriction de la longueur du message.J'ai eu un problème similaire en essayant de faire un élément modifiable. Il a été possible de Chrome et FireFox, mais dans FireFox le signe soit vers le début de l'entrée ou il est allé un espace après la fin de l'entrée. Très déroutant pour l'utilisateur final je pense, en essayant d'en modifier le contenu.
Je n'ai trouvé aucune solution à essayer plusieurs choses. Seule chose qui a fonctionné pour moi a été de "contourner le problème en mettant un texte d'entrée à l'INTÉRIEUR de mon . Maintenant, il fonctionne. Semble comme "contenu modifiable" est toujours à la pointe de la tech, qui peut ou peut ne fonctionne pas comme tu le voudrais au travail, selon le contexte.
Déplaçant le curseur à la fin de l'modifiable durée en réponse à des événements de focus:
Et de l'appeler dans le gestionnaire d'événements (Réagir ici):