2012-01-26 66 views
2

這已經到了絕對的沮喪。我們正在嘗試編寫一些js,這些js將在與textarea相關聯的文本中的特定位置插入文本。它似乎應該很簡單,但到目前爲止我們還沒有弄清楚。爲什麼textarea.selectionStart不能在ie上工作?

使我們的過程複雜化的是我們有一個浮動菜單,您可以從中選擇要插入的內容。所以順序是:

  • 位置到textarea中所需的插入位置。使用調試器斷點,Visual Studio調試器指示textarea對象將selectionStart和selectionEnd定義爲具有正確值的數字。如果在這個休息時間,你嘗試寫js訪問selectionStart和selectionEnd你得到undefined(這是沒有道理的,但這裏有很多發佈說,其他人都有相同的問題)

  • 現在我們的位置到浮動菜單,它只不過是一個表格上的div包裝器,td元素調用插入文本的函數)。如果我們完全點擊td元素,文本將被插入到它所屬的位置。如果在任何時候我們點擊td元素外部但是在菜單內部,文檔選擇被重置爲文本區域的開始,並且我們插入錯誤的位置。

  • 我們嘗試捕獲與菜單關聯的onclick事件鏈,並且沒有任何明顯的事情會導致文檔選擇發生變化,但它的作用不大。

  • 我們嘗試了各種解決方法,我們將onClick放在textarea本身上,記住textarea的當前範圍,但總是在緩衝區的前端結束。

所以簡單來說:爲什麼不和的createTextRange文檔選擇行爲上即理性的態度和解決辦法?

jquery做了什麼解決這個問題,因爲對這個帖子最常見的答案似乎是使用jQuery。

+0

你可以通過閱讀它的源代碼來查看jQuery如何自己做它:http://code.jquery.com/jquery-latest.js – TJHeuvel

+0

我的罐頭推薦給與範圍/選擇有關的所有東西:** [使用Rangy]( http://code.google.com/p/rangy/).** –

回答

0

以下是插入插入符號的方法。

function insertAtCaret (areaId, text) { 
    var txtarea = document.getElementById(areaId), 
     scrollPos = txtarea.scrollTop, 
     strPos = 0, 
     range, front, back, 
     br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? 
     "ff" : (document.selection ? "ie" : false)); 
    if (br == "ie") { 
     txtarea.focus(); 
     range = document.selection.createRange(); 
     range.moveStart ('character', -txtarea.value.length); 
     strPos = range.text.length; 
    } 
    else if (br == "ff") strPos = txtarea.selectionStart; 

    front = (txtarea.value).substring(0,strPos); 
    back = (txtarea.value).substring(strPos,txtarea.value.length); 
    txtarea.value=front+text+back; 
    strPos = strPos + text.length; 
    if (br == "ie") { 
     txtarea.focus(); 
     range = document.selection.createRange(); 
     range.moveStart ('character', -txtarea.value.length); 
     range.moveStart ('character', strPos); 
     range.moveEnd ('character', 0); 
     range.select(); 
    } 
    else if (br == "ff") { 
     txtarea.selectionStart = strPos; 
     txtarea.selectionEnd = strPos; 
     txtarea.focus(); 
    } 
    txtarea.scrollTop = scrollPos; 
}; 

我原本是從這裏的答案中找到它的。

+0

我試過了,它總是從textarea的末尾插入1個字符,這導致我相信某些東西正在改變文件選擇的時間設置我們的插入點和插入文本的時間。 –

+0

你在使用這種方法之前修改了textarea中的文本嗎? –

+0

你說得對,它在IE中並不是100%的工作,對我來說它並不是插入到插入的地方,通常在文本區更遠的地方。 –

相關問題