2010-07-18 68 views
2

我想在文本区域(仅限Internet Explorer)中获取插入位置。 我有这样的:在textarea(IE)中获取插入位置

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和类似的脏东西)?

+0

可能重复[?如何让textarea的光标位置(http://stackoverflow.com/questions/263743/how-to-get-cursor-position- in-textarea) – kennytm 2010-07-18 08:43:28

+0

这不是我所需要的,它计算新行的额外字符。 – shivesh 2010-07-18 11:48:22

+1

这部分关于换行似乎一般不太理解,所以我认为这是一个合理的问题。 – 2010-07-18 15:43:26

回答

1

我认为在计算选择边界时计算换行符为两个字符/光标位置是正确的方法。基本上,这两个字符\r\n在文本中。它们出现在textarea的value属性中,并且它们位于提交给服务器的值中。

唯一的参数,我们可以看到计算行符为一个文字是:

  1. 一致性与其他浏览器
  2. IE的TextRange方法考虑换行作为一个字符

我想这两个都没有效。首先,在计算换行符时,IE与其他浏览器已经不一致,因为它是两个字符而不是一个字符。其次,IE的TextRange基于字符的方法无论如何都有点疯狂,无论它们在哪里使用都会导致问题。

我认为将选择/插入符号位置视为相对于textarea中实际文本的位置是完全合理的。这允许对文本进行简单的操作。

这里有两个主要功能。第一个是我见过的唯一的textarea选择/插入符号获取函数,它可以在所有换行符都正确运行。你可以在这里找到这个: How to get the start and end points of selection in text area?。其次,这里有一个互补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(); 
} 
+0

sweeeet ...谢谢! – iforce2d 2011-07-13 08:27:16

+0

什么是startOffset和endOffset? – nuander 2014-03-04 00:42:59

相关问题