Вставте текст у текстову область за допомогою jQuery


151

Мені цікаво, як я можу вставити текст у текстову область за допомогою jquery після натискання тега якоря.

Я не хочу замінювати текст уже в текстовій області, я хочу додати новий текст до textarea.


1
Якщо це рішення - однак, я б вважав за краще будувати його в собі. Це для особистого блогу, я займаюся товаришем форуму, тому все, що підходить для цього.
Олівер Стюблі

тож ви хочете вибрати текст і що б не було вибрано, використовуйте jquery для заповнення текстової області, якщо так, звідки цей текст надходить, вводиться вручну або зі спеціального тегу?
TStamper

TStamper, я хочу мати можливість натиснути кнопку, і залежно від того, що натиснуто, вставити текст у текстову область.
Олівер Стублі

Отже, якщо ви натискаєте на кнопку з написом "жирний", ви хочете жирним шрифтом у текстовій області?
TStamper

Не жирний текст, але жирний теги (можливо, звичайний на відміну від html)
Олівер Стюблі

Відповіді:


125

З того, що ви маєте в коментарях Джейсона, спробуйте:

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

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
У анвері є кінцевий}), тому спочатку я зрозумів, що рішення не працює, але після його виправлення воно чудово працює в IE7 та FF3.5. Ви можете вставити фрагмент тексту під застереженням для елемента TEXTAREA. Дякую!
Філіпп

1
це також працює в Chrome. дякую, що заощадили мені трохи часу :) і дякую @Thinker за оригінальний код.
Велі Гебрев

Прийшов сюди з пошуку в Google ... Я знаю, що вашій відповіді рік, але дуже дякую за це. Працює як шарм
Майк Турлі

6
Є чи selмав в виду , щоб бути глобальним?
qwertymk

1
Для всіх, хто хоче версію coffeescript: gist.github.com/zachaysan/7100458
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');


Чи підкреслює цей текст також вставлений текст?
Олівер Стюблі

2
Але це рішення не буде працювати, коли користувач перемістить курсор кудись назад :) Так чи інакше, не майте на увазі.
Мислитель

3
ви використовуєте "це" як загорнутий набір і як елемент. хммм .. щойно спробував, і він не працює без редагувань
Скотт Еверден

4
Я також не міг змусити цей код працювати. Я використовую jQuery. Я спробував і текстову область, і текстове поле. Я вважаю, що для цього значення має бути, наприклад, this.val () тощо.
Нік,

1
Так, на IE він продовжував вставляти вгорі DOM, а на Fox він нічого не робив. Використання останнього JQuery ...
Caveatrob

19

Я знаю, що це давнє питання, але для людей, які шукають це рішення, варто зазначити, що ви не повинні використовувати додаток () для додавання вмісту до текстової області. метод append () націлює на внутрішнійHTML не значення textarea. Вміст може з’являтися в текстовій області, але він не буде доданий до значення форми елемента.

Як зазначено вище, використовуючи:

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

буде добре працювати.


13

це дозволить вам "ввести" фрагмент тексту в текстове поле, вводить означає: додає текст, де знаходиться курсор.

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: голосування за неінглійські змінні назви? Це все ще повністю читається як є. Кнопка вниз голосування повинна використовуватися, якщо відповідь не корисна, що тут не так. До речі, це також коштує вам декількох репутацій, коли ви голосуєте.
Джош М.

Знадобився час, щоб зрозуміти іспанський код. і в цьому коді є помилка. Він вставлявся завжди до початку текстового поля, а не до кінця. Наприклад: Якщо текст є: Шановний користувач і натисканням його, він вставлявся раніше, ніж після дорогого користувача, а не після користувача.
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, тому не знаю про всі прості у використанні функції.
Олівер Стюблі

Я теж порівняно новий. це весело і дуже просто, як тільки ви отримаєте повісити його. Перегляньте це, щоб отримати більше довідки: docs.jquery.com/Main_Page
Jason

5
Як зазначив Маркус нижче, append()не працює на значення a textarea. append()Метод націлений на innerHTML, а НЕ значення текстового поля.
Турадг

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+:

а) Отримайте позицію каретки:

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

б) Додайте текст у позиції каретки:

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

в) Приклад

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

Простим рішенням було б: ( Припущення : ви хочете, щоб усе, що ви вводили всередині текстового поля, додало до того, що вже є в текстовій області )

У події onClick тегу <a> напишіть визначену користувачем функцію, яка робить це:

function textType(){

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

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

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

}

(де ідентифікатори, 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");

Ремі


1
Ні, це не так. Якщо ви зміните html текстової області, ви побачите вміст там, але коли ви зберігаєте ФОРМУ, він не працює, оскільки для форми потрібне значення textarea, а не внутрішній HTML.
tothemario
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.