jQuery текст () та нові рядки


114

Я хочу вміти сказати

$(someElem).text('this\n has\n newlines);

і відображається з новими рядками у браузері. Єдине вирішення, яке я знайшов, - це встановити властивість css 'white-space' на 'pre' на someElem. Це майже працює, але тоді я маю набридливо велику прокладку між текстом і вершиною деякогоElem, навіть коли я встановлюю накладку на 0. Чи є спосіб позбутися від цього?


2
загортання його <pre>тегами (і використання .html () замість .text ()) - це найпростіше і найкраще рішення для збереження розривів рядків з текстового файлу або від простого тексту, на мою думку (про це говорить відповідь Каріма нижче). white-space: pre-wrap;ТАК: Новішою альтернативою цьому є використання, як пропонується у відповіді
Клеонга

1
чому б не використовувати append()замість test()і <br/>замість \n? як це -$(someElem).append("this <br/> has <br/> newlines");
Ерфан Ахмед

Відповіді:


132

Це 2015 рік. Правильна відповідь на це питання в даний момент - використовувати CSS white-space: pre-lineабо white-space: pre-wrap. Чисто та елегантно. Найнижча версія IE, яка підтримує пару, - 8.

https://css-tricks.com/almanac/properties/w/whitespace/

PS Доки CSS3 не стане загальним, вам, ймовірно, доведеться вручну обрізати початкові та / або пробіли пробілів.


3
Це має бути відповіддю.
Аксель

3
ЦЕ відповідь. Повинна бути вище. Ласкаво просимо в 2016.
neoRiley

3
Виявив це в 2017 році: все ще актуально, і все ще відповідь на питання.
Трой Харріс

6
У цій публікації є помилка. Рік - 2017, а не 2015. Все інше виглядає точно.
JDB досі пам’ятає Моніку

1
new Date("2016");
Брандіто

60

Якщо ви зберігаєте об'єкт jQuery у змінній, ви можете це зробити:

var obj = $("#example").text('this\n has\n newlines');
obj.html(obj.html().replace(/\n/g,'<br/>'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="example"></p>

Якщо ви віддаєте перевагу, ви також можете створити функцію для цього за допомогою простого дзвінка, як і jQuery.text ():

$.fn.multiline = function(text){
    this.text(text);
    this.html(this.html().replace(/\n/g,'<br/>'));
    return this;
}

// Now you can do this:
$("#example").multiline('this\n has\n newlines');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="example"></p>


У другому рядку першого фрагмента коду відсутня дужка з близькими дужками.
Махмуд Файез

1
це насправді відповідає на питання ОП
Томмі

Найкращий, працював як шарм і вирішував питання.
ZEESHAN ARSHAD

37

Ось що я використовую:

function htmlForTextWithEmbeddedNewlines(text) {
    var htmls = [];
    var lines = text.split(/\n/);
    // The temporary <div/> is to perform HTML entity encoding reliably.
    //
    // document.createElement() is *much* faster than jQuery('<div></div>')
    // http://stackoverflow.com/questions/268490/
    //
    // You don't need jQuery but then you need to struggle with browser
    // differences in innerText/textContent yourself
    var tmpDiv = jQuery(document.createElement('div'));
    for (var i = 0 ; i < lines.length ; i++) {
        htmls.push(tmpDiv.text(lines[i]).html());
    }
    return htmls.join("<br>");
}
jQuery('#div').html(htmlForTextWithEmbeddedNewlines("hello\nworld"));

1
Насправді він перевершує пропозицію Марка, оскільки не загрожує нападом XSS.
Андрій Б.

Я думаю, ви можете створити div (тобто: document.createElement ('div')) з функції та просто використовувати його для всіх дзвінків, правда?
Фабіо Задрозний

@FabioZadrozny: Так, ти маєш рацію! Відповідь я (майже) відредагував відповідно. Div створюється всередині функції, але зараз поза циклом. Це може бути повністю поза функцією, але тоді воно стає громіздким у використанні.
Петро В. Морч

1
Я вважаю, що відповідь @ cleong є найкращим рішенням для цього
minillinim

Якщо у вашому тексті є явні символи нового рядка, ви, можливо, захочете розділити їх за допомогою text.split(/\\n/), або навіть text.split(/\\\\n|\\n|\n/). Я зіткнувся з цим, переходячи текст у форматі JSON з API, який вбудовував \nв рядки буквальні контрольні символи.
D. Visser

20

Крім того , спробуйте використовувати , .htmlа потім загорнути з <pre>тегами:

$(someElem).html('this\n has\n newlines').wrap('<pre />');

13

Ви можете використовувати htmlзамість textі замінити кожне входження \nз <br>. Однак вам доведеться правильно уникнути тексту.

x = x.replace(/&/g, '&amp;')
     .replace(/>/g, '&gt;')
     .replace(/</g, '&lt;')
     .replace(/\n/g, '<br>');

@Matthew Flaschen: Дякую, виправлено.
Марк Байєрс

7
Деякі люди, які читають цю відповідь, ймовірно, не знають, наскільки це небезпечно. Ніколи не використовуйте це рішення з текстом, наданим користувачем. Рішення Пітера Морха є кращим.
Андрій Б.

1
@kulebyashik рішення Петра використовуйте, textтоді як цю відповідь використовуйте htmlбезпосередньо.
Джон Сяо

1

Я б запропонував someElemбезпосередньо працювати з елементом, оскільки замінники з ними .html()замінять і інші теги HTML в рядку.

Ось моя функція:

function nl2br(el) {
  var lines = $(el).text().split(/\n/);
  $(el).empty();
  for (var i = 0 ; i < lines.length ; i++) {
    if (i > 0) $(el).append('<br>');
    $(el).append(document.createTextNode(lines[i]));
  }
  return el;
}

Телефонуйте за телефоном:

someElem = nl2br(someElem);

1
ПРИМІТКА ДО ЧИТАТИ: Ця відповідь особливо корисна, якщо ви плануєте розробляти додаток для Firefox. innerHTML або (.html (), якщо використовується jQuery), нахмуріють W3C та Mozilla, і код вище дуже корисний для очищення процесу перегляду. Для отримання додаткової інформації див. Міркування щодо безпеки @ developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML
Delicia Brummitt


0

Використання властивості білого простору CSS - це, мабуть, найкраще рішення. Використовуйте Інструменти Firebug або Chrome Developer, щоб визначити джерело додаткового накладки, яке ви бачили.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.