【问题标题】:Insert value into TEXTAREA where cursor was将值插入光标所在的 TEXTAREA
【发布时间】:2011-08-18 20:22:36
【问题描述】:

我有一个 textarea 和一个带有值的 div。当我点击一个值时,我将它插入到 textarea 中。我需要将它插入到我的光标在 textarea 中的位置。为什么我说WAS?因为当我将它移出并单击要插入的值时,我认为它会失去文本区域的焦点。

所以,我的问题是,有没有办法“记住”textarea 中的最新光标位置,然后在该位置插入我的值?

也许它可能是字符串中的字符数?..目前我这样添加:

input.val( function( i, val ) { return val + " " + myInsert + " "; } );

我也用jQuery,也许我可以用它?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

我编写了一个跨浏览器的 jQuery 插件,用于处理 textareas 和文本输入中的插入符号/选择,称为 Rangy inputs(可怕的名字,我真的应该想一个更好的名字)。结合此方法和Edgar Villegas Alvarado's answer 中的技术应该可以解决问题,尽管在 IE 中,focusout 事件触发得太晚,您需要改用专有的beforedeactivate 事件:

var $textBox = $("#foo");

function saveSelection(){
    $textBox.data("lastSelection", $textBox.getSelection());
}

$textBox.focusout(saveSelection);

$textBox.bind("beforedeactivate", function() {
    saveSelection();
    $textBox.unbind("focusout");
});

稍后插入文本时,以下将在前一个光标位置插入文本(或覆盖先前选择的文本,如果用户选择了任何文本):

var selection = $textBox.data("lastSelection");
$textBox.focus();
$textBox.setSelection(selection.start, selection.end);
$textBox.replaceSelectedText("Some new text");

在此处查看 jsFiddle 示例:http://jsfiddle.net/rQXrJ/1/

【讨论】:

  • 这太棒了!但是在 IE 中,标签被插入到字符串的开头。在 FF 中效果很好。
  • 那是因为focusout在IE中来不及了:你需要使用beforedeactivate。修改...
  • @BSQ:干得好。我假设那是 WebKit/Blink-only?其他浏览器从未实现 textInput 事件,并且您的更改在 Firefox 中不起作用(我没有测试过 IE,但我敢打赌它不会起作用)。
【解决方案2】:

这是您尝试做的工作示例,请查看: http://jsfiddle.net/J5Z2n/1/

你好,我的好朋友.... 你好吗

jQuery:

函数 insertAt (myField, myValue, startSel, endSel) { if (startSel || startSel == '0') { var startPos = startSel; var endPos = endSel; myField.val(myField.val().substring(0, startPos)+ myValue+ myField.val().substring(endPos, myField.val().length)); } 别的 { myField.val() += myValue; } } //调用函数 var targetBox = $('textarea#insert'), 开始选择, 结束选择; targetBox.bind('focusout', function() { //insertAtCursor(this, '你好吗'); startSel = this.selectionStart; endSel = this.selectionEnd; }); $("#myvalue").click(function() { var myValue = $(this).text(); insertAt(targetBox, myValue, startSel, endSel); });

原来的功能是从这个帖子借来的 http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript

我希望这应该会给你一个坚实的开端。干杯

【讨论】:

    【解决方案3】:

    如果插入符号(光标)位于文本字段中的某个位置,它会在 Javascript 中注册为空选择。即 selectionStart 和 selectionEnd 属性是相同的。您可以使用这些属性来检测插入符号的位置。

    【讨论】:

    • 如果我知道插入符号的位置,我仍然不确定如何插入我的值?我迫切需要一些例子。谢谢。
    【解决方案4】:

    显然 selectionStart 和 selectionEnd 在这里非常有用。看一下这个: http://www.scottklarr.com/topic/425/how-to-insert-text-into-a-textarea-where-the-cursor-is/

    【讨论】:

      【解决方案5】:

      您可以使用jQuery Caret plugin 获取/设置光标位置。
      用法示例:

      var cursorPosition = $("#textbox").caret().start);
      

      你可以像这样“存储”这个位置:

      $("#textbox").focusout(function(){
         var cursorPosition = $(this).caret().start);
         $(this).data("lastCursorPos", cursorPosition);
      });
      

      要检索它(在您的 div 点击事件上),请执行以下操作:

      var lastCursorPosition = $("#textbox").data("lastCursorPos");
      

      希望这会有所帮助。干杯

      【讨论】:

      • 这听起来很有希望,谢谢。我如何将值插入到这个位置?
      猜你喜欢
      • 2016-09-15
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多