繁体   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