你如何获得文本区域中的光标位置?

IT技术 javascript jquery html input textarea
2021-01-21 01:41:46

我有一个 textarea,我想知道我是在 textarea 的最后一行还是 textarea 的第一行,我的光标是 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.
  • 是否可以在 textarea 中抓取光标位置?
  • 您是否有更好的建议来确定我是在 textarea 的第一行还是最后一行?

除非 JavaScript 如此简单或更简单,否则首选 jQuery 解决方案。

3个回答

如果没有选择,您可以使用属性.selectionStartor .selectionEnd(没有选择它们是相等的)。

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

请注意,较旧的浏览器不支持此功能,尤其是 IE8-。在那里您必须处理文本范围,但这完全令人沮丧。

不过,我相信某处有一个库专门用于获取和设置输入元素中的选择/光标位置。我不记得它的名字,但似乎有几十篇关于这个主题的文章。

@Alex福特:我现在看到它之前已经回答其实:stackoverflow.com/questions/2897155/...
2021-03-14 01:41:46
链接的答案在 IE < 9 中的换行符无法正常工作。请参阅我的答案。
2021-03-14 01:41:46
你是对的。我使用了一位回答者在您链接的问题上给出的 jquery 插件。做到了。抱歉重复。
2021-04-05 01:41:46
我想你在谈论 jquery caret 库
2021-04-05 01:41:46
党。有没有办法让它在 IE8 中工作?谢谢你的解决方案。
2021-04-07 01:41:46

这是我的标准库中的跨浏览器功能:

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/

它需要 JQuery 吗?我注意到 $ 符号的 bc
2021-03-17 01:41:46
不。我确实发布了使用 jQuery 获取元素引用的示例用法,但是您可以在没有 jQuery 的情况下获取元素引用。
2021-04-01 01:41:46
@TimDown - 你是对的。我现在意识到我在这里粘贴的版本,我一直<input>专门用于控件。我已经编辑了我的答案以使用也适用于<textarea>控件的版本
2021-04-02 01:41:46

这是获取行号和列位置的代码

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 元素