Je trouve des tonnes de bonnes réponses crossbrowser sur la façon de définir la position de l'index du curseur ou du curseur dans un contentEditable
élément, mais aucune sur la façon d'obtenir ou de trouver son index ...
Ce que je veux faire, c'est connaître l'index du curseur dans cette div, sur keyup
.
Ainsi, lorsque l'utilisateur tape du texte, je peux à tout moment connaître l'index de son curseur dans l' contentEditable
élément.
EDIT: Je recherche l' INDEX dans le contenu div (texte), pas les coordonnées du curseur.
<div id="contentBox" contentEditable="true"></div>
$('#contentbox').keyup(function() {
// ... ?
});
<a>
élément à l'intérieur de<div>
, quel décalage voulez-vous alors? Le décalage dans le texte à l'intérieur du<a>
?Réponses:
Le code suivant suppose:
<div>
et aucun autre nœudwhite-space
propriété CSS définie surpre
Si vous avez besoin d'une approche plus générale qui fonctionnera avec du contenu avec des éléments imbriqués, essayez cette réponse:
https://stackoverflow.com/a/4812022/96100
Code:
la source
<a>
élément à l'intérieur de<div>
, quel décalage voulez-vous alors? Le décalage dans le texte à l'intérieur du<a>
?keyup
c'est probablement le mauvais événement pour cela, mais c'est ce qui a été utilisé dans la question d'origine.getCaretPosition()
lui-même est bien dans ses propres limites.<br>
ou<div>
, qui viole la première hypothèse mentionnée dans la réponse. Si vous avez besoin d'une solution un peu plus générale, vous pouvez essayer stackoverflow.com/a/4812022/96100Quelques rides que je ne vois pas abordées dans d'autres réponses:
Voici un moyen d'obtenir les positions de début et de fin sous forme de décalages par rapport à la valeur textContent de l'élément:
la source
la source
Essaye ça:
Caret.js Obtenir la position du curseur et le décalage à partir du champ de texte
https://github.com/ichord/Caret.js
démo: http://ichord.github.com/Caret.js
la source
contenteditable
li
lorsque je cliquais sur un bouton pour renommerli
le contenu de.Un peu tard à la fête, mais au cas où quelqu'un d'autre aurait du mal. Aucune des recherches Google que j'ai trouvées au cours des deux derniers jours n'a abouti à quoi que ce soit qui fonctionne, mais j'ai trouvé une solution concise et élégante qui fonctionnera toujours quel que soit le nombre de balises imbriquées que vous avez:
Il sélectionne jusqu'au début du paragraphe, puis compte la longueur de la chaîne pour obtenir la position actuelle, puis annule la sélection pour ramener le curseur à la position actuelle. Si vous voulez faire cela pour un document entier (plus d'un paragraphe), changez
paragraphboundary
endocumentboundary
ou en toute granularité pour votre cas. Consultez l'API pour plus de détails . À votre santé! :)la source
<div contenteditable> some text here <i>italic text here</i> some other text here <b>bold text here</b> end of text </div>
Chaque fois que je place le curseur avant lai
balise ou tout élément html enfant à l'intérieurdiv
, la position du curseur commence à 0. Existe-t-il un moyen d'échapper à ce compte de redémarrage?la source
Celui-ci fonctionne pour moi:
La ligne appelante dépend du type d'événement, pour l'événement clé, utilisez ceci:
pour l'événement de souris, utilisez ceci:
sur ces deux cas je prends soin des lignes de rupture en ajoutant l'index cible
la source
Remarque: l'objet range lui-même peut être stocké dans une variable et peut être re-sélectionné à tout moment à moins que le contenu de la div contenteditable change.
Référence pour IE 8 et versions antérieures : http://msdn.microsoft.com/en-us/library/ms535872(VS.85).aspx
Référence pour les navigateurs standards (tous les autres): https://developer.mozilla.org/en/DOM/range (c'est la documentation mozilla, mais le code fonctionne aussi dans Chrome, Safari, Opera et ie9)
la source
Range
objet renvoyé par la plupart des navigateurs et l'TextRange
objet renvoyé par IE sont des choses extrêmement différentes, donc je ne suis pas sûr que cette réponse résout beaucoup.Comme cela m'a pris une éternité à comprendre l'utilisation de la nouvelle API window.getSelection, je vais partager pour la postérité. Notez que MDN suggère qu'il existe une prise en charge plus large de window.getSelection, mais votre kilométrage peut varier.
Voici un jsfiddle qui se déclenche sur keyup. Notez cependant que les pressions rapides sur les touches directionnelles, ainsi que la suppression rapide semblent être des événements de saut.
la source
Une manière simple, qui itère à travers tous les chidren de la div contenteditable jusqu'à ce qu'elle atteigne le endContainer. Ensuite, j'ajoute le décalage du conteneur de fin et nous avons l'index des caractères. Devrait fonctionner avec n'importe quel nombre d'emboîtements. utilise la récursivité.
Remarque: nécessite un remplissage poly pour ie pour soutenir
Element.closest('div[contenteditable]')
https://codepen.io/alockwood05/pen/vMpdmZ
la source