Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取文本区域中的插入符号位置(IE)_Javascript - Fatal编程技术网

Javascript 获取文本区域中的插入符号位置(IE)

Javascript 获取文本区域中的插入符号位置(IE),javascript,Javascript,我想在文本区域内获得插入符号位置(仅限Internet Explorer)。 我有这个: document.activeElement.focus(); var sel2 = document.selection.createRange(); sel2.moveStart('character', -document.activeElement.value.length); var caretPos = sel2.text.length; alert(caretPos)

我想在文本区域内获得插入符号位置(仅限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
属性中,并且存在于提交给服务器的值中

我能看到的将换行计数为一个字符的唯一参数是:

  • 与其他浏览器的一致性
  • 代码> tExange<代码>方法将断线视为一个字符 我认为两者都不成立。首先,IE在将换行符计算为两个字符而不是一个字符方面已经与其他浏览器不一致。其次,IE的
    TextRange
    基于字符的方法有点疯狂,无论在哪里使用都会导致问题

    我认为将选择/插入位置作为相对于文本中的实际文本的位置是完全有意义的。这允许轻松地操纵文本

    这里有两个主要功能。第一个是我见过的唯一一个文本区域选择/插入符号位置获取功能,可以正确处理所有换行符。你可以在这里找到: . 其次,这里有一个互补的
    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();
    }
    

    可能的重复不是我所需要的,它计算新行的额外字符。这部分关于换行符的内容似乎没有被很好地理解,所以我认为这是一个合理的问题。什么是startOffset和endOffset?