2009-06-30 161 views
128

我有一個包含大量文本框的頁面。當有人點擊鏈接時,我希望將一兩個單詞插入光標所在的位置,或者將其附加到具有焦點的文本框。例如,如果光標/焦點位於文本框「apple」上,並且他點擊了一個名爲'[email]'的鏈接,那麼我想讓文本框顯示'apple [email protected]'。在光標所在的位置使用Javascript插入文本/ jquery

我該怎麼做?這甚至有可能,因爲如果焦點放在收音機/下拉式/非文本框元素上?能記住最後關注文本框嗎?

+0

我認爲這是可能的,因爲它是WYSISYG編輯的基礎,怎麼做,我不知道。 – 2009-06-30 14:50:16

+0

他需要某物。不同。 – dusoft 2009-06-30 14:50:44

+0

可能的重複[如何用javascript插入字符在插入符號?](http://stackoverflow.com/questions/54147/how-do-i-insert-a-character-at-the-caret-with -javascript) – John 2012-06-14 13:32:04

回答

198

使用此,從here

\t function insertAtCaret(areaId, text) { 
 
\t \t var txtarea = document.getElementById(areaId); 
 
\t \t if (!txtarea) { return; } 
 

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

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

 
\t \t txtarea.scrollTop = scrollPos; 
 
\t }
<textarea id="textareaid"></textarea> 
 
<a href="#" onclick="insertAtCaret('textareaid', 'text to insert');return false;">Click Here to Insert</a>

+84

我可以給你買啤酒嗎?當真? – 2013-06-04 09:01:19

+0

wwwooooo,謝謝!!!!!!!!!!!!!!!!!!!!!!!!!!!!! – Fernando 2014-12-27 18:20:07

3

我想你可以使用下面的JavaScript追蹤最後聚焦的文本框:

<script> 
var holdFocus; 

function updateFocus(x) 
{ 
    holdFocus = x; 
} 

function appendTextToLastFocus(text) 
{ 
    holdFocus.value += text; 
} 
</script> 

用法:

<input type="textbox" onfocus="updateFocus(this)" /> 
<a href="#" onclick="appendTextToLastFocus('textToAppend')" /> 

先前的解決方案(道具gclaghorn)使用文本區域,並計算光標的位置了,所以它可能是你想要的東西更好。另一方面,如果這就是你想要的,那麼這個將會更輕量級。

17

上面的代碼在IE中並不適用於我。這裏的一些代碼基於Insert text into textarea with jQuery

我拿出了getElementById,所以我可以用不同的方式引用元素。

function insertAtCaret(element, text) { 
    if (document.selection) { 
     element.focus(); 
     var sel = document.selection.createRange(); 
     sel.text = text; 
     element.focus(); 
    } else if (element.selectionStart || element.selectionStart === 0) { 
     var startPos = element.selectionStart; 
     var endPos = element.selectionEnd; 
     var scrollTop = element.scrollTop; 
     element.value = element.value.substring(0, startPos) + text + element.value.substring(endPos, element.value.length); 
     element.focus(); 
     element.selectionStart = startPos + text.length; 
     element.selectionEnd = startPos + text.length; 
     element.scrollTop = scrollTop; 
    } else { 
     element.value += text; 
     element.focus(); 
    } 
} 
4

如何插入一些文本通過jQuery和JavaScript的一個TextBox的當前光標位置

過程

  1. 查找當前光標所在位置
  2. 獲取將複製的文本
  3. 設置那邊的文字
  4. 更新光標位置

這裏我有2個文本框和一個按鈕。我必須單擊文本框上的某個位置,然後單擊該按鈕將其他文本框中的文本粘貼到上一個文本框的位置。

這裏的主要問題是獲取當前光標位置,我們將粘貼文本。

//Textbox on which to be pasted 
<input type="text" id="txtOnWhichToBePasted" /> 

//Textbox from where to be pasted 
<input type="text" id="txtFromWhichToBePasted" /> 


//Button on which click the text to be pasted 
<input type="button" id="btnInsert" value="Insert"/> 


<script type="text/javascript"> 

$(document).ready(function() { 
    $('#btnInsert').bind('click', function() { 
      var TextToBePasted = $('#txtFromWhichToBePasted').value; 
      var ControlOnWhichToBePasted = $('#txtOnWhichToBePasted'); 

      //Paste the Text 
      PasteTag(ControlOnWhichToBePasted, TextToBePasted); 
     }); 
    }); 

//Function Pasting The Text 
function PasteTag(ControlOnWhichToBePasted,TextToBePasted) { 
    //Get the position where to be paste 

    var CaretPos = 0; 
    // IE Support 
    if (document.selection) { 

     ControlOnWhichToBePasted.focus(); 
     var Sel = document.selection.createRange(); 

     Sel.moveStart('character', -ctrl.value.length); 

     CaretPos = Sel.text.length; 
    } 
    // Firefox support 
    else if (ControlOnWhichToBePasted.selectionStart || ControlOnWhichToBePasted.selectionStart == '0') 
     CaretPos = ControlOnWhichToBePasted.selectionStart; 

    //paste the text 
    var WholeString = ControlOnWhichToBePasted.value; 
    var txt1 = WholeString.substring(0, CaretPos); 
    var txt2 = WholeString.substring(CaretPos, WholeString.length); 
    WholeString = txt1 + TextToBePasted + txt2; 
    var CaretPos = txt1.length + TextToBePasted.length; 
    ControlOnWhichToBePasted.value = WholeString; 

    //update The cursor position 
    setCaretPosition(ControlOnWhichToBePasted, CaretPos); 
} 

function setCaretPosition(ControlOnWhichToBePasted, pos) { 

    if (ControlOnWhichToBePasted.setSelectionRange) { 
     ControlOnWhichToBePasted.focus(); 
     ControlOnWhichToBePasted.setSelectionRange(pos, pos); 
    } 
    else if (ControlOnWhichToBePasted.createTextRange) { 
     var range = ControlOnWhichToBePasted.createTextRange(); 
     range.collapse(true); 
     range.moveEnd('character', pos); 
     range.moveStart('character', pos); 
     range.select(); 
    } 
} 

</script> 
1

接受的答案並沒有在Internet Explorer爲我工作9. 我檢查它和瀏覽器檢測而不能正常工作,它檢測FF(火狐)當我在IE瀏覽器。

我只是做了這種變化:

if ($.browser.msie) 

相反的:

if (br == "ie") { 

生成的代碼是這一個:

function insertAtCaret(areaId,text) { 
    var txtarea = document.getElementById(areaId); 
    var scrollPos = txtarea.scrollTop; 
    var strPos = 0; 
    var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? 
     "ff" : (document.selection ? "ie" : false)); 

    if ($.browser.msie) { 
     txtarea.focus(); 
     var range = document.selection.createRange(); 
     range.moveStart ('character', -txtarea.value.length); 
     strPos = range.text.length; 
    } 
    else if (br == "ff") strPos = txtarea.selectionStart; 

    var front = (txtarea.value).substring(0,strPos); 
    var back = (txtarea.value).substring(strPos,txtarea.value.length); 
    txtarea.value=front+text+back; 
    strPos = strPos + text.length; 
    if (br == "ie") { 
     txtarea.focus(); 
     var 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; 
} 
122

也許一個較短的版本,會更容易理解?

jQuery("#btn").on('click', function() { 
 
     var $txt = jQuery("#txt"); 
 
     var caretPos = $txt[0].selectionStart; 
 
     var textAreaTxt = $txt.val(); 
 
     var txtToAdd = "stuff"; 
 
     $txt.val(textAreaTxt.substring(0, caretPos) + txtToAdd + textAreaTxt.substring(caretPos)); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 

 
<textarea id="txt" rows="15" cols="70">There is some text here.</textarea> 
 
<input type="button" id="btn" value="OK" />

我在寫響應這How to add a text to a textbox from the current position of the pointer with jquery?

30

從喬治·克拉霍恩經批准的答案在光標位置插入簡單的文本偉大的工作。如果用戶選擇了文本,並且希望替換文本(默認情況下爲大多數文本),則需要在設置「後退」變量時進行一些小改動。另外,如果您不需要支持舊版本的IE,現代版本支持textarea.selectionStart,因此您可以取出所有瀏覽器檢測和IE特定的代碼。

這是一個簡化版,至少適用於Chrome和IE11,並處理替換選定的文本。

function insertAtCaret(areaId, text) { 
    var txtarea = document.getElementById(areaId); 
    var scrollPos = txtarea.scrollTop; 
    var caretPos = txtarea.selectionStart; 

    var front = (txtarea.value).substring(0, caretPos); 
    var back = (txtarea.value).substring(txtarea.selectionEnd, txtarea.value.length); 
    txtarea.value = front + text + back; 
    caretPos = caretPos + text.length; 
    txtarea.selectionStart = caretPos; 
    txtarea.selectionEnd = caretPos; 
    txtarea.focus(); 
    txtarea.scrollTop = scrollPos; 
} 
2

將文本添加到當前光標位置包括兩個步驟:

  1. 添加文本在當前光標位置
  2. 更新當前光標位置

演示:https://codepen.io/anon/pen/qZXmgN

測試Chrome 48,Firefox 45,IE 11和E DGE 25

JS:

function addTextAtCaret(textAreaId, text) { 
    var textArea = document.getElementById(textAreaId); 
    var cursorPosition = textArea.selectionStart; 
    addTextAtCursorPosition(textArea, cursorPosition, text); 
    updateCursorPosition(cursorPosition, text, textArea); 
} 
function addTextAtCursorPosition(textArea, cursorPosition, text) { 
    var front = (textArea.value).substring(0, cursorPosition); 
    var back = (textArea.value).substring(cursorPosition, textArea.value.length); 
    textArea.value = front + text + back; 
} 
function updateCursorPosition(cursorPosition, text, textArea) { 
    cursorPosition = cursorPosition + text.length; 
    textArea.selectionStart = cursorPosition; 
    textArea.selectionEnd = cursorPosition; 
    textArea.focus();  
} 

HTML:

<div> 
    <button type="button" onclick="addTextAtCaret('textArea','Apple')">Insert Apple!</button> 
    <button type="button" onclick="addTextAtCaret('textArea','Mango')">Insert Mango!</button> 
    <button type="button" onclick="addTextAtCaret('textArea','Orange')">Insert Orange!</button> 
</div> 
<textarea id="textArea" rows="20" cols="50"></textarea> 
4

使用@quick_sliv答案:

function insertAtCaret(el, text) { 
    var caretPos = el.selectionStart; 
    var textAreaTxt = el.value; 
    el.value = textAreaTxt.substring(0, caretPos) + text + textAreaTxt.substring(caretPos); 
}; 
0

內容編輯,HTML或任何其他的DOM元素選擇

如果您嘗試插入<div contenteditable="true">的插入符號,這會變得更加困難,尤其是在可編輯容器中有子項的情況下。

我不得不使用瘦長庫真正偉大的運氣:

它有一噸的強大功能,如:

  • 保存位置或選擇
  • 後來的後來,還原位置,或者選擇
  • 獲取選擇HTML或純文本
  • 其中許多人

在線演示是不工作我最後一次檢查,但回購已工作演示。要開始,只需從Git或NPM下載Repo,然後打開./rangy/demos/index.html

它使得使用插入符號pos和文本選擇變得輕而易舉!

相關問題