Joe Armstrong
Joe Armstrong

Reputation: 1599

How to include newlines in jQuery text()

I want to be able to say

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

and it renders with newlines in the browser. The only workaround I have found is to set the css property 'white-space' to 'pre' on someElem. This almost works, but then I have an annoyingly large padding between the text and the top of someElem, even when I set padding to 0. Is there a way to get rid of this?

Upvotes: 143

Views: 204332

Answers (8)

cleong
cleong

Reputation: 7606

The correct solution at this point is to use CSS white-space: pre-line or white-space: pre-wrap. Clean and elegant. The lowest version of IE that supports the pair is 8.

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

You may need to manually trim off initial and/or trailing white-spaces.

Upvotes: 162

Ruwen
Ruwen

Reputation: 3178

For me it works when using jquerys .html() function instead of .text() function. Then you can add <br/> for linebreaks.

var msg = someString + "<br/>" + anotherString;
$(elem).html(msg);

Upvotes: -2

daCoda
daCoda

Reputation: 3845

Try this:

$(someElem).html('this<br> has<br> newlines);

Upvotes: 4

Polyana Fontes
Polyana Fontes

Reputation: 3216

If you store the jQuery object in a variable you can do this:

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>

If you prefer, you can also create a function to do this with a simple call, just like jQuery.text() does:

$.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>

Upvotes: 72

Peter V. M&#248;rch
Peter V. M&#248;rch

Reputation: 15907

Here is what I use:

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

Upvotes: 37

JochenJung
JochenJung

Reputation: 7213

I would suggest to work with the someElem element directly, as replacements with .html() would replace other HTML tags within the string as well.

Here is my function:

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;
}

Call it by:

someElem = nl2br(someElem);

Upvotes: 1

Mark Byers
Mark Byers

Reputation: 838216

You can use html instead of text and replace each occurrence of \n with <br>. You will have to correctly escape your text though.

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

Upvotes: 15

karim79
karim79

Reputation: 342635

Alternatively, try using .html and then wrap with <pre> tags:

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

Upvotes: 22

Related Questions