source

텍스트 영역에서 커서 위치를 얻으려면 어떻게 해야 합니까?

lovecheck 2023. 10. 19. 22:26
반응형

텍스트 영역에서 커서 위치를 얻으려면 어떻게 해야 합니까?

텍스트 영역이 있는데 자바스크립트로 커서가 텍스트 영역의 마지막 줄에 있는지 텍스트 영역의 첫 줄에 있는지 알고 싶습니다.

첫 번째 줄 문자와 마지막 줄 문자의 위치를 잡고 커서의 위치를 잡으려고 생각했습니다.

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.
  • 텍스트 영역 내에서 커서 위치를 잡을 수 있습니까?
  • 제가 텍스트 영역의 첫 줄에 있는지 마지막 줄에 있는지 알아볼 수 있는 더 좋은 제안이 있습니까?

jQuery 솔루션은 자바스크립트가 단순하거나 단순하지 않다면 선호합니다.

선택 항목이 없으면 속성을 사용할 수 있습니다..selectionStart아니면.selectionEnd(선택의 여지 없이 그들은 동등합니다.)

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

이는 구형 브라우저, 특히 IE8-에서는 지원되지 않습니다.거기서 당신은 텍스트 범위를 사용해야 할 것이지만, 그것은 완전히 좌절입니다.

그러나 입력 요소에서 선택/커서 위치를 얻고 설정하는 전용 라이브러리가 어딘가에 있다고 생각합니다.이름은 기억나지 않지만, 이 주제에 대한 기사는 수십 건에 달하는 것 같습니다.

표준 라이브러리에 있는 크로스 브라우저 기능은 다음과 같습니다.

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/

라인 번호와 컬럼 위치를 구하는 코드입니다.

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 요소입니다.

언급URL : https://stackoverflow.com/questions/7745867/how-do-you-get-the-cursor-position-in-a-textarea

반응형