当用户单击按钮时,将文本字符串添加到输入字段中(在光标位置)

Posted

技术标签:

【中文标题】当用户单击按钮时,将文本字符串添加到输入字段中(在光标位置)【英文标题】:Add a string of text into an input field when user clicks a button (At Cursor Location) 【发布时间】:2016-08-29 08:16:09 【问题描述】:

我在这里找到了我需要的大部分解决方案:

Add a string of text into an input field when user clicks a button

问题是我需要将文本添加到光标位置的文本区域框中 - 此页面上的解决方案将文本字符串添加到文本区域框内容的末尾。

这是我的 HTML:

<textarea style="width:500px; height: 150px;" id="text">This is some text</textarea>

这是我的 Javascript:

$(function () 
$('#button').on('click', function () 
    var text = $('#text');
    text.val(text.val() + "\n\nafter clicking");    
);
$('#button2').on('click', function () 
    var text = $('#text');
    text.val(text.val() + "\n\nafter clicking 2");    
);  );

到目前为止,这是我的 JS 小提琴:

https://jsfiddle.net/2m8L3y3n/

我基本上希望插入的文本不只是在底部,而是光标碰巧在 textarea 框中的任何地方...

另外,如果我在一个页面上有多个 textarea 框,我如何让按钮绑定到特定的 textarea 框?在我的 JS 小提琴上,我有 2 个盒子,但只有第一个可以工作 - 有没有办法做到这一点,这样我就不必为每个盒子都有一个新的 javascript 代码?我可能在一个页面上有 10 个文本区域框,每个都有自己的一组按钮,所以我试图让代码易于管理。

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

我已经编写了一个示例函数来说明如何实现这一点。

https://jsfiddle.net/axcufrd0/2/

function insertText(text)

    var $textbox = $("#text");
    var textStr  = $textbox.text();
    var startPos = $textbox[0].selectionStart;
    var endPos   = $textbox[0].selectionEnd;

    // If set to true, the selection will NOT be replaced.
    // Instead, the text will be inserted before the first highlighted character.
    if (false)
    
        endPost = startPos;
    

    var beforeStr = textStr.substr(0, startPos);
    var afterStr  = textStr.substr(endPos, textStr.length);

    textStr = beforeStr + text + afterStr;
    $textbox.text(textStr);
    return textStr;

有了这个,我们想要拆分文本,然后将它与新内容连接起来。根据您执行此操作的方式,您可能想要替换选择文本或直接在之前或之后追加。

我没有花时间解决此代码的一个警告是,默认情况下,选择文本是 0 到 0。这意味着没有选择会将文本附加到文本框的最前面。

【讨论】:

谢谢!就光标位置而言,这就像一个魅力 - 关于如何将其应用于同一页面上的多个文本框,所有这些文本框都有自己的一组按钮? 是的。查看有关使用变量绑定事件的 jQuery 文档。您可以非常轻松地使用简单的绑定来回收一个函数。 api.jquery.com/on【参考方案2】:

您需要获取光标位置(索引)并使用 substring 拆分 textarea 文本并将字符串连接在一起以获得新文本:

有关获取光标位置的详细信息,请参阅this answer。

$(function () 
  $.fn.getCursorPosition = function() 
    var el = $(this).get(0);
    var pos = 0;
    if('selectionStart' in el) 
      pos = el.selectionStart;
     else if('selection' in document) 
      el.focus();
      var Sel = document.selection.createRange();
      var SelLength = document.selection.createRange().text.length;
      Sel.moveStart('character', -el.value.length);
      pos = Sel.text.length - SelLength;
    
    return pos;
  ;

  $('#button').on('click', function () 
    var text = $('#text');
    var cursorLocation = text.getCursorPosition();
    var originalText = text.val();
    var newText = originalText.substring(0, cursorLocation) + 'after clicking' + originalText.substring(cursorLocation);
    text.val(newText);
  );
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea style="width:500px; height: 150px;" id="text">This is some text</textarea>
<button id="button">Click Me</button>

【讨论】:

【参考方案3】:

你可以试试这个。----------------

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 (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 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;
    
<textarea style="width:500px; height: 150px;" id="text"></textarea>
    <br />
    <input type="button" onclick="insertAtCaret('text', ' text to insert')" value="Click Me to add Text" id="button" />
    <input type="button" onclick="insertAtCaret('text', ' Hello Man')" value="Click Me to add Text" id="button" />

【讨论】:

【参考方案4】:

References

代码:获取光标当前位置的函数

function getCaret(el) 
  if (el.selectionStart) 
    return el.selectionStart;
   else if (document.selection) 
    el.focus();
    var r = document.selection.createRange();
    if (r == null) 
      return 0;
    
    var re = el.createTextRange(),
      rc = re.duplicate();
    re.moveToBookmark(r.getBookmark());
    rc.setEndPoint('EndToStart', re);
    return rc.text.length;
  
  return 0;

点击按钮 2:

$('#button2').on('click', function() 
  var text = document.getElementById('text');
  var position = getCaret(text);
  console.log(position);
  console.log(text);
  //text.val(text.val() + "\n\nafter clicking 2");
  var currentPos = getCaret(text);
  //alert(currentPos);
  var strLeft = text.value.substring(0, currentPos);
  var strMiddle = "String to add";
  var strRight = text.value.substring(currentPos, text.value.length);
  text.value = strLeft + strMiddle + strRight;
);

如果有什么不清楚的地方请告诉我。

【讨论】:

以上是关于当用户单击按钮时,将文本字符串添加到输入字段中(在光标位置)的主要内容,如果未能解决你的问题,请参考以下文章

在按钮单击时将文本添加到现有输入字段

ActionListener添加到JButton但不起作用

Android - 按下按钮时将textview添加到布局

当用户以编程方式单击swift ios中的删除按钮时,如何将光标从一个文本字段自动移动到另一个文本字段?

Android - 按下按钮时将文本视图添加到布局

SwiftUI - 在按钮单击时添加一行多个文本字段/视图