144

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?

3
  • 3
    wrapping it with <pre> tags (and using .html() instead of .text()) is the easiest and best solution for maintaining line breaks from a text file or from plain text in my opinion (this is suggested by Karim's answer below). HOWEVER: The newer alternative to this is to use white-space: pre-wrap; as suggested in cleong's answer Commented Jul 24, 2015 at 17:09
  • 2
    why not use append() instead of test() and <br/> instead of \n ? like this - $(someElem).append("this <br/> has <br/> newlines"); Commented Jun 11, 2018 at 4:07
  • Possible duplicate here: stackoverflow.com/q/18071164/1066234 Commented Jun 23, 2023 at 15:02

8 Answers 8

162

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.

Sign up to request clarification or add additional context in comments.

5 Comments

I would agree with your premise, except some of us aren't blessed with systems that let us (easily) arbitrarily customize the CSS. For example, I'm maintaining a LightSwitch system which requires me to do all customization in post-render javascript, so that's another piece of strange code behind the scenes.
if you copy paste the pre-wrapped content from the browser to a word processor -> line breaks are lost
This is a good solution to handle multi-line text output. MDN - white-space
i'm a bit confused, how does this answer allow you to 'control' where the breaks occur? doesn't this answer simply integrate line wrap? also how can this possibly be the answer when the OP says they tried this already and it doesn't do what they are looking for?
I usually don't like CSS "hacks" but ya know what, this is a great solution in my case. Using .html() is too insecure, so I'm going with this.
72

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>

1 Comment

There is a missing close parenthesis in the second line of the first code snippet.
37

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

5 Comments

In fact, it is superior to Mark's suggestion because it isn't at risk of a XSS attack.
I think you could create the div (i.e.: document.createElement('div')) out of the function and just use it for all calls right?
@FabioZadrozny: Yes, you're right! I've edited the answer (almost) accordingly. The div is created inside the function but outside the loop now. It could be outside the function entirely, but then it gets cumbersome to use.
I believe @cleong's answer is the best solution for this
If you have explicit newline characters in your text, then you might want to split using text.split(/\\n/), or even text.split(/\\\\n|\\n|\n/). I encountered this while passing around text in JSON format with an API which embedded literal \n control characters in strings.
22

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

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

1 Comment

This is what I went with, I was using .text instead of.html
16

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

2 Comments

Some people reading this answer are likely to not know how dangerous this is. Never use this solution with user-supplied text. Peter Mørch's solution is preferable.
@kulebyashik Peter's solution use text while this answer use html directly.
4

Try this:

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

2 Comments

if you are back-end dev, looking for the quickest and easiest solution to understand, this is it! thanks!
this could have some security issues depending of the data origin
1

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

1 Comment

NOTE TO THE READER: This answer especially useful if you plan on developing a Firefox add on. innerHTML or (.html() if using jQuery) is frowned on by the W3C and Mozilla, and the code above is very helpful in clearing the review process. For more info see Security considerations @ developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML
-2

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

1 Comment

this could have some security issues depending of the data origin

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.