jQuery text () и символы новой строки


114

Я хочу иметь возможность сказать

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

и отображается с новой строкой в ​​браузере. Единственный обходной путь, который я нашел, - установить для свойства css 'white-space' значение 'pre' на someElem. Это почти работает, но тогда у меня есть досадно большой отступ между текстом и верхней частью someElem, даже когда я устанавливаю отступ на 0. Есть ли способ избавиться от этого?


2
упаковка его <pre>тегами (и использование .html () вместо .text ()), на мой взгляд, является самым простым и лучшим решением для сохранения разрывов строк из текстового файла или из простого текста (это предлагается ответом Карима ниже). ОДНАКО: более новая альтернатива этому - использовать, white-space: pre-wrap;как предложено в ответе
cleong

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");
Brandito

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
это на самом деле отвечает на вопрос ОП
Томми

Лучший, работал как шарм и решил проблему.
ЗИШАН АРШАД

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')) из функции и просто использовать его для всех вызовов, верно?
Фабио Задрозный, 06

@FabioZadrozny: Да, ты прав! Я отредактировал ответ (почти) соответственно. Div создается внутри функции, но теперь вне цикла. Он может быть полностью вне функции, но тогда его становится неудобно использовать.
Peter V. Mørch

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, а приведенный выше код очень полезен для очистки процесса проверки. Для получения дополнительной информации см.
Вопросы


0

Возможно, лучшим решением будет использование свойства пустого пространства CSS. Используйте Firebug или Chrome Developer Tools, чтобы определить источник наблюдаемых дополнительных отступов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.