在光标使用 Javascript/jquery 的地方插入文本

IT技术 javascript jquery
2021-01-19 20:37:55

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

例如,如果光标/焦点位于显示“apple”的文本框上,而他单击了显示“[email]”的链接,那么我希望该文本框显示“apple bob@example.com”。

我怎样才能做到这一点?这甚至是可能的,因为如果焦点在单选/下拉/非文本框元素上怎么办?可以记住最后一个关注文本框的内容吗?

6个回答

使用这个,从这里

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;
}
<textarea id="textareaid"></textarea>
<a href="#" onclick="insertAtCaret('textareaid', 'text to insert');return false;">Click Here to Insert</a>

如何在鼠标位置插入文本?
2021-03-26 20:37:55
这很好用,但它不像所有文本编辑器那样处理替换选定的文本。对于海报的原始问题,这可能不需要,但如果您需要它,您可以简单地将 'strPos' 替换为 'txtArea.selectionEnd'。如果您不需要支持旧版本的 IE,我下面的回答显示了这一点,并删除了浏览器检测代码。
2021-04-03 20:37:55
有没有办法用 选择所有元素areaId
2021-04-06 20:37:55
您可以通过插入这样的功能来实现自动删除所选文本。 function deleteTxt() { var ele = document.getElementById('yourTextarea'); var text = ele.value; text = text.slice(0, ele.selectionStart) + text.slice(ele.selectionEnd); ele.value = text; return text; }
2021-04-07 20:37:55
你是最好的!
2021-04-09 20:37:55

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

    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" />

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

只是为了帮助,这里是插入符号位置恢复的完整解决方案,并用粘贴的内容替换选定区域:jsfiddle.net/NaHTw/1028
2021-03-21 20:37:55
您还可以在使用 : 更改值后恢复插入符号位置document.getElementById("txt").selectionStart = caretPos + txtToAdd.length
2021-03-28 20:37:55
为我工作,谢谢。仅供参考,通过 jquery 选择器 $("#") 不存在“selectionStart”属性。你需要通过 document.getElementById()
2021-04-07 20:37:55
jsfiddle.net/NaHTw/802是您的解决方案,添加了一些额外的内容以用粘贴的内容替换所选区域
2021-04-08 20:37:55
好吧,如果您打算删除 jQuery,那么您不妨将其全部删除;^)
2021-04-08 20:37:55

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

另外,如果你不需要支持老版本的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;
}
这很好,但它没有考虑元素maxlength,因此插入后的结果值可能比最大值长。
2021-03-15 20:37:55

上面的代码在 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();
  }
}
input{width:100px}
label{display:block;margin:10px 0}
<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>

编辑:添加了一个正在运行的代码段,jQuery is not being used

元素是否是 jquery 对象?element.value 和 element.focus() 不能同时工作......
2021-03-26 20:37:55
最好的主意是放弃 IE 兼容性。
2021-03-26 20:37:55
element.focus()是 DOMElements 上的合法 JavaScript 方法:w3schools.com/jsref/met_html_focus.asp
2021-03-27 20:37:55
是的,我 7 年前写了这个答案。在这一点上 IE 11 是一个很好的最低支持版本,上面的代码在那里工作。
2021-04-08 20:37:55

使用@quick_sliv 回答:

function insertAtCaret(el, text) {
    var caretPos = el.selectionStart;
    var textAreaTxt = el.value;
    el.value = textAreaTxt.substring(0, caretPos) + text + textAreaTxt.substring(caretPos);
};
我发现最简单的答案非常有效!这应该是公认的答案。
2021-03-28 20:37:55