JQuery ile metin alanına metin ekleme


151

Bir çapa etiketi tıklandığında jquery kullanarak bir metin alanına nasıl metin ekleyebilirim merak ediyorum.

Zaten textarea'da olan metni değiştirmek istemiyorum, textarea'ya yeni metin eklemek istiyorum.


1
Bu çözüm ise - Ancak kendimde inşa etmeyi tercih ederdim. Onun için kişisel bir blog fora arkadaş yapıyorum, bu yüzden buna uygun her şey.
Oliver Stubley

böylece bir metin seçmek istiyorsunuz ve hangisi seçilirse seçilsin, bir metin alanını doldurmak için jquery kullanın, eğer öyleyse bu metin nereden geliyor, manuel olarak mı, yoksa özel bir etiketten mi geliyor?
TStamper

TStamper, bir düğmeyi tıklatabiliyorum ve neyin tıklandığına bağlı olarak bir metin alanına metin ekleyin.
Oliver Stubley

öyleyse "kalın" etiketli bir düğmeye tıklarsanız metin alanında kalın ister misiniz?
TStamper

Cesur metin değil, cesur etiketler (muhtemelen html yerine özel)
Oliver Stubley

Yanıtlar:


125

Jason'ın yorumlarında ne yazdığınızı deneyin:

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

Düzenle- Metne eklemek için aşağıya bakın

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

metin eklemek için çok daha kolay bir yol için cevabımı kontrol et
Jason

8
@ Jason- üzgünüm doğru değil, append bir html öğesi ile başlayan html verileri bekler ex: <p
TStamper

Sonuç bir PHP sayfasından geliyor ve jQuery tarafından işleniyorsa? (veriler arasında Json kullanılarak aktarılır)
Abu Rayane

186

JQuery işlev uzantısını seviyorum. Ancak bu DOM nesnesine değil, jQuery nesnesine karşılık gelir. Bu yüzden daha da iyi hale getirmek için biraz değiştirdim (aynı anda birden fazla metin kutusunda / textareas'ta güncelleyebilir).

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

Bu gerçekten iyi çalışıyor. Aynı anda birden çok yere ekleyebilirsiniz:

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

3
Anwer içinde bir iz}} var, bu yüzden ilk başta çözüm işe yaramadı düşündüm, ancak düzelttikten sonra IE7 ve FF3.5'te harika çalışıyor. TEXTAREA öğesi için düzeltme kutusuna bir metin ekleyebilirsiniz. Teşekkür ederim!
Philippe

1
bu Chrome'da da çalışır. Bana biraz zaman kazandığınız için teşekkürler :) ve orijinal kod için @Thinker'a teşekkür ederiz.
Veli Gebrev

Buraya bir Google aramasından geldi .. Cevabınızın bir yaşında olduğunu biliyorum, ama bunun için çok teşekkürler. Bir cazibe gibi çalışır
Mike Turley

6
selKüresel olmak mı gerekiyor?
qwertymk

1
Kahve sürümünü isteyen herkes için: gist.github.com/zachaysan/7100458
zachaysan

47

Kodumda bu işlevi kullanın:

$.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 benim değil, bir yere googled ve sonra benim app için ayarlanmış.

Kullanımı: $('#element').insertAtCaret('text');


Bu eklenen metni de vurguluyor mu?
Oliver Stubley

2
Ancak kullanıcı kendi imlecini bir yere geri götürdüğünde bu çözüm çalışmaz :) Neyse, boş ver.
Düşünür

3
'bu'yu hem sarılmış bir küme hem de bir öğe olarak kullanırsınız. hmmm .. sadece denedi ve düzenlemeler
olmadan çalışmıyor

4
Bu kodu da çalıştıramadım. JQuery kullanıyorum. Hem metin hem de metin alanı denedim. Bunun this.value, örneğin this.val (), vb. Olması gerektiğine inanıyorum.
Nick

1
Evet IE üzerinde DOM üst ekleyerek tuttu ve Fox hiçbir şey yapmadı. En son JQuery kullanma ...
Caveatrob

19

Bu eski bir soru olduğunu biliyorum ama bu çözümü arayan insanlar için bir textarea içerik eklemek için append () kullanmamalısınız. append () yöntemi, textarea değerini değil innerHTML öğesini hedefler. İçerik metin alanında görünebilir, ancak öğenin form değerine eklenmez.

Yukarıda belirtildiği gibi:

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

iyi çalışır.


13

bu metin kutusuna bir metin parçası "enjekte" sağlar, enjekte anlamına gelir: imlecin olduğu yere metin ekler.

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

Ve bunu şöyle kullanabilirsiniz:

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

Komik ve "Metne Etiket Ekle" işlevine sahip olduğumuzda daha fazla sence var.

tüm tarayıcılarda çalışır.


5
@temoto: İngilizce olmayan değişken adları için aşağı oy? Hala olduğu gibi tamamen okunabilir. Bir yanıtın yardımcı olmaması durumunda, oylama düğmesinin kullanılması gerekiyordu, ki burada durum böyle değil. BTW aynı zamanda aşağı oy verirken size birkaç itibar kazandırır.
Josh M.

İspanyolca kodu anlamak için biraz zaman aldı. ve bu kodda bir hata var. Sonuna doğru değil, daima metin kutusunun başlangıcına ekleniyordu. Örneğin: Metin ise: Sevgili kullanıcı ve onclicking, metin kullanıcısından ziyade sevgili önce ekleniyordu.
Dev

@JoshM. Mesele şu ki , burada Thinker tarafından yazılan daha eski ve daha eksiksiz bir cevabın kopyası ... Değişikliğin ve sonrasında yapılan bazı .focus()çağrıları ve güncellemeleri çıkardı . İspanyol değişkenleri başka bir cevabı haklı çıkarmak için kullanılmış olabilir ...selectionStartselectionEnd
CPHPython

12

Hej bu benim için FF @ en azından Tamam çalışır ve carets pozisyonda ekler değiştirilmiş bir versiyonu

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

denedin mi:

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

otomatik ışıklandırma konusunda emin değilim.

DÜZENLE :

Eklemek:

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

Teşekkürler, ben bir gitmek vereceğim, ben jQuery yeniyim bu yüzden tüm kullanımı kolay fonksiyonların farkında değilim.
Oliver Stubley

bende nispeten yeniyim. Eğer asmak olsun eğlenceli ve süper kolay. Daha fazla referans için buna göz atın: docs.jquery.com/Main_Page
Jason

5
Aşağıda Marcus tarafından belirtildiği gibi, append()a değeri üzerinde çalışmaz textarea. append()Yöntem innerHTML, textarea değil değerini hedefler.
Turadg

6

Ne istiyorsun jQuery- makul olmalıdır

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

Eklenen metni vurgulamanın en iyi yolu background-color, seçtiğiniz renge ayarlanmış bir CSS sınıfıyla bir açıklığa sarmaktır. Bir sonraki ekte, sınıfı mevcut açıklıklardan kaldırabilir (veya açıklıkları çıkarabilirsiniz).

Ancak, piyasada mevcut ücretsiz WYSIWYG HTML / Zengin Metin editörleri var, eminim ihtiyaçlarınızı karşılayacak


5

İşte jQuery 1.9+ ile çalışan hızlı bir çözüm:

a) Caret pozisyonunu alın:

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) Metni düzeltme işareti konumuna ekleyin:

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) Örnek

$('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'de benim için iyi çalışıyor

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

İçeriği textarea'ya değiştirmeden eklemek istiyorsanız, aşağıdakileri deneyebilirsiniz

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

Senaryonuza göre,

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

0

Bence bu daha iyi olur

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

0

Başka bir çözüm de tarif edilir burada sizin durumda çalışmıyor durumunda diğer komut bazılarıdır.


0

Bu, @panchicore tarafından verilen küçük bir hata düzeltildi.

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

Basit bir çözüm olacaktır: ( Varsayım : Eğer içeride yazın ne olursa olsun istediğiniz metin içinde zaten orada ne eklenen almak için textarea )

In onClick <a> etiketinin durumunda, bunu yapan bir kullanıcı tanımlı fonksiyon, yazın:

function textType(){

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

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

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

}

(burada ids, textId1 - o / p text içinArea textId2- i / p metin kutusu için ')


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

Bunu kullandım ve iyi çalışıyor :)

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

Remi


1
Hayır değil. Metin alanının html'sini değiştirirseniz, içeriği orada görürsünüz, ancak FORM'yi kaydettiğinizde çalışmaz, çünkü formun iç HTML'ye değil, textarea değerine ihtiyacı vardır.
tothemario
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.