Obtenir la position du curseur dans contentEditable div
Je suis la recherche des tonnes de bon, crossbrowser anwers sur la façon de mettre le curseur ou la position du curseur dans un contentEditable DIV, mais pas sur la manière d'OBTENIR ou de trouver sa position...
Ce que je veux faire est de connaître la position du curseur à l'intérieur de ce div, sur keyup.
Ainsi, lorsque l'utilisateur tape du texte, je peux à tout moment de connaître sa position du curseur à l'intérieur de la div.
EDIT: je suis à la recherche de l'INDEX à l'intérieur de la div contenu (texte), pas les coordonnées du curseur.
<div id="contentBox" contentEditable="true"></div>
$('#contentbox').keyup(function() {
//... ?
});
De quoi avez-vous réellement envie de le faire avec la position du curseur une fois que vous avez eu?
Regardez sa position dans le texte. Ensuite, recherchez jusqu'à la dernière occurrence de " @ " avant cette position. Donc, juste du texte de la logique.
Aussi, je n'ai pas l'intention de permettre à d'autres balises à l'intérieur de la <diV>, seul le texte
ok, oui j' suis allez avoir besoin d'autres balises à l'intérieur de la <div>. Il y aura <a> balises, mais il n'y aura pas de nidification...
si le curseur est à l'intérieur d'un
Regardez sa position dans le texte. Ensuite, recherchez jusqu'à la dernière occurrence de " @ " avant cette position. Donc, juste du texte de la logique.
Aussi, je n'ai pas l'intention de permettre à d'autres balises à l'intérieur de la <diV>, seul le texte
ok, oui j' suis allez avoir besoin d'autres balises à l'intérieur de la <div>. Il y aura <a> balises, mais il n'y aura pas de nidification...
si le curseur est à l'intérieur d'un
<a>
élément à l'intérieur de la <div>
, ce décalage voulez-vous alors? Le décalage dans le texte à l'intérieur de la <a>
?OriginalL'auteur Bertvan | 2010-10-19
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Caret.js
Obtenir la position du curseur et le décalage de champ de texte
https://github.com/ichord/Caret.js
démo:
http://ichord.github.com/Caret.js
l'homme désolé, mais je ne suis pas l'auteur de Caret.js.
C'est doux. J'avais besoin de ce comportement pour définir curseur à la fin d'une
contenteditable
li
quand on clique sur un bouton pour renommerli
's de contenu.OriginalL'auteur J.Y Han
Quelques rides que je ne vois pas abordés dans les autres réponses:
Ici un moyen d'obtenir de début et de fin des postes de décalages à celle de l'élément textContent valeur:
C'est la réponse correcte et doit être marqué comme le droit de réponse
OriginalL'auteur mwag
Un peu en retard à la fête, mais au cas où quelqu'un d'autre est en difficulté. Aucun des recherches effectuées sur Google j'ai trouvé pour les deux derniers jours sont venus avec quelque chose qui fonctionne, mais je suis venu avec un concise et élégante solution que de travailler n'importe comment beaucoup de balises imbriquées vous avez:
Il sélectionne tout le chemin du retour au début du paragraphe et compte ensuite la longueur de la chaîne pour obtenir la position actuelle, puis annule la sélection de revenir le curseur à la position actuelle. Si vous voulez faire cela pour un document en entier (plus d'un paragraphe), puis changer
paragraphboundary
àdocumentboundary
ou quelle que soit la granularité pour votre cas. Découvrez l'API pour plus de détails. Cheers! 🙂<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 avanti
balise ou un enfant de l'élément html à l'intérieur dediv
, la position du curseur est en commençant à 0. Est-il un moyen d'échapper à ce redémarrage comte?Impair. Je ne suis pas arriver que le comportement dans Chrome. Quel navigateur utilisez-vous?
Ressemble à la sélection.modifier peut ou ne peut pas être pris en charge sur tous les navigateurs. developer.mozilla.org/en-US/docs/Web/API/Selection
OriginalL'auteur Soubriquet
Remarque: la portée de l'objet de son auto peut être stocké dans une variable, et peut être re-sélectionné à tout moment, à moins que le contenu de la contenteditable div changement.
De référence pour IE 8 et inférieur:
http://msdn.microsoft.com/en-us/library/ms535872(SV.85).aspx
De référence pour les normes (tous les autres) navigateurs:
https://developer.mozilla.org/en/DOM/range (mozilla docs, mais le code fonctionne dans chrome, safari, opera et ie9 trop)
OK, ça ressemble à l'appel .baseOffset .getSelection() fait le tour. Voilà donc, avec votre réponse, répond à ma question. Merci!
Malheureusement .baseOffset de travail uniquement dans webkit (je pense). De plus, cela ne vous donne le décalage à partir de la imediate parent de l'accent circonflexe (si vous avez un <b> balise à l'intérieur de la <div> il donnera le décalage à partir du début de la <b>, pas le début de la <div>. Des normes basées sur des plages d'utilisation de la gamme.endOffset gamme.startOffset gamme.endContainer et de la plage.startContainer pour obtenir le décalage entre le parent node de la sélection, et le nœud lui-même (ce qui inclut les nœuds de texte). IE offre une gamme.offsetLeft qui est le décalage à partir de la gauche dans pixels, et donc inutile.
Il est préférable de simplement stocker la gamme de l'objet de son soi et de l'utilisation de la fenêtre.getSelection().addrange(portée); <--des normes et de la plage.sélectionnez(); <--c'est à dire pour re-positionner le curseur au même endroit. gamme.insertNode(nodetoinsert); <--des normes et de la plage.pasteHTML(htmlcode); <--c'est à dire pour insérer du texte ou html à l'emplacement du curseur.
Le
Range
objet retourné par la plupart des navigateurs et laTextRange
objet renvoyé par IE sont extrêmement différentes choses, donc je ne suis pas sûr que cette réponse résout beaucoup.OriginalL'auteur Nico Burns
je vous remercie, mais il est également de retour {x: 0, y: 0} sur la ligne nouvelle.
OriginalL'auteur Nishad Up
Celui-ci fonctionne pour moi:
la ligne d'appel dépend du type d'événement, pour les principaux cas d'utilisation de ce:
pour l'événement de souris utiliser ceci:
sur ces deux cas, je prends soin de lignes de rupture par l'ajout de l'indice cible
typeof window.getSelection != "undefined"
être remplacé parwindow.getSelection
?OriginalL'auteur Jonathan R.
Que cela m'a pris une éternité à comprendre à l'aide de la nouvelle de la fenêtre.getSelection API, je vais partager pour la postérité. Notez que MDN suggèrent qu'il y a un plus grand soutien de la fenêtre.getSelection, cependant, votre kilométrage peut varier.
Ici est un jsfiddle que feux sur keyup. Notez cependant, que rapide touche directionnelle presses, ainsi que la suppression rapide semble ignorer les événements.
OriginalL'auteur Chris Sullivan
Directement, qui parcourt tous les enfants de la contenteditable div jusqu'à ce qu'il frappe le endContainer. Puis-je ajouter de la fin du conteneur de décalage et nous ont le caractère d'index. Fonctionne avec n'importe quel nombre d'imbrications. utilise la récursivité.
Remarque: nécessite un poly remplir pour ie soutien
Element.closest('div[contenteditable]')
https://codepen.io/alockwood05/pen/vMpdmZ
OriginalL'auteur alockwood05