web-dev-qa-db-fra.com

Obtenir la position du curseur dans la saisie HTML?

Comment obtenir l'index du curseur texte dans une entrée?

44
user345824

-> selectionStart

<!doctype html>

<html>
    <head>
        <meta charset = "utf-8">

        <script type = "text/javascript">
            window.addEventListener ("load", function () {
                var input = document.getElementsByTagName ("input");

                input[0].addEventListener ("keydown", function () {
                    alert ("Caret position: " + this.selectionStart);

                    // You can also set the caret: this.selectionStart = 2;
                });
            });
        </script>

        <title>Test</title>
    </head>

    <body>
        <input type = "text">
    </body>
</html>
37
Caio

Ce qui suit vous donnera le début et la fin de la sélection en tant qu'indices de caractères. Il fonctionne pour les entrées de texte et les zones de texte, et est légèrement compliqué en raison de l'étrange gestion des sauts de ligne par IE.

function getInputSelection(el) {
    var start = 0, end = 0, normalizedValue, range,
        textInputRange, len, endRange;

    if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
        start = el.selectionStart;
        end = el.selectionEnd;
    } else {
        range = document.selection.createRange();

        if (range && range.parentElement() == el) {
            len = el.value.length;
            normalizedValue = el.value.replace(/\r\n/g, "\n");

            // Create a working TextRange that lives only in the input
            textInputRange = el.createTextRange();
            textInputRange.moveToBookmark(range.getBookmark());

            // Check if the start and end of the selection are at the very end
            // of the input, since moveStart/moveEnd doesn't return what we want
            // in those cases
            endRange = el.createTextRange();
            endRange.collapse(false);

            if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
                start = end = len;
            } else {
                start = -textInputRange.moveStart("character", -len);
                start += normalizedValue.slice(0, start).split("\n").length - 1;

                if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
                    end = len;
                } else {
                    end = -textInputRange.moveEnd("character", -len);
                    end += normalizedValue.slice(0, end).split("\n").length - 1;
                }
            }
        }
    }

    return {
        start: start,
        end: end
    };
}

var textBox = document.getElementById("textBoxId");
textBox.focus();
alert( getInputSelection(textBox).start ); 
32
Tim Down

Il existe maintenant un plugin Nice jQuery pour cela: plugin Caret

Ensuite, vous pouvez simplement appeler $("#myTextBox").caret();

7
Jens Mikkelsen

Nous avions utilisé quelque chose comme ça pour une ancienne application javascript, mais je ne l'ai pas testée depuis quelques années:

function getCaretPos(input) {
    // Internet Explorer Caret Position (TextArea)
    if (document.selection && document.selection.createRange) {
        var range = document.selection.createRange();
        var bookmark = range.getBookmark();
        var caret_pos = bookmark.charCodeAt(2) - 2;
    } else {
        // Firefox Caret Position (TextArea)
        if (input.setSelectionRange)
            var caret_pos = input.selectionStart;
    }

    return caret_pos;
}
5
Pandincus

Exemple pratique pour obtenir le point du curseur dans la zone de texte:

function textbox()
{
    var ctl = document.getElementById('Javascript_example');
    var startPos = ctl.selectionStart;
    var endPos = ctl.selectionEnd;
    alert(startPos + ", " + endPos);
}
1
Bathri Nathan