60 votes

Position du curseur dans une zone de texte (indice de caractère, pas de coordonnées x/y)

Comment puis-je obtenir la position du curseur dans un textarea en utilisant jQuery ? Je recherche le décalage du curseur par rapport au début du texte, et non pas la position (x, y) .

0 votes

Avez-vous besoin de savoir combien de caractères se trouvent dans la boîte ou où se trouve le curseur dans un corps de texte ? Le premier cas est possible, le second ne l'est (probablement) pas.

0 votes

Où se trouve le curseur dans le texte

90voto

Ryan Points 672

Modifié la solution de BojanG pour fonctionner avec jQuery. Testé dans Chrome, FF, et IE.

(function ($, undefined) {
    $.fn.getCursorPosition = function() {
        var el = $(this).get(0);
        var pos = 0;
        if('selectionStart' in el) {
            pos = el.selectionStart;
        } else if('selection' in document) {
            el.focus();
            var Sel = document.selection.createRange();
            var SelLength = document.selection.createRange().text.length;
            Sel.moveStart('character', -el.value.length);
            pos = Sel.text.length - SelLength;
        }
        return pos;
    }
})(jQuery);

Pour l'utiliser dans une zone de texte, procédez comme suit :

$("#myTextBoxSelector").getCursorPosition();

2 votes

Saisir un texte dans une entrée. En appuyant sur la flèche gauche, j'obtiens 1 lorsque le curseur se trouve avant le premier caractère. Si j'appuie à nouveau sur la gauche, j'obtiens un 0 mais le curseur reste là (à l'extrême gauche dans l'élément de saisie). Quelqu'un pourrait-il m'expliquer ce comportement ?

1 votes

En appuyant sur le retour arrière, le compte augmente. il devrait diminuer.

13voto

BojanG Points 1030
function caretPos(el)
{
    var pos = 0;
    // IE Support
    if (document.selection) 
    {
        el.focus ();
        var Sel = document.selection.createRange();
        var SelLength = document.selection.createRange().text.length;
        Sel.moveStart ('character', -el.value.length);
        pos = Sel.text.length - SelLength;
    }
    // Firefox support
    else if (el.selectionStart || el.selectionStart == '0')
        pos = el.selectionStart;

    return pos;

}

0 votes

J'ai essayé votre fonction dans FF et ça ne marche pas, à chaque fois, quoi qu'il arrive, j'obtiens 0.

0 votes

Également dans la dernière version de chrome, il retourne toujours 0

13voto

Kevin Points 956

J'ai fait quelques travaux en utilisant cette Fiche d'entrée masquée jQuery et j'ai trouvé la fonction caret très utile. J'ai tiré ce code du plugin ci-dessus

$.fn.caret = function (begin, end)
    {
        if (this.length == 0) return;
        if (typeof begin == 'number')
        {
            end = (typeof end == 'number') ? end : begin;
            return this.each(function ()
            {
                if (this.setSelectionRange)
                {
                    this.setSelectionRange(begin, end);
                } else if (this.createTextRange)
                {
                    var range = this.createTextRange();
                    range.collapse(true);
                    range.moveEnd('character', end);
                    range.moveStart('character', begin);
                    try { range.select(); } catch (ex) { }
                }
            });
        } else
        {
            if (this[0].setSelectionRange)
            {
                begin = this[0].selectionStart;
                end = this[0].selectionEnd;
            } else if (document.selection && document.selection.createRange)
            {
                var range = document.selection.createRange();
                begin = 0 - range.duplicate().moveStart('character', -100000);
                end = begin + range.text.length;
            }
            return { begin: begin, end: end };
        }
    }

Une fois que vous avez créé la fonction, vous pouvez effectuer des opérations comme celles qui suivent. Une fois encore, cette fonction a été tirée de la fonction d'entrée masquée de jQuery mentionnée ci-dessus.

$("#id").caret(); //get the begin/end caret position
$("#id").caret().begin;
$("#id").caret().end;
$("#otherId").caret(5); //set the caret position by index
$("#otherId").caret(1, 5); //select a range

12voto

dacracot Points 8567

Pas jQuery, mais juste Javascript...

var position = window.getSelection().getRangeAt(0).startOffset;

5voto

Maximilian Ruta Points 181

Cela fonctionne également dans IE9, Firefox et Chrome :

(function ($, undefined) {
    $.fn.getCursorPosition = function() {
        var el = $(this).get(0);
        var pos = 0;
        if('selectionStart' in el) {
            pos = el.selectionStart;
        } else if('selection' in document) {
            el.focus();
            var Sel = document.selection.createRange();
            var SelLength = document.selection.createRange().text.length;
            Sel.moveStart('character', -el.value.length);
            pos = Sel.text.length - SelLength;
        }
        return pos;
    }
})(jQuery);

Et je pense que c'est beaucoup plus propre que la version de Ryan.

0 votes

Quel est l'objectif de la undefined dans ce code ?

1 votes

Dans ce morceau de code il n'a pas de but. Mais en général, c'est ainsi que l'on remet undefined à undefined. C'est fou mais dans ECMAScript3 la variable "undefined" peut être réassignée à une autre valeur. Donc, si votre code repose sur le fait qu'undefined est indéfini, vous devez correctement réinitialiser la variable à undefined. La méthode ci-dessus est la meilleure pratique pour le faire.

0 votes

@MaximilianRuta pourquoi avez-vous inséré votre code dans la réponse d'un autre ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X