簡體   English   中英

獲取文本區域(IE)中的插入符位置

[英]Get caret position in textarea (IE)

我想獲得文本區域內的插入符位置(僅Internet Explorer)。 我有這個:

document.activeElement.focus();             
var sel2 = document.selection.createRange();
sel2.moveStart('character', -document.activeElement.value.length);
var caretPos = sel2.text.length;
alert(caretPos);

如果textarea僅是一行,我會得到正確的結果,但是如果有很多行,則結果是錯誤的,因為新行會占用不可見的多余字符...

如何獲得正確的位置值(不刪除\\ r \\ n和類似的臟工作)?

我認為在計算選擇邊界/光標位置時將換行符計數為兩個字符是正確的方法。 根本上,這兩個字符\\r\\n在文本中。 它們存在於textarea的value屬性中,並且存在於提交給服務器的值中。

我可以看到的將換行符算作一個字符的唯一參數是:

  1. 與其他瀏覽器的一致性
  2. IE的TextRange方法將換行符視為一個字符

我認為這都不成立。 首先,IE在將換行符計算為兩個字符而不是一個字符時已經與其他瀏覽器不一致。 其次,IE的基於TextRange字符的方法無論如何還是有些瘋狂,無論在何處使用都會引起問題。

我認為將選擇/插入位置視為相對於文本區域中實際文本的位置是完全有意義的。 這樣可以輕松處理文本。

這是兩個主要功能。 第一個是我見過的唯一的textarea選擇/插入符號位置獲取功能,該功能可以在所有換行符中正常使用。 您可以在此處找到: 如何在文本區域中獲得選擇的起點和終點? 其次,這是一個補充的setSelection函數:

function offsetToRangeCharacterMove(el, offset) {
    return offset - (el.value.slice(0, offset).split("\r\n").length - 1);
}

function setSelection(el, startOffset, endOffset) {
    var range = el.createTextRange();
    var startCharMove = offsetToRangeCharacterMove(el, startOffset);
    range.collapse(true);
    if (startOffset == endOffset) {
        range.move("character", startCharMove);
    } else {
        range.moveEnd("character", offsetToRangeCharacterMove(el, endOffset));
        range.moveStart("character", startCharMove);
    }
    range.select();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM