Подтвердить что ты не робот

Копировать из textarea в div, сохраняя разрывы строк

У меня есть <textarea> и <div><p> внутри). При вводе текста в область, <p> обновляется с содержимым на keyUp.

Есть ли способ сохранить linebreaks (новую строку) из текстового поля и каким-то образом заставить их работать как linebreaks в div/p?

Замена двойной "новой строки" на </p><p>, возможно ли это? Это близко к тому, что будет обрабатывать wysiwyg, но не хочет этого для этого, это очень маленький проект.


Это то, что у меня есть до сих пор.

$(".box textarea").keyup(function () {
  var value = $(this).val();  
  $('.box p').text(value);
});
4b9b3361

Ответ 1

Вы можете просто сделать это:

$('.box textarea').keyup(function() {
    var value = $(this).val().replace(/\n/g, '<br/>');
    $(".box p").html(value);
});

Это заменит все разрывы строк \n в вашем элементе textarea и заменит их всем тегом html <br/>, чтобы вы могли сохранить разрывы строк в текстовом поле внутри элемента тега <p>.

Простой демонстрационный пример здесь:

$('.box textarea').keyup(function() {
  $(".box p").html(this.value.replace(/\n/g, '<br/>'));
});
textarea,p {
  width: 90%;
  height: 80px;
}
p {
  border: 1px solid #eee;
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="box">
  <textarea></textarea>
  <br/>
  <p></p>
</div>

Ответ 2

Вероятно, вы хотите добавить правило CSS white-space: pre или white-space: pre-wrap в .box p. Это будет отображать пробелы как есть.

Ответ 3

Здесь самое простое и безопасное решение для jQuery:

$(".box textarea").keyup(function () {
  var value = $(this).val();
  $('.box p').text(value).css('white-space', 'pre-wrap');
});

Конечно, если вы можете добавить .box p { white-space: pre-wrap } в свои статические стили CSS, тогда вам не нужно вводить его с помощью jQuery.

(Также обратите внимание, что white-space: pre-wrap также позволяет сохранить несколько последовательных пробелов и не сворачиваться в одно пространство. вы не хотите этого, но все же хотите сохранить разрывы строк, вместо этого используйте white-space: pre-line.)


Ps. Вы никогда не должны передавать неограниченный пользовательский ввод в .html() (как, например, текущий принятый ответ), так как это приведет к искажению вывода, если вход содержит любые метасимволы HTML, такие как & или <, а также может открыть вам Атаки HTML и межсайтовые скрипты (XSS), если на вход может повлиять злонамеренный злоумышленник.

Если вы абсолютно настаиваете на том, чтобы не использовать свойство CSS white-space в любой форме, вам нужно сначала избежать любых метасимволов HTML во входном файле, прежде чем добавлять в него теги <br>. Вероятно, самый простой и безопасный способ сделать это - позволить браузеру управлять экранированием для вас, например. например:

$(".box textarea").keyup(function () {
  var value = $(this).val();
  $('.box div.output').text(value).html(function (index, html) {
    return '<p>' + html.replace(/[^\S\n]+\n/g, '\n').replace(/\n\n+/g, '</p><p>').replace(/\n/g, '<br>') + '</p>';
  });
});

Сначала будет скопирован текст ввода в целевой элемент с помощью .text() (который автоматически удаляет HTML-код), а затем изменяет полученный HTML-код, чтобы удалить конечные пробелы из строк, чтобы свернуть несколько последовательных строк в перерывах абзаца и наконец, заменить отдельные строки с тегами <br>.

(Обратите внимание, что для того, чтобы разрешить несколько абзацев на выходе, целевой элемент должен действительно быть элементом <div>, а не <p>. Вложение одного элемента <p> внутри другого недействительно HTML и может не дают согласованных результатов в разных браузерах.)

Ответ 4

Используйте string.replace("\n", "<br/>") для замены любых разрывов строк в текстовой области на новую строку на вашей странице.

JavaScript:

<script type="text/javascript">
function ta()
{
taValue = document.getElementById("ta").value;
taValue = taValue.replace("\n", "<br/>");
document.getElementById("tatext").innerHTML = taValue;
}
</script>

HTML:

<textarea id="ta" onkeyup="ta()"></textarea>
<div id="tatext"></div>