Comment obtenir la position du curseur dans un champ de saisie?
J'ai trouvé quelques morceaux via Google, mais rien de pare-balles.
Fondamentalement, quelque chose comme un plugin jQuery serait idéal, donc je pourrais simplement faire
$("#myinput").caretPosition()
javascript
jquery
html
MarkB29
la source
la source
<input>
est beaucoup plus simple que de le faire dans un<textarea>
.size
caractères.Réponses:
Mise à jour plus simple:
Utilisez l'
field.selectionStart
exemple dans cette réponse .Merci à @commonSenseCode de l'avoir signalé.
Ancienne réponse:
J'ai trouvé cette solution. Pas basé sur jquery mais il n'y a aucun problème à l'intégrer à jquery:
la source
else if (oField.selectionStart || oField.selectionStart == '0')
pourrait êtreelse if (typeof oField.selectionStart==='number')
document.selection
, pasfield.selection
ou quelque chose. En outre, il était possible dans IE 7 (je ne sais pas s'il est toujours possible dans 8+) de sélectionner quelque chose, puis de TAB hors du champ sans perdre la sélection. De cette façon, lorsque le texte est sélectionné mais que le champ n'est pas focalisé,document.selection
retourne une sélection nulle. C'est pourquoi, comme solution de contournement pour ce bogue, vous devez vous concentrer sur l'élément avant de lire ledocument.selection
.Sympa, grand merci à Max.
J'ai encapsulé la fonctionnalité dans sa réponse dans jQuery si quelqu'un veut l'utiliser.
la source
input = $(this).get(0)
la même chose queinput = this
?this
réfère à un ensemble complet enveloppé. Son code est toujours faux cependant, il devrait l'êtrethis.get(0)
. Son code fonctionnait probablement encore car le ré-emballage d'un ensemble encapsulé ne fait rien.TRÈS FACILE
Réponse mise à jour
Utilisation
selectionStart
, il est compatible avec tous les principaux navigateurs .Mise à jour: cela ne fonctionne que si aucun type n'est défini ou
type="text"
sur l'entrée.la source
.selectionStart
propriété à tout moment (document.getElementById('foobar').selectionStart
), elle ne doit pas nécessairement se trouver dans un écouteur d'événements.Vous avez une solution très simple . Essayez le code suivant avec un résultat vérifié -
Je te donne le fiddle_demo
la source
slice
est une opération relativement coûteuse et n'ajoute rien à cette «solution» -el.selectionStart
équivaut à la longueur de votre tranche; il suffit de retourner cela. De plus, la raison pour laquelle les autres solutions sont plus compliquées est qu'elles traitent avec d'autres navigateurs qui ne prennent pas en chargeselectionStart
.f1
est à peu près aussi significatif que «user2782001». 😉Il existe maintenant un joli plugin pour cela: le plugin Caret
Ensuite, vous pouvez obtenir la position en utilisant
$("#myTextBox").caret()
ou la définir via$("#myTextBox").caret(position)
la source
la source
Il y a quelques bonnes réponses publiées ici, mais je pense que vous pouvez simplifier votre code et ignorer la vérification de la
inputElement.selectionStart
prise en charge: il n'est pas pris en charge uniquement sur IE8 et versions antérieures (voir la documentation ), ce qui représente moins de 1% de l' utilisation actuelle du navigateur .la source
Vous avez peut-être besoin d'une plage sélectionnée en plus de la position du curseur. Voici une fonction simple, vous n'avez même pas besoin de jQuery:
Disons que vous voulez l'appeler sur une entrée chaque fois qu'elle change ou que la souris déplace la position du curseur (dans ce cas, nous utilisons jQuery
.on()
). Pour des raisons de performances, il peut être judicieux d'ajoutersetTimeout()
ou quelque chose comme Underscores_debounce()
si les événements affluent:Voici un violon si vous voulez l'essayer: https://jsfiddle.net/Dhaupin/91189tq7/
la source
la source