2010-07-18 96 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

相關問題