【问题标题】:Insert text into textarea with jQuery使用 jQuery 将文本插入 textarea
【发布时间】:2010-10-31 02:22:11
【问题描述】:

我想知道如何在单击锚标记时使用 jquery 将文本插入文本区域。

我不想替换 textarea 中已有的文本,我想将新文本附加到 textarea。

【问题讨论】:

  • 如果这是解决方案 - 但是更愿意自己构建它。它是我为朋友做的个人博客,所以任何适合这个的东西。
  • 所以你想选择一个文本,无论选择哪一个,使用jquery来填充一个textarea,如果是这样,这个文本是从哪里来的,是手动输入的还是从一个特殊的标签输入的?
  • TStamper,我希望能够单击一个按钮,并根据单击的内容将文本插入文本区域。
  • 所以如果你点击一个标有“bold”的按钮,你想在 textarea 中加粗吗?
  • 不是粗体文本,而是粗体标签(可能是自定义而不是 html)

标签: jquery formatting textarea


【解决方案1】:

我喜欢 jQuery 函数扩展。然而,this 指的是 jQuery 对象而不是 DOM 对象。所以我对其进行了一些修改以使其变得更好(可以一次在多个文本框/文本区域中更新)。

jQuery.fn.extend({
insertAtCaret: function(myValue){
  return this.each(function(i) {
    if (document.selection) {
      //For browsers like Internet Explorer
      this.focus();
      var sel = document.selection.createRange();
      sel.text = myValue;
      this.focus();
    }
    else if (this.selectionStart || this.selectionStart == '0') {
      //For browsers like Firefox and Webkit based
      var startPos = this.selectionStart;
      var endPos = this.selectionEnd;
      var scrollTop = this.scrollTop;
      this.value = this.value.substring(0, startPos)+myValue+this.value.substring(endPos,this.value.length);
      this.focus();
      this.selectionStart = startPos + myValue.length;
      this.selectionEnd = startPos + myValue.length;
      this.scrollTop = scrollTop;
    } else {
      this.value += myValue;
      this.focus();
    }
  });
}
});

这真的很好用。您可以一次插入多个位置,例如:

$('#element1, #element2, #element3, .class-of-elements').insertAtCaret('text');

【讨论】:

  • 有一个尾随 }) 所以起初我认为该解决方案不起作用,但在修复它之后,它在 IE7 和 FF3.5 中运行良好。您可以在插入符号处为 TEXTAREA 元素插入一段文本。谢谢!
  • 这也适用于 Chrome。感谢您为我节省了一些时间 :) 并感谢 @Thinker 提供原始代码。
  • 从谷歌搜索来到这里......我知道你的答案已经有一年了,但非常感谢。像魅力一样工作
  • sel 是全球性的吗?
  • 对于任何想要咖啡脚本版本的人:gist.github.com/zachaysan/7100458
【解决方案2】:

从 Jason 的 cmets 中尝试:

$('a').click(function() //this will apply to all anchor tags
{ 
   $('#area').val('foobar'); //this puts the textarea for the id labeled 'area'
})

编辑-要附加到文本,请看下面

$('a').click(function() //this will apply to all anchor tags
{ 
   $('#area').val($('#area').val()+'foobar'); 
})

【讨论】:

  • 检查我的答案以获得更简单的附加文本方法
  • @Jason- 抱歉不是真的,追加需要以 html 元素开头的 html 数据,例如:

  • 如果结果来自 PHP 页面并由 jQuery 处理呢? (中间数据使用Json传输)
【解决方案3】:

我在我的代码中使用了这个函数:

$.fn.extend({
  insertAtCaret: function(myValue) {
    this.each(function() {
      if (document.selection) {
        this.focus();
        var sel = document.selection.createRange();
        sel.text = myValue;
        this.focus();
      } else if (this.selectionStart || this.selectionStart == '0') {
        var startPos = this.selectionStart;
        var endPos = this.selectionEnd;
        var scrollTop = this.scrollTop;
        this.value = this.value.substring(0, startPos) +
          myValue + this.value.substring(endPos,this.value.length);
        this.focus();
        this.selectionStart = startPos + myValue.length;
        this.selectionEnd = startPos + myValue.length;
        this.scrollTop = scrollTop;
      } else {
        this.value += myValue;
        this.focus();
      }
    });
    return this;
  }
});
input{width:100px}
label{display:block;margin:10px 0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Copy text from: <input id="in2copy" type="text" value="x"></label>
<label>Insert text in: <input id="in2ins" type="text" value="1,2,3" autofocus></label>
<button onclick="$('#in2ins').insertAtCaret($('#in2copy').val())">Insert</button>

这不是 100% 我的,我在某个地方用 Google 搜索过,然后针对我的应用进行了调整。

用法:$('#element').insertAtCaret('text');

【讨论】:

  • 这是否也突出显示插入的文本?
  • 但是当用户将光标移回某处时,该解决方案将不起作用:)无论如何,没关系。
  • 您将“this”用作包装集和元素。嗯 .. 刚试过,没有编辑它不起作用
  • 我也无法使用此代码。我正在使用 jQuery。我尝试了一个文本区域和一个文本字段。我相信 this.value 例如应该是 this.val() 等等。
  • 是的,在 IE 上它一直插入到 DOM 的顶部,而在 Fox 上它什么也没做。使用最新的 JQuery...
【解决方案4】:

我知道这是一个老问题,但对于搜索此解决方案的人来说,值得注意的是,您不应使用 append() 将内容添加到文本区域。 append() 方法的目标是 innerHTML 而不是 textarea 的值。内容可能会出现在 textarea 中,但不会添加到元素的表单值中。

如上所述,使用:

$('#textarea').val($('#textarea').val()+'new content'); 

会正常工作。

【讨论】:

    【解决方案5】:

    这个允许你将一段文本“注入”到文本框,注入的意思是:在光标所在的位置追加文本。

    function inyectarTexto(elemento,valor){
     var elemento_dom=document.getElementsByName(elemento)[0];
     if(document.selection){
      elemento_dom.focus();
      sel=document.selection.createRange();
      sel.text=valor;
      return;
     }if(elemento_dom.selectionStart||elemento_dom.selectionStart=="0"){
      var t_start=elemento_dom.selectionStart;
      var t_end=elemento_dom.selectionEnd;
      var val_start=elemento_dom.value.substring(0,t_start);
      var val_end=elemento_dom.value.substring(t_end,elemento_dom.value.length);
      elemento_dom.value=val_start+valor+val_end;
     }else{
      elemento_dom.value+=valor;
     }
    }
    

    你可以这样使用它:

    <a href="javascript:void(0);" onclick="inyectarTexto('nametField','hello world');" >Say hello world to text</a>
    

    当我们有“将标签插入文本”功能时,更有趣并且更有感觉。

    适用于所有浏览器。

    【讨论】:

    • @temoto:否决非英语变量名?它仍然是完全可读的。如果答案没有帮助,则应该使用否决按钮,而这里不是这种情况。顺便说一句,当你投反对票时,它也会让你失去一些声誉。
    • 花了一些时间来理解西班牙语代码。并且此代码中有一个错误。它总是在文本框的开头而不是结尾插入。例如:如果文本是:亲爱的用户并且点击它是在亲爱的之前插入而不是在文本用户之后。
    • @JoshM。问题是,这是这里的older and more complete answer written by Thinker 的副本……他取出了一些.focus() 调用以及修改后对selectionStartselectionEnd 的更新。西班牙语变量可能已被用来证明另一个答案的合理性......
    【解决方案6】:

    Hej 这是一个修改后的版本,对我来说在 FF @least 中可以正常工作并插入到插入符号位置

      $.fn.extend({
      insertAtCaret: function(myValue){
      var obj;
      if( typeof this[0].name !='undefined' ) obj = this[0];
      else obj = this;
    
      if ($.browser.msie) {
        obj.focus();
        sel = document.selection.createRange();
        sel.text = myValue;
        obj.focus();
        }
      else if ($.browser.mozilla || $.browser.webkit) {
        var startPos = obj.selectionStart;
        var endPos = obj.selectionEnd;
        var scrollTop = obj.scrollTop;
        obj.value = obj.value.substring(0, startPos)+myValue+obj.value.substring(endPos,obj.value.length);
        obj.focus();
        obj.selectionStart = startPos + myValue.length;
        obj.selectionEnd = startPos + myValue.length;
        obj.scrollTop = scrollTop;
      } else {
        obj.value += myValue;
        obj.focus();
       }
     }
    })
    

    【讨论】:

      【解决方案7】:

      你试过了吗:

      $("#yourAnchor").click(function () {
          $("#yourTextarea").val("your text");
      });
      

      但不确定自动高亮显示。

      编辑

      追加:

      $("#yourAnchor").click(function () {
          $("#yourTextarea").append("your text to append");
      });
      

      【讨论】:

      • 谢谢,我试试看,我是 jQuery 新手,所以不知道所有易于使用的功能。
      • 我也比较新。一旦你掌握了它的窍门,它就很有趣而且超级容易。查看此内容以获取更多参考:docs.jquery.com/Main_Page
      • 正如下面 Marcus 所指出的,append() 不适用于 textarea 的值。 append() 方法针对的是 innerHTML,而不是 textarea 的值。
      【解决方案8】:

      你的要求在 jQuery 中应该相当简单-

      $(function() {
          $('#myAnchorId').click(function() { 
              var areaValue = $('#area').val();
              $('#area').val(areaValue + 'Whatever you want to enter');
          });
      });
      

      我能想到的突出显示插入文本的最佳方法是将其包装在一个带有 CSS 类的跨度中,并将 background-color 设置为您选择的颜色。在下一次插入时,您可以从任何现有跨度中删除该类(或剥离跨度)。

      但是,市场上有很多免费的所见即所得 HTML/富文本编辑器,我相信其中一种会满足您的需求

      【讨论】:

        【解决方案9】:

        这是一个适用于 jQuery 1.9+ 的快速解决方案:

        a) 获取插入符号位置:

        function getCaret(el) {
                if (el.prop("selectionStart")) {
                    return el.prop("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;
            };
        

        b) 在插入符号位置附加文本:

        function appendAtCaret($target, caret, $value) {
                var value = $target.val();
                if (caret != value.length) {
                    var startPos = $target.prop("selectionStart");
                    var scrollTop = $target.scrollTop;
                    $target.val(value.substring(0, caret) + ' ' + $value + ' ' + value.substring(caret, value.length));
                    $target.prop("selectionStart", startPos + $value.length);
                    $target.prop("selectionEnd", startPos + $value.length);
                    $target.scrollTop = scrollTop;
                } else if (caret == 0)
                {
                    $target.val($value + ' ' + value);
                } else {
                    $target.val(value + ' ' + $value);
                }
            };
        

        c) 示例

        $('textarea').each(function() {
          var $this = $(this);
          $this.click(function() {
            //get caret position
            var caret = getCaret($this);
        
            //append some text
            appendAtCaret($this, caret, 'Some text');
          });
        });
        

        【讨论】:

          【解决方案10】:

          它在 Chrome 20.0.11 中对我很有效

          var startPos = this[0].selectionStart;
          var endPos = this[0].selectionEnd;
          var scrollTop = this.scrollTop;
          this[0].value = this[0].value.substring(0, startPos) + myVal + this[0].value.substring(endPos, this[0].value.length);
          this.focus();
          this.selectionStart = startPos + myVal.length;
          this.selectionEnd = startPos + myVal.length;
          this.scrollTop = scrollTop;
          

          【讨论】:

            【解决方案11】:

            如果您想将内容附加到文本区域而不替换它们,您可以尝试以下方法

            $('textarea').append('Whatever need to be added');
            

            根据你的情况

            $('a').click(function() 
            { 
              $('textarea').append($('#area').val()); 
            })
            

            【讨论】:

              【解决方案12】:

              我觉得这样会更好

              $(function() {
              $('#myAnchorId').click(function() { 
                  var areaValue = $('#area').val();
                  $('#area').val(areaValue + 'Whatever you want to enter');
              });
              });
              

              【讨论】:

                【解决方案13】:

                还描述了另一种解决方案here,以防某些其他脚本不适用于您的情况。

                【讨论】:

                  【解决方案14】:

                  这类似于@panchicore 给出的答案,但修复了一个小错误。

                  function insertText(element, value) 
                  {
                     var element_dom = document.getElementsByName(element)[0];
                     if (document.selection) 
                     {
                        element_dom.focus();
                        sel = document.selection.createRange();
                        sel.text = value;
                        return;
                      } 
                     if (element_dom.selectionStart || element_dom.selectionStart == "0") 
                     {
                       var t_start = element_dom.selectionStart;
                       var t_end = element_dom.selectionEnd;
                       var val_start = element_dom.value.substring(value, t_start);
                       var val_end = element_dom.value.substring(t_end, element_dom.value.length);
                       element_dom.value = val_start + value + val_end;
                     } 
                     else
                     {
                        element_dom.value += value;
                     }
                  }
                  

                  【讨论】:

                    【解决方案15】:

                    简单的解决方案是: (假设:您希望在 文本框 中键入的任何内容都附加到 textarea 中已有的内容中)

                    标签的onClick事件中,编写一个用户自定义函数,其作用如下:

                    function textType(){
                    
                      var **str1**=$("#textId1").val();
                    
                      var **str2**=$("#textId2").val();
                    
                      $("#textId1").val(str1+str2);
                    
                    }
                    

                    (其中 ids,textId1-for o/p textArea textId2-for i/p textbox')

                    【讨论】:

                      【解决方案16】:
                      $.fn.extend({
                          insertAtCaret: function(myValue) {
                              var elemSelected = window.getSelection();
                              if(elemSelected) {
                                  var startPos = elemSelected.getRangeAt(0).startOffset;
                                  var endPos = elemSelected.getRangeAt(0).endOffset;
                                  this.val(this.val().substring(0, startPos)+myValue+this.val().substring(endPos,this.val().length));
                              } else {
                                  this.val(this.val()+ myValue) ;
                              }
                          }
                      });
                      

                      【讨论】:

                        【解决方案17】:

                        我用过,效果很好:)

                        $("#textarea").html("Put here your content");
                        

                        雷米

                        【讨论】:

                        • 不,它没有。如果您更改 textarea 的 html,您会看到那里的内容,但是当您保存 FORM 时它不起作用,因为表单需要 textarea 值,而不是内部 HTML。
                        猜你喜欢
                        • 2010-12-25
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-07-20
                        • 1970-01-01
                        • 2014-07-01
                        • 2014-09-30
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多