แทรกข้อความลงใน textarea ด้วย jQuery


151

ฉันสงสัยว่าฉันสามารถแทรกข้อความลงในพื้นที่ข้อความโดยใช้ jquery ได้อย่างไรเมื่อคลิกแท็กจุดยึด

ฉันไม่ต้องการแทนที่ข้อความเป็น textarea อยู่แล้วฉันต้องการผนวกข้อความใหม่เข้ากับ textarea


1
หากนี่คือทางออก - ต้องการสร้างด้วยตัวเองอย่างไรก็ตาม มันเป็นบล็อกส่วนตัวฉันทำเพื่อเพื่อน ๆ ดังนั้นอะไรก็ตามที่จะเหมาะกับมัน
Oliver Stubley

ดังนั้นคุณต้องการเลือกข้อความและสิ่งใดก็ตามที่เลือกให้ใช้ jquery เพื่อเติมข้อความลงใน textarea ถ้าเป็นเช่นนั้นข้อความนี้มาจากไหนป้อนด้วยตนเองหรือจากแท็กพิเศษ?
TStamper

TStamper ฉันต้องการที่จะคลิกปุ่มและขึ้นอยู่กับสิ่งที่คลิกแทรกข้อความลงใน textarea
Oliver Stubley

ดังนั้นถ้าคุณคลิกที่ปุ่มชื่อ "ตัวหนา" คุณต้องการตัวหนาใน textarea?
TStamper

ข้อความไม่หนา แต่แท็กตัวหนา (อาจจะกำหนดเองเมื่อเทียบกับ HTML)
โอลิเวอร์ Stubley

คำตอบ:


125

จากสิ่งที่คุณมีในความคิดเห็นของ Jason ลอง:

$('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'); 
})

ตรวจสอบคำตอบของฉันหาวิธีที่ง่ายมากที่จะผนวกข้อความ
เจสัน

8
@ Jason- ขออภัยไม่เป็นความจริงผนวกข้อมูล html ที่คาดว่าจะเริ่มต้นด้วยองค์ประกอบ html เช่น: <p
TStamper

ถ้าผลลัพธ์นั้นมาจากหน้า PHP และจัดการโดย jQuery (ในระหว่างข้อมูลถูกส่งโดยใช้ Json)
Abu Rayane

186

ฉันชอบส่วนขยายฟังก์ชั่น jQuery อย่างไรก็ตามสิ่งนี้อ้างถึงวัตถุ 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');

3
มี trailing}) ใน anwer ดังนั้นในตอนแรกฉันคิดว่าวิธีแก้ปัญหาไม่ทำงาน แต่หลังจากแก้ไขแล้วมันใช้งานได้ดีใน IE7 และ FF3.5 คุณสามารถแทรกข้อความที่คาเร็ตสำหรับองค์ประกอบ TEXTAREA ขอบคุณ!
ฟิลิปป์

1
ยังใช้งานได้ใน Chrome ขอบคุณที่ช่วยฉันประหยัดเวลา :) และขอขอบคุณ @Thinker สำหรับรหัสต้นฉบับ
Veli Gebrev

มาที่นี่จากการค้นหาของ google .. ฉันรู้ว่าคำตอบของคุณอายุหนึ่งปี แต่ขอบคุณมากสำหรับสิ่งนี้ ทำงานเหมือนมีเสน่ห์
Mike Turley

6
มีselความหมายว่าเป็นโลกหรือไม่
qwertymk

1
สำหรับทุกคนที่ต้องการรุ่นcoffeescript
zachaysan

47

ฉันใช้ฟังก์ชั่นนี้ในรหัสของฉัน:

$.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% ฉันไปหาที่ไหนสักแห่งแล้วปรับหาแอพของฉัน

การใช้งาน: $('#element').insertAtCaret('text');


ไฮไลต์นี้แทรกข้อความด้วยหรือไม่
Oliver Stubley

2
แต่โซลูชันนั้นจะไม่ทำงานเมื่อผู้ใช้เลื่อนเคอร์เซอร์ไปที่ไหนสักแห่ง :) อย่างไรก็ตามไม่เป็นไร
นักคิด

3
คุณใช้ 'this' เป็นทั้งชุดที่ห่อและองค์ประกอบ อืมม .. เพียงแค่พยายามและมันไม่ทำงาน w / o การแก้ไข
สกอตต์ Evernden

4
ฉันไม่สามารถรับรหัสนี้เพื่อทำงานได้ ฉันใช้ jQuery ฉันลองทั้ง textarea และ text field ฉันเชื่อว่านี่คุ้มค่าตัวอย่างเช่น this.val () และอื่น ๆ
นิค

1
ใช่บน IE มันยังคงแทรกที่ด้านบนของ DOM และบน Fox มันไม่ได้ทำอะไรเลย ใช้ JQuery ล่าสุด ...
Caveatrob

19

ฉันรู้ว่านี่เป็นคำถามเก่า แต่สำหรับผู้ที่ค้นหาวิธีนี้มีประโยชน์ที่คุณไม่ควรใช้ผนวก () เพื่อเพิ่มเนื้อหาลงใน textarea เมธอด append () เป้าหมาย innerHTML ไม่ใช่ค่าของ textarea เนื้อหาอาจปรากฏใน textarea แต่จะไม่ถูกเพิ่มลงในค่าฟอร์มขององค์ประกอบ

ตามที่ระบุไว้ข้างต้นโดยใช้:

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

จะทำงานได้ดี


13

อันนี้อนุญาตให้คุณ "ฉีด" ชิ้นส่วนของข้อความไปยังกล่องข้อความ, inject หมายถึง: ผนวกข้อความที่เคอร์เซอร์อยู่

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>

ตลกและมีความรู้สึกมากขึ้นเมื่อเรามีฟังก์ชั่น "แทรกแท็กเป็นข้อความ"

ทำงานได้ในเบราว์เซอร์ทั้งหมด


5
@temoto: ลงคะแนนให้กับชื่อตัวแปรที่ไม่ใช่ภาษาอังกฤษ? ยังสามารถอ่านได้อย่างสมบูรณ์ตามที่เป็นอยู่ ควรใช้ปุ่มลงคะแนนเสียงหากคำตอบไม่เป็นประโยชน์ซึ่งไม่ใช่ในกรณีนี้ BTW มันยังทำให้คุณเสียชื่อเสียงเมื่อคุณโหวต
Josh M.

ใช้เวลาสักครู่เพื่อทำความเข้าใจกับรหัสภาษาสเปน และมีข้อผิดพลาดในรหัสนี้ มันถูกแทรกเสมอไปที่จุดเริ่มต้นของกล่องข้อความมากกว่าที่จะสิ้นสุด ตัวอย่างเช่นหากข้อความคือ: ผู้ใช้ที่รักและ onclicking มันถูกแทรกก่อนที่จะรักมากกว่าหลังจากผู้ใช้ข้อความ
Dev

@JoshM นี่คือคำตอบที่เก่ากว่าและสมบูรณ์กว่าที่เขียนโดยนักคิดในที่นี่ ... เขานำการ.focus()ร้องขอและการอัปเดตไปยังselectionStartและselectionEndหลังการแก้ไข ตัวแปรภาษาสเปนอาจถูกนำมาใช้เพื่อพิสูจน์คำตอบอื่น ...
CPHPython

12

เฮ้นี่เป็นรุ่นที่แก้ไขแล้วซึ่งใช้งานได้ดีใน 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();
   }
 }
})

10

คุณเคยลองไหม:

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

ไม่แน่ใจเกี่ยวกับการปรับแสงอัตโนมัติ

แก้ไข :

ในการผนวก:

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

ขอบคุณฉันจะปล่อยมันไปฉันยังใหม่กับ jQuery ดังนั้นฉันจึงไม่ทราบถึงฟังก์ชั่นที่ใช้งานง่ายทั้งหมด
Oliver Stubley

ฉันก็ค่อนข้างใหม่เช่นกัน มันสนุกและง่ายสุด ๆ เมื่อคุณติดมัน ตรวจสอบนี้ใช้สำหรับการอ้างอิงเพิ่มเติมได้ที่: docs.jquery.com/Main_Page
เจสัน

5
เท่าที่สังเกตจากมาร์คัสด้านล่างไม่ได้ทำงานเกี่ยวกับคุณค่าของการให้append() วิธีเป้าหมาย innerHTML ไม่คุ้มค่าของ textarea ที่ textareaappend()
Turadg

6

สิ่งที่คุณขอควรตรงไปตรงมาใน jQuery-

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

วิธีที่ดีที่สุดที่ฉันคิดว่าการเน้นข้อความที่แทรกไว้คือการพันในคลาส CSS พร้อมกับbackground-colorกำหนดสีที่คุณต้องการ ในการแทรกครั้งต่อไปคุณสามารถลบคลาสออกจากช่วงที่มีอยู่ใด ๆ (หรือดึงช่วงออก)

อย่างไรก็ตามมีบรรณาธิการ WYSIWYG HTML / Rich Text จำนวนมากให้บริการฟรีในตลาดฉันแน่ใจว่าจะตอบสนองความต้องการของคุณ


5

นี่คือโซลูชันด่วนที่ทำงานใน 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');
  });
});

3

มันใช้งานได้ดีสำหรับฉันใน 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;

1

หากคุณต้องการเพิ่มเนื้อหาลงใน textarea โดยไม่ต้องแทนที่คุณสามารถลองด้านล่าง

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

ตามสถานการณ์ของคุณมันจะเป็น

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

0

ฉันคิดว่ามันจะดีกว่า

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

0

มีการอธิบายวิธีแก้ไขปัญหาอื่นที่นี่ในกรณีที่สคริปต์อื่นบางตัวไม่ทำงานในกรณีของคุณ


0

นี่คล้ายกับคำตอบที่ได้รับจาก @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;
   }
}

0

วิธีแก้ปัญหาง่ายๆคือ: ( ข้อสันนิษฐาน : คุณต้องการสิ่งที่คุณพิมพ์ในกล่องข้อความเพื่อต่อท้ายสิ่งที่มีอยู่แล้วในtextarea )

ในเหตุการณ์onClickของแท็ก <a> ให้เขียนฟังก์ชันที่ผู้ใช้กำหนดเองซึ่งทำสิ่งนี้:

function textType(){

  var **str1**=$("#textId1").val();

  var **str2**=$("#textId2").val();

  $("#textId1").val(str1+str2);

}

(โดยที่ id, textId1 - สำหรับ o / p textArea textId2 - สำหรับ i / p textbox ')


0
$.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) ;
        }
    }
});

-1

ฉันใช้มันและมันก็ใช้ได้ดี :)

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

Remi


1
ไม่มันไม่ หากคุณเปลี่ยน html ของ textarea คุณจะเห็นเนื้อหาที่นั่น แต่เมื่อคุณบันทึก FORM มันจะไม่ทำงานเนื่องจากรูปแบบนั้นต้องการค่า textarea ไม่ใช่ HTML ภายใน
tothemario
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.