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

Как сохранить разрывы строк при получении текста из текстового поля?

Я получаю значение в текстовом поле, когда пользователь попадает в submit. Затем я принимаю это значение и размещаю его в другом месте на странице. Однако, когда я это делаю, он теряет символы новой строки, делая вывод довольно уродливым.

Вот текстовое поле, к которому я обращаюсь:

<textarea id="post-text" class="form-control" rows="3" placeholder="What up?" required></textarea>

Вот код JavaScript, доступ к сообщению и его расшифровка.

var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.append(postText);
var card = document.createElement('div');
card.append(post);
var cardStack = document.getElementById('#card-stack');
cardStack.prepend(card);

Когда ввод выглядит примерно так:

Групповой график:

Вторник практика @5-й этаж (с 20:00 до 23:00)

Четвертая практика @5-й этаж (с 20:00 до 23:00)

Воскресная практика @(с 21:00 до 12:00)

Вывод:

Групповой график: во вторник практика @5-й этаж (с 20:00 до 23:00) Четверг практика @5-й этаж (с 20:00 до 23:00) Воскресная практика @(с 21:00 до 12:00)

Итак, есть ли способ сохранить разрывы строк?

4b9b3361

Ответ 1

Самое простое решение - просто вставить элемент, в который вы вставляете текст, со следующим свойством CSS:

white-space: pre-wrap;

Это свойство позволяет обрабатывать пробелы и символы новой строки в соответствующих элементах так же, как внутри <textarea>. То есть последовательные пробелы не сбрасываются, а строки разбиваются на явные строки новой строки (но также автоматически завершаются, если они превышают ширину элемента).

Учитывая, что некоторые из ответов, опубликованных здесь до сих пор, были уязвимы для HTML-инъекции (например, потому что они назначают несвязанный пользовательский ввод innerHTML) или в противном случае ошибка, позвольте мне привести пример того, как сделать это безопасно и правильно, на основе вашего исходного кода:

document.getElementById('post-button').addEventListener('click', function () {
  var post = document.createElement('p');
  var postText = document.getElementById('post-text').value;
  post.append(postText);
  var card = document.createElement('div');
  card.append(post);
  var cardStack = document.getElementById('card-stack');
  cardStack.prepend(card);
});
#card-stack p {
  background: #ddd;
  white-space: pre-wrap;  /* <-- THIS PRESERVES THE LINE BREAKS */
}
textarea {
  width: 100%;
}
<textarea id="post-text" class="form-control" rows="8" placeholder="What up?" required>Group Schedule:

Tuesday practice @ 5th floor (8pm - 11 pm)

Thursday practice @ 5th floor (8pm - 11 pm)

Sunday practice @ (9pm - 12 am)</textarea><br>
<input type="button" id="post-button" value="Post!">
<div id="card-stack"></div>

Ответ 2

Целевой контейнер должен иметь стиль white-space:pre. Попробуйте это ниже.

<script>
function copycontent(){
 var content = document.getElementById('ta').value;
 document.getElementById('target').innerText = content;
}
</script>
<textarea id='ta' rows='3'>
  line 1
  line 2
  line 3
</textarea>
<button id='btn' onclick='copycontent();'>
Copy
</button>
<p id='target' style='white-space:pre'>

</p>

Ответ 3

function get() {
  var arrayOfRows = document.getElementById("ta").value.split("\n");
  var docfrag = document.createDocumentFragment();
  
  var p = document.getElementById("result");
  while (p.firstChild) {
    p.removeChild(p.firstChild);
  }
  
  arrayOfRows.forEach(function(row, index, array) {
    var span = document.createElement("span");
    span.textContent = row;
    docfrag.appendChild(span);
    if(index < array.length - 1) {
      docfrag.appendChild(document.createElement("br"));
    }
  });

  p.appendChild(docfrag);
}
<textarea id="ta" rows=3></textarea><br>
<button onclick="get()">get</button>
<p id="result"></p>

Ответ 4

Вы можете установить width div с помощью Javascript и добавить white-space:pre-wrap в p tag, это сломает ваш контент textarea в конце каждой строки.

document.querySelector("button").onclick = function gt(){
var card = document.createElement('div');
card.style.width = "160px";
card.style.background = "#eee";
var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.style.whiteSpace = "pre-wrap";
card.append(post);
post.append(postText);
document.body.append(card);
}
<textarea id="post-text" class="form-control" rows="3" placeholder="What up?" required>
Group Schedule:

Tuesday practice @ 5th floor (8pm - 11 pm)

Thursday practice @ 5th floor (8pm - 11 pm)

Sunday practice @ (9pm - 12 am)</textarea>
<br><br>
<button>Copy!!</button>

Ответ 5

Я предполагаю, что вы не хотите, чтобы ваш textarea-контент обрабатывался как HTML. В этом случае вы можете просто установить его как открытый текст, чтобы браузер не рассматривал его как HTML и не удалял новые строки. Не требуется CSS или предварительная обработка.

<script>
function copycontent(){
 var content = document.getElementById('ta').value;
 document.getElementById('target').innerText = content;
}
</script>
<textarea id='ta' rows='3'>
  line 1
  line 2
  line 3
</textarea>
<button id='btn' onclick='copycontent();'>
Copy
</button>
<p id='target'></p>

Ответ 6

Вот идея, поскольку у вас может быть несколько строк в текстовом поле:

 var text=document.getElementById('post-text').value.split('\n');
 var html = text.join('<br />');

Это значение HTML сохранит новую строку. Надеюсь, это поможет.

Ответ 7

Похожие вопросы здесь

обнаружить разрывы строк в текстовом поле

обнаружить разрыв строки в textarea

Вы можете попробовать следующее:

var submit = document.getElementById('submit');

submit.addEventListener('click', function(){
var textContent = document.querySelector('textarea').value;
  
document.getElementById('output').innerHTML = textContent.replace(/\n/g, '<br/>');
  

});
<textarea cols=30 rows=10 >This is some text
this is another text

Another text again and again</textarea>
<input type='submit' id='submit'>


<p id='output'></p>