在光标使用Javascript/jquery的位置插入文本

Cli*_*ote 161 javascript jquery

我有一个包含很多文本框的页面.当有人点击链接时,我希望在光标所在的位置插入一两个字,或者将其附加到具有焦点的文本框中.

例如,如果光标/焦点在文本框上,说"苹果",并且他点击了一个"[email]"的链接,那么我希望文本框说'apple bob@example.com'.

我怎样才能做到这一点?这是否可能,因为如果重点是收音机/下拉/非文本框元素怎么办?可以记住最后关注文本框的内容吗?

Geo*_*orn 234

使用此,从这里:

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

  var scrollPos = txtarea.scrollTop;
  var strPos = 0;
  var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ?
    "ff" : (document.selection ? "ie" : false));
  if (br == "ie") {
    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 ieRange = document.selection.createRange();
    ieRange.moveStart('character', -txtarea.value.length);
    ieRange.moveStart('character', strPos);
    ieRange.moveEnd('character', 0);
    ieRange.select();
  } else if (br == "ff") {
    txtarea.selectionStart = strPos;
    txtarea.selectionEnd = strPos;
    txtarea.focus();
  }

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

  • 这很有效,但它不会像所有文本编辑器那样处理替换所选文本.海报的原始问题可能不需要这样,但如果您需要,可以简单地用'txtArea.selectionEnd'替换'strPos'.如果您不需要支持旧版本的IE,下面的答案显示了这一点以及删除浏览器检测代码. (7认同)

qui*_*ilv 154

也许更短的版本,会更容易理解?

    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) );
    });
Run Code Online (Sandbox Code Playgroud)
<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" />
Run Code Online (Sandbox Code Playgroud)

我写这个是为了回应如何使用jquery从指针的当前位置向文本框添加文本?

  • 更改值后,您还可以使用以下命令恢复插入位置:`document.getElementById("txt").selectionStart = caretPos + txtToAdd.length`. (11认同)
  • 只是为了提供帮助,这是完整的解决方案,包括插入位置恢复,并用粘贴的内容替换所选区域:http://jsfiddle.net/NaHTw/1028/ (8认同)
  • 好吧,如果你要去那么远去除jQuery,你也可以[删除所有](http://jsfiddle.net/NaHTw/902/).; ^) (3认同)

Jef*_*mon 41

George Claghorn的批准答案非常适合在光标位置插入文本.如果用户选择了文本,并且您希望替换该文本(大多数文本的默认体验),则需要在设置"后退"变量时进行小的更改.

此外,如果您不需要支持旧版本的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;
}
Run Code Online (Sandbox Code Playgroud)


Col*_*son 20

上面的代码在IE中对我不起作用.这是基于这个答案的一些代码.

我取出了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();
  }
}
Run Code Online (Sandbox Code Playgroud)
input{width:100px}
label{display:block;margin:10px 0}
Run Code Online (Sandbox Code Playgroud)
<label for="in2copy">Copy text from: <input id="in2copy" type="text" value="x"></label>
<label for="in2ins">Element to insert: <input id="in2ins" type="text" value="1,2,3" autofocus></label>
<button onclick="insertAtCaret(document.getElementById('in2ins'),document.getElementById('in2copy').value)">Insert</button>
Run Code Online (Sandbox Code Playgroud)

编辑:添加了一个正在运行的代码片段,jQuery没有被使用.

  • `element.focus()`是DOMElements上的一个合法的JavaScript方法:http://www.w3schools.com/jsref/met_html_focus.asp (7认同)
  • 是的,我7年前写了这个答案。在这一点上,IE 11是一个很好的最低受支持版本,并且上面的代码可以在其中运行。 (2认同)

mat*_*001 6

使用@quick_sliv回答:

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