как динамически вставлять текст в textarea из jquery [duplicate]

Браузер всегда откроет ссылку на новой вкладке, если ссылка находится в том же домене (на том же сайте). Если ссылка находится в другом домене, она откроет ее в новой вкладке / окне, в зависимости от настроек браузера.

Итак, в соответствии с этим мы можем использовать:

<a class="my-link" href="http://www.mywebsite.com" rel="http://www.otherwebsite.com">new tab</a>

И добавьте код jQuery:

jQuery(document).ready(function () {
    jQuery(".my-link").on("click",function(){
        var w = window.open('http://www.mywebsite.com','_blank');
        w.focus();
        w.location.href = jQuery(this).attr('rel');
        return false;
    });
});

Итак, сначала откройте новое окно на одном сайте с _blank target (он откроет его на новой вкладке), а затем откройте ваш желаемый веб-сайт в этом новом окне.

143
задан Click Upvote 30 June 2009 в 15:47
поделиться

13 ответов

Используйте это, из здесь :

function insertAtCaret(areaId, text) {
  var txtarea = document.getElementById(areaId);
  if (!txtarea) {
    return;
  }

  var scrollPos = txtarea.scrollTop;
  var strPos = 0;
  var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ?
    "ff" : (document.selection ? "ie" : false));
  if (br == "ie") {
    txtarea.focus();
    var range = document.selection.createRange();
    range.moveStart('character', -txtarea.value.length);
    strPos = range.text.length;
  } else if (br == "ff") {
    strPos = txtarea.selectionStart;
  }

  var front = (txtarea.value).substring(0, strPos);
  var back = (txtarea.value).substring(strPos, txtarea.value.length);
  txtarea.value = front + text + back;
  strPos = strPos + text.length;
  if (br == "ie") {
    txtarea.focus();
    var ieRange = document.selection.createRange();
    ieRange.moveStart('character', -txtarea.value.length);
    ieRange.moveStart('character', strPos);
    ieRange.moveEnd('character', 0);
    ieRange.select();
  } else if (br == "ff") {
    txtarea.selectionStart = strPos;
    txtarea.selectionEnd = strPos;
    txtarea.focus();
  }

  txtarea.scrollTop = scrollPos;
}
<textarea id="textareaid"></textarea>
<a href="#" onclick="insertAtCaret('textareaid', 'text to insert');return false;">Click Here to Insert</a>

210
ответ дан 6 revs, 6 users 42% 18 August 2018 в 21:31
поделиться
  • 1
    Могу ли я купить вам пиво? шутки в сторону? – Ahmad Alfy 4 June 2013 в 10:01
  • 2
    wwwooooo, спасибо !!!!!!!!!!!!!!!!!!!!!!!!!!!!! – Fernando 27 December 2014 в 19:20
  • 3
    Это отлично работает, но не обрабатывает замену выделенного текста, как это делают все текстовые редакторы. Это может не потребоваться для оригинального вопроса, но если вам это нужно, вы можете просто заменить 'strPos' на 'txtArea.selectionEnd'. Мой ответ ниже показывает это, наряду с удалением кода обнаружения браузера, если вам не нужно поддерживать более старые версии IE. – Jeffrey Harmon 5 February 2015 в 21:37
  • 4
    Рабочий пример jsfiddle.net/deFreitas/7s40cp1a/1 – deFreitas 5 May 2016 в 16:42
  • 5
    Есть ли способ выбрать все элементы с помощью areaId? – haykam 28 July 2016 в 19:09

Как вставить некоторый текст в текущую позицию курсора TextBox через JQuery и JavaScript

Процесс

  1. Найти текущую позицию курсора
  2. Получить текст, который нужно скопировать
  3. Установите текст там
  4. Обновить положение курсора

Здесь у меня есть 2 текстовых блока и кнопка. Я должен нажать на определенную позицию в текстовом поле, а затем нажать кнопку, чтобы вставить текст из другого текстового поля в позицию предыдущего текстового поля.

Основная проблема заключается в том, что получение текущего курсора где мы вставим текст.

//Textbox on which to be pasted
<input type="text" id="txtOnWhichToBePasted" />

//Textbox from where to be pasted
<input type="text" id="txtFromWhichToBePasted" />


//Button on which click the text to be pasted
<input type="button" id="btnInsert" value="Insert"/>


<script type="text/javascript">

$(document).ready(function () {
    $('#btnInsert').bind('click', function () {
            var TextToBePasted = $('#txtFromWhichToBePasted').value;
            var ControlOnWhichToBePasted = $('#txtOnWhichToBePasted');

            //Paste the Text
            PasteTag(ControlOnWhichToBePasted, TextToBePasted);
        });
    });

//Function Pasting The Text
function PasteTag(ControlOnWhichToBePasted,TextToBePasted) {
    //Get the position where to be paste

    var CaretPos = 0;
    // IE Support
    if (document.selection) {

        ControlOnWhichToBePasted.focus();
        var Sel = document.selection.createRange();

        Sel.moveStart('character', -ctrl.value.length);

        CaretPos = Sel.text.length;
    }
    // Firefox support
    else if (ControlOnWhichToBePasted.selectionStart || ControlOnWhichToBePasted.selectionStart == '0')
        CaretPos = ControlOnWhichToBePasted.selectionStart;

    //paste the text
    var WholeString = ControlOnWhichToBePasted.value;
    var txt1 = WholeString.substring(0, CaretPos);
    var txt2 = WholeString.substring(CaretPos, WholeString.length);
    WholeString = txt1 + TextToBePasted + txt2;
    var CaretPos = txt1.length + TextToBePasted.length;
    ControlOnWhichToBePasted.value = WholeString;

    //update The cursor position 
    setCaretPosition(ControlOnWhichToBePasted, CaretPos);
}

function setCaretPosition(ControlOnWhichToBePasted, pos) {

    if (ControlOnWhichToBePasted.setSelectionRange) {
        ControlOnWhichToBePasted.focus();
        ControlOnWhichToBePasted.setSelectionRange(pos, pos);
    }
    else if (ControlOnWhichToBePasted.createTextRange) {
        var range = ControlOnWhichToBePasted.createTextRange();
        range.collapse(true);
        range.moveEnd('character', pos);
        range.moveStart('character', pos);
        range.select();
    }
}

</script>
4
ответ дан Chris Peters 18 August 2018 в 21:31
поделиться

вы можете только сфокусировать требуемое текстовое поле и вставить туда текст. нет способа узнать, где фокус AFAIK (возможно, взаимодействие со всеми узлами DOM?).

проверить этот стековый поток - у него есть решение для вас: Как узнать, какой элемент DOM имеет фокус?

131
ответ дан Community 18 August 2018 в 21:31
поделиться
  • 1
    Очень просто по сравнению с другими. +1 – MacroMan 6 February 2014 в 12:54
  • 2
    еще лучше с помощью кеширования: jsfiddle.net/NaHTw/304 – silviomoreto 24 June 2014 в 19:51
  • 3
    Вы также можете восстановить позицию каретки после изменения значения с помощью: document.getElementById("txt").selectionStart = caretPos + txtToAdd.length. – Bludwarf 14 August 2015 в 10:45
  • 4
    Ну, если вы собираетесь пойти так далеко, удалив jQuery, вы также можете удалить все . ; ^) – ruffin 19 April 2016 в 21:39
  • 5
    Просто, чтобы помочь, вот полное решение с восстановлением позиции каретки плюс заменить выбранную область на вставленном контенте: jsfiddle.net/NaHTw/1028 – AlfaTeK 4 May 2017 в 17:40

Код выше не работал для меня в IE. Вот какой код на основе этого ответа .

Я достал getElementById, чтобы я мог ссылаться на элемент по-другому.

function insertAtCaret(element, text) {
  if (document.selection) {
    element.focus();
    var sel = document.selection.createRange();
    sel.text = text;
    element.focus();
  } else if (element.selectionStart || element.selectionStart === 0) {
    var startPos = element.selectionStart;
    var endPos = element.selectionEnd;
    var scrollTop = element.scrollTop;
    element.value = element.value.substring(0, startPos) +
      text + element.value.substring(endPos, element.value.length);
    element.focus();
    element.selectionStart = startPos + text.length;
    element.selectionEnd = startPos + text.length;
    element.scrollTop = scrollTop;
  } else {
    element.value += text;
    element.focus();
  }
}
input{width:100px}
label{display:block;margin:10px 0}
<label for="in2copy">Copy text from: <input id="in2copy" type="text" value="x"></label>
<label for="in2ins">Element to insert: <input id="in2ins" type="text" value="1,2,3" autofocus></label>
<button onclick="insertAtCaret(document.getElementById('in2ins'),document.getElementById('in2copy').value)">Insert</button>

EDIT: Добавлен исполняемый фрагмент, jQuery не используется.

18
ответ дан CPHPython 18 August 2018 в 21:31
поделиться
  • 1
    Является ли элемент объектом jquery или нет? element.value и element.focus () не могут работать ... – Scott Stafford 23 May 2012 в 04:18
  • 2
    element.focus() - законный метод JavaScript для DOMElements: w3schools.com/jsref/met_html_focus.asp – oliverseal 26 December 2012 в 09:26
  • 3
    Лучшая идея - отказаться от совместимости с IE. – ar2015 4 May 2018 в 02:16
  • 4
    Да, я написал этот ответ 7 лет назад. В этот момент IE 11 является хорошей минимальной поддерживаемой версией, и здесь работает код. – Collin Anderson 4 May 2018 в 13:33

Я думаю, вы могли бы использовать следующий JavaScript для отслеживания текстового поля с последним фокусом:

<script>
var holdFocus;

function updateFocus(x)
{
    holdFocus = x;
}

function appendTextToLastFocus(text)
{
    holdFocus.value += text;
}
</script>

Использование:

<input type="textbox" onfocus="updateFocus(this)" />
<a href="#" onclick="appendTextToLastFocus('textToAppend')" />

Предыдущее решение (реквизит для gclaghorn) использует textarea и вычисляет положение курсора, так что это может быть лучше для того, что вы хотите. С другой стороны, этот был бы более легким, если это то, что вы ищете.

3
ответ дан DreadPirateShawn 18 August 2018 в 21:31
поделиться
  • 1
    Хорошая идея. Я использовал jquery, чтобы каждое текстовое поле, имеющее определенный класс, применяло это событие к ним вместо того, чтобы ставить «onfocus = ... & quot; в html каждого текстового поля. Но хороший подход :) – Click Upvote 30 June 2009 в 16:04

Содержимое Редактируемый, HTML или любой другой элемент DOM. Выбор

Если вы пытаетесь вставить в карете на <div contenteditable="true">, это становится намного сложнее, особенно если в пределах редактируемого контейнера есть дети.

Мне очень повезло с использованием библиотеки Rangy:

У этого есть тонна замечательных функций, таких как:

  • Сохранить позицию или выбор
  • Затем позже Восстановить позицию или выбор
  • Получить выделение HTML или Plaintext
  • Среди многих других

Онлайн-демо не работало последнее, что я проверил, однако у репо есть рабочие демонстрации. Чтобы начать работу, просто загрузите Repo из Git или NPM, затем откройте ./rangy/demos/index.html

. Это делает работу с позицией post и текстом легким!

0
ответ дан factorypolaris 18 August 2018 в 21:31
поделиться

Утвержденный ответ Джорджа Клагхорна отлично подойдет для простого вставки текста в позицию курсора. Если пользователь выделил текст, и вы хотите, чтобы этот текст был заменен (по умолчанию используется большинство текста), вам нужно внести небольшое изменение при установке переменной «назад».

Кроме того, если вам не нужно поддерживать более старые версии IE, современные версии поддерживают textarea.selectionStart, поэтому вы можете удалить все обнаружение браузера и код, специфичный для IE.

Вот упрощенная версия, которая работает для Chrome и IE11 по крайней мере, и обрабатывает замену выделенного текста.

function insertAtCaret(areaId, text) {
    var txtarea = document.getElementById(areaId);
    var scrollPos = txtarea.scrollTop;
    var caretPos = txtarea.selectionStart;

    var front = (txtarea.value).substring(0, caretPos);
    var back = (txtarea.value).substring(txtarea.selectionEnd, txtarea.value.length);
    txtarea.value = front + text + back;
    caretPos = caretPos + text.length;
    txtarea.selectionStart = caretPos;
    txtarea.selectionEnd = caretPos;
    txtarea.focus();
    txtarea.scrollTop = scrollPos;
}
33
ответ дан Jeffrey Harmon 18 August 2018 в 21:31
поделиться

Этот плагин jQuery дает вам готовый способ выбора / каттинга.

1
ответ дан Julian 18 August 2018 в 21:31
поделиться

Принятый ответ не работал для меня в Internet Explorer 9. Я проверил его и обнаружение браузера работало неправильно, оно обнаружило ff (firefox), когда я был в Internet Explorer.

I просто это изменение:

if ($.browser.msie) 

Вместо:

if (br == "ie") { 

В результате получился следующий код:

function insertAtCaret(areaId,text) {
    var txtarea = document.getElementById(areaId);
    var scrollPos = txtarea.scrollTop;
    var strPos = 0;
    var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? 
        "ff" : (document.selection ? "ie" : false ) );

    if ($.browser.msie) { 
        txtarea.focus();
        var range = document.selection.createRange();
        range.moveStart ('character', -txtarea.value.length);
        strPos = range.text.length;
    }
    else if (br == "ff") strPos = txtarea.selectionStart;

    var front = (txtarea.value).substring(0,strPos);  
    var back = (txtarea.value).substring(strPos,txtarea.value.length); 
    txtarea.value=front+text+back;
    strPos = strPos + text.length;
    if (br == "ie") { 
        txtarea.focus();
        var range = document.selection.createRange();
        range.moveStart ('character', -txtarea.value.length);
        range.moveStart ('character', strPos);
        range.moveEnd ('character', 0);
        range.select();
    }
    else if (br == "ff") {
        txtarea.selectionStart = strPos;
        txtarea.selectionEnd = strPos;
        txtarea.focus();
    }
    txtarea.scrollTop = scrollPos;
}
1
ответ дан Kemal Fadillah 18 August 2018 в 21:31
поделиться

с помощью ответа @quick_sliv:

function insertAtCaret(el, text) {
    var caretPos = el.selectionStart;
    var textAreaTxt = el.value;
    el.value = textAreaTxt.substring(0, caretPos) + text + textAreaTxt.substring(caretPos);
};
5
ответ дан math2001 18 August 2018 в 21:31
поделиться

Добавление текста в текущую позицию курсора включает в себя два шага:

  1. Добавление текста в текущую позицию курсора
  2. Обновление текущей позиции курсора

Демо: https://codepen.io/anon/pen/qZXmgN

Протестировано в Chrome 48, Firefox 45, IE 11 и Edge 25

JS:

function addTextAtCaret(textAreaId, text) {
    var textArea = document.getElementById(textAreaId);
    var cursorPosition = textArea.selectionStart;
    addTextAtCursorPosition(textArea, cursorPosition, text);
    updateCursorPosition(cursorPosition, text, textArea);
}
function addTextAtCursorPosition(textArea, cursorPosition, text) {
    var front = (textArea.value).substring(0, cursorPosition);
    var back = (textArea.value).substring(cursorPosition, textArea.value.length);
    textArea.value = front + text + back;
}
function updateCursorPosition(cursorPosition, text, textArea) {
    cursorPosition = cursorPosition + text.length;
    textArea.selectionStart = cursorPosition;
    textArea.selectionEnd = cursorPosition;
    textArea.focus();    
}

HTML:

<div>
    <button type="button" onclick="addTextAtCaret('textArea','Apple')">Insert Apple!</button>
    <button type="button" onclick="addTextAtCaret('textArea','Mango')">Insert Mango!</button>
    <button type="button" onclick="addTextAtCaret('textArea','Orange')">Insert Orange!</button>
</div>
<textarea id="textArea" rows="20" cols="50"></textarea>
2
ответ дан Razan Paul 18 August 2018 в 21:31
поделиться
132
ответ дан Community 7 September 2018 в 05:20
поделиться
135
ответ дан Community 30 October 2018 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: