Как вы получаете позицию курсора в текстовой области? - PullRequest
60 голосов
/ 13 октября 2011

У меня есть текстовая область, и я хотел бы знать, нахожусь ли я на последней строке текстовой области или на первой строке текстовой области с моим курсором с JavaScript.

Я думал о захвате позиции первого символа новой строки и последнего символа новой строки, а затем о захвате позиции курсора.

var firstNewline = $('#myTextarea').val().indexOf('\n');
var lastNewline = $('#myTextarea').val().lastIndexOf('\n');

var cursorPosition = ?????;

if (cursorPosition < firstNewline)
    // I am on first line.
else if (cursorPosition > lastNewline)
    // I am on last line.
  • Возможно ли захватить позицию курсора внутри текстовой области?
  • У вас есть лучшее предложение узнать, нахожусь ли я на первой или последней строке текстовой области?

Ответы [ 5 ]

73 голосов
/ 13 октября 2011

Если нет выбора, вы можете использовать свойства .selectionStart или .selectionEnd (без выбора они равны).

var cursorPosition = $('#myTextarea').prop("selectionStart");

Обратите внимание, что это не поддерживается в старых браузерах, особенно в IE8-. Там вам придется работать с текстовыми диапазонами, но это вызывает полное разочарование.

Я полагаю, что где-то есть библиотека, которая предназначена для получения и установки выделений / позиций курсора в элементах ввода. Я не могу вспомнить его название, но статей на эту тему, похоже, десятки.

19 голосов
/ 13 октября 2011

Я проделал немалую работу над этим и опубликовал функцию для получения позиции каретки / выбора в текстовых областях в переполнении стека несколько раз.В отличие от почти любого другого кода, который делает это, он корректно работает с разрывами строк в IE <9. </p>

Вот пример вопроса с некоторым фоном:

Есть ли Интернет?Проводник одобрил замену selectionStart и selectionEnd?

А вот ссылка на написанный мной плагин jQuery, включающий эту функцию и другие связанные с выделением функции textarea:

https://github.com/timdown/rangyinputs

17 голосов
/ 13 октября 2011

Вот функция кросс-браузера, которая есть в моей стандартной библиотеке:

function getCursorPos(input) {
    if ("selectionStart" in input && document.activeElement == input) {
        return {
            start: input.selectionStart,
            end: input.selectionEnd
        };
    }
    else if (input.createTextRange) {
        var sel = document.selection.createRange();
        if (sel.parentElement() === input) {
            var rng = input.createTextRange();
            rng.moveToBookmark(sel.getBookmark());
            for (var len = 0;
                     rng.compareEndPoints("EndToStart", rng) > 0;
                     rng.moveEnd("character", -1)) {
                len++;
            }
            rng.setEndPoint("StartToStart", input.createTextRange());
            for (var pos = { start: 0, end: len };
                     rng.compareEndPoints("EndToStart", rng) > 0;
                     rng.moveEnd("character", -1)) {
                pos.start++;
                pos.end++;
            }
            return pos;
        }
    }
    return -1;
}

Используйте ее в своем коде так:

var cursorPosition = getCursorPos($('#myTextarea')[0])

Вот дополнительная функция:

function setCursorPos(input, start, end) {
    if (arguments.length < 3) end = start;
    if ("selectionStart" in input) {
        setTimeout(function() {
            input.selectionStart = start;
            input.selectionEnd = end;
        }, 1);
    }
    else if (input.createTextRange) {
        var rng = input.createTextRange();
        rng.moveStart("character", start);
        rng.collapse();
        rng.moveEnd("character", end - start);
        rng.select();
    }
}

http://jsfiddle.net/gilly3/6SUN8/

0 голосов
/ 11 августа 2015

Функция getCursorPos () вернет позицию курсора в GWT

    TextArea content = new TextArea();
    content.getCursorPos();
0 голосов
/ 04 августа 2015

Вот код для получения номера строки и положения столбца

function getLineNumber(tArea) {

    return tArea.value.substr(0, tArea.selectionStart).split("\n").length;
}

function getCursorPos() {
    var me = $("textarea[name='documenttext']")[0];
    var el = $(me).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;
    }
    var ret = pos - prevLine(me);
    alert(ret);

    return ret; 
}

function prevLine(me) {
    var lineArr = me.value.substr(0, me.selectionStart).split("\n");

    var numChars = 0;

    for (var i = 0; i < lineArr.length-1; i++) {
        numChars += lineArr[i].length+1;
    }

    return numChars;
}

tArea - элемент DOM текстовой области

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...