Chèn văn bản vào textarea với jQuery


151

Tôi đang tự hỏi làm thế nào tôi có thể chèn văn bản vào một vùng văn bản bằng cách sử dụng jquery, khi nhấp vào thẻ neo.

Tôi không muốn thay thế văn bản đã có trong textarea, tôi muốn nối văn bản mới vào textarea.


1
Nếu đây là giải pháp - Tuy nhiên, tôi muốn xây dựng nó trong bản thân mình. Nó dành cho một blog cá nhân Tôi đang làm một người bạn, vì vậy bất cứ điều gì sẽ phù hợp với điều này.
Oliver Stubley

Vì vậy, bạn muốn chọn một văn bản, và bất cứ ai đã chọn, hãy sử dụng jquery để điền vào một văn bản, nếu vậy văn bản này đến từ đâu, được nhập thủ công hoặc từ một thẻ đặc biệt?
TStamper

TStamper, tôi muốn có thể nhấp vào một nút và tùy thuộc vào nội dung được nhấp vào chèn văn bản vào văn bản.
Oliver Stubley

Vì vậy, nếu bạn nhấp vào một nút có nhãn "đậm" bạn muốn in đậm trong vùng văn bản?
TStamper

Không phải văn bản in đậm, nhưng các thẻ in đậm (có thể tùy chỉnh trái ngược với html)
Oliver Stubley

Câu trả lời:


125

Từ những gì bạn có trong nhận xét của Jason hãy thử:

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

Chỉnh sửa- Để thêm vào văn bản, hãy nhìn vào bên dưới

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

kiểm tra câu trả lời của tôi để biết cách dễ dàng hơn để nối văn bản
Jason

8
@ Jason- xin lỗi không đúng, chắp thêm mong muốn dữ liệu html bắt đầu bằng phần tử html: <p
TStamper

Nếu kết quả đến từ trang PHP và được xử lý bởi jQuery thì sao? (ở giữa dữ liệu được truyền bằng Json)
Abu Rayane

186

Tôi thích phần mở rộng hàm jQuery. Tuy nhiên, điều này đề cập đến đối tượng jQuery không phải là đối tượng DOM. Vì vậy, tôi đã sửa đổi nó một chút để làm cho nó thậm chí tốt hơn (có thể cập nhật trong nhiều hộp văn bản / textareas cùng một lúc).

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

Điều này hoạt động thực sự tốt. Bạn có thể chèn vào nhiều nơi cùng một lúc, như:

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

3
Có một dấu vết}) trong anwer vì vậy ban đầu tôi nghĩ rằng giải pháp đó không hoạt động, nhưng sau khi sửa nó, nó hoạt động rất tốt trong IE7 và FF3.5. Bạn có thể chèn một đoạn văn bản tại dấu mũ cho phần tử TEXTAREA. Cảm ơn bạn!
Philippe

1
cái này cũng hoạt động trong Chrome. cảm ơn vì đã tiết kiệm thời gian cho tôi :) và cảm ơn bạn @Thinker vì mã gốc.
Veli Gebrev

Đến đây từ một tìm kiếm google .. Tôi biết câu trả lời của bạn đã được một năm tuổi, nhưng cảm ơn rất nhiều vì điều này. Hoạt động như một bùa mê
Mike Turley

6
selnghĩa là toàn cầu?
qwertymk

1
Đối với bất kỳ ai muốn phiên bản coffeescript
zachaysan

47

Tôi sử dụng chức năng này trong mã của tôi:

$.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>

Nó không phải là của tôi 100%, tôi đã googled nó ở đâu đó và sau đó điều chỉnh cho ứng dụng của tôi.

Sử dụng: $('#element').insertAtCaret('text');


Điều này cũng làm nổi bật văn bản chèn?
Oliver Stubley

2
Nhưng giải pháp đó sẽ không hoạt động, khi người dùng di chuyển con trỏ của mình ở đâu đó trở lại :) Dù sao đi nữa, đừng bận tâm.
Nhà tư tưởng

3
bạn sử dụng 'cái này' như là một bộ được bọc và một phần tử. hmmm .. chỉ cần thử và nó không hoạt động với các chỉnh sửa
Scott Evernden

4
Tôi cũng không thể có được mã này để làm việc. Tôi đang sử dụng jQuery. Tôi đã thử cả hai vùng văn bản và trường văn bản. Tôi tin điều này. Ví dụ, giá trị phải là this.val (), v.v.
Nick

1
Vâng trên IE, nó tiếp tục chèn ở đầu DOM và trên Fox nó không làm gì cả. Sử dụng JQuery mới nhất ...
Caveatrob

19

Tôi biết đây là một câu hỏi cũ nhưng đối với những người tìm kiếm giải pháp này, điều đáng chú ý là bạn không nên sử dụng append () để thêm nội dung vào vùng văn bản. phương thức append () nhắm vào bên trongHTML chứ không phải giá trị của textarea. Nội dung có thể xuất hiện trong vùng văn bản nhưng nó sẽ không được thêm vào giá trị biểu mẫu của phần tử.

Như đã lưu ý ở trên bằng cách sử dụng:

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

sẽ hoạt động tốt


13

cái này cho phép bạn "tiêm" một đoạn văn bản vào hộp văn bản, nghĩa là tiêm: nối thêm văn bản nơi con trỏ đang ở.

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;
 }
}

Và bạn có thể sử dụng nó như thế này:

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

Hài hước và có nhiều ý nghĩa hơn khi chúng ta có chức năng "Chèn thẻ vào văn bản".

hoạt động trong tất cả các trình duyệt.


5
@temoto: Bỏ phiếu cho tên biến không phải tiếng Anh? Nó vẫn hoàn toàn có thể đọc được. Nút bỏ phiếu được cho là sẽ được sử dụng nếu câu trả lời không hữu ích, đây không phải là trường hợp. BTW nó cũng tốn của bạn một vài danh tiếng khi bạn bỏ phiếu.
Josh M.

Mất một lúc để hiểu mã Tây Ban Nha. và có một lỗi trong mã này. Nó luôn luôn chèn vào đầu hộp văn bản hơn là vào cuối. Ví dụ: Nếu văn bản là: Kính gửi người dùng và bật, nó đã được chèn trước thân yêu thay vì sau người dùng văn bản.
Dev

@JoshM. vấn đề là, đây là một bản sao của câu trả lời cũ hơn và đầy đủ hơn được viết bởi Thinker ở đây ... Ông đã lấy ra một số .focus()lời mời và các bản cập nhật cho selectionStartselectionEndsau khi sửa đổi. Các biến tiếng Tây Ban Nha có thể đã được sử dụng để biện minh cho câu trả lời khác ...
CPHPython

12

Hej đây là phiên bản sửa đổi hoạt động tốt trong FF @least cho tôi và chèn vào vị trí dấu mũ

  $.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

bạn đã thử chưa

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

không chắc chắn về autohighlighting, mặc dù.

BIÊN TẬP :

Để thêm:

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

Cảm ơn, tôi sẽ thử, tôi chưa quen với jQuery nên tôi không biết tất cả các hàm dễ sử dụng.
Oliver Stubley

tôi cũng tương đối mới thật thú vị và cực kỳ dễ dàng khi bạn nắm bắt được nó. Kiểm tra điều này để tham khảo thêm: docs.jquery.com/Main_Page
Jason

5
Như Marcus đã lưu ý dưới đây, append()không hoạt động dựa trên giá trị của a textarea. Các append()phương pháp nhắm innerHTML, không phải là giá trị của textarea.
Turadg

6

Những gì bạn yêu cầu phải hợp lý đơn giản trong jQuery-

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

Cách tốt nhất mà tôi có thể nghĩ đến để làm nổi bật văn bản được chèn là bằng cách gói nó trong một khoảng bằng một lớp CSS với background-color được đặt thành màu bạn chọn. Ở lần chèn tiếp theo, bạn có thể xóa lớp khỏi bất kỳ nhịp hiện có nào (hoặc loại bỏ các nhịp).

Tuy nhiên, có rất nhiều trình soạn thảo WYSIWYG HTML / Rich Text miễn phí có sẵn trên thị trường, tôi chắc chắn rằng một trình soạn thảo sẽ phù hợp với nhu cầu của bạn


5

Đây là một giải pháp nhanh chóng hoạt động trong jQuery 1.9+:

a) Nhận vị trí caret:

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) Nối văn bản tại vị trí dấu mũ:

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) Ví dụ

$('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

Nó hoạt động tốt với tôi trong 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

Nếu bạn muốn nối thêm nội dung vào vùng văn bản mà không thay thế chúng, bạn có thể thử cách bên dưới

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

Theo kịch bản của bạn, nó sẽ là

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

0

Tôi nghĩ rằng điều này sẽ tốt hơn

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

0

Một giải pháp khác cũng được mô tả ở đây trong trường hợp một số tập lệnh khác không hoạt động trong trường hợp của bạn.


0

Điều này tương tự với câu trả lời được đưa ra bởi @panchicore với một lỗi nhỏ đã được sửa.

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

Giải pháp đơn giản sẽ là: ( Giả định : Bạn muốn bất cứ thứ gì bạn nhập vào trong hộp văn bản để được thêm vào những gì đã có trong textarea )

Trong sự kiện onClick của thẻ <a>, hãy viết một hàm do người dùng xác định, thực hiện điều này:

function textType(){

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

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

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

}

(trong đó id, textId1 - cho văn bản o / pArea textId2 -cho 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

Tôi đã sử dụng nó và nó hoạt động tốt :)

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

Remi


1
Không, nó không có. Nếu bạn thay đổi html của textarea, bạn sẽ thấy nội dung ở đó, nhưng khi bạn lưu FORM thì nó không hoạt động, vì biểu mẫu cần giá trị textarea chứ không phải HTML bên trong.
tothemario
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.