jQuery-Text () und Zeilenumbrüche


114

Ich möchte sagen können

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

und es wird mit Zeilenumbrüchen im Browser gerendert. Die einzige Problemumgehung, die ich gefunden habe, besteht darin, die CSS-Eigenschaft 'white-space' für someElem auf 'pre' zu setzen. Das funktioniert fast, aber dann habe ich einen ärgerlich großen Abstand zwischen dem Text und der Oberseite von someElem, selbst wenn ich den Abstand auf 0 setze. Gibt es eine Möglichkeit, dies loszuwerden?


2
Das <pre>Umschließen mit Tags (und die Verwendung von .html () anstelle von .text ()) ist meiner Meinung nach die einfachste und beste Lösung, um Zeilenumbrüche aus einer Textdatei oder aus einfachem Text beizubehalten (dies wird durch Karims Antwort unten vorgeschlagen). JEDOCH: Die neuere Alternative dazu ist die Verwendung white-space: pre-wrap;in Cleongs Antwort
edwardtyl

1
warum nicht append()anstelle von test()und <br/>anstelle von verwenden \n? so -$(someElem).append("this <br/> has <br/> newlines");
Erfan Ahmed

Antworten:


132

Es ist das Jahr 2015. Die richtige Antwort auf diese Frage lautet derzeit CSS white-space: pre-lineoder white-space: pre-wrap. Sauber und elegant. Die niedrigste Version von IE, die das Paar unterstützt, ist 8.

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

PS Bis CSS3 üblich wird, müssen Sie wahrscheinlich anfängliche und / oder nachfolgende Leerzeichen manuell abschneiden.


3
Dies sollte die Antwort sein.
Axel

3
Das ist die Antwort. Sollte höher sein. Willkommen zu 2016.
neoRiley

3
Fand dies im Jahr 2017: Immer noch relevant und immer noch die Antwort auf die Frage.
Troy Harris

6
In diesem Beitrag ist ein Fehler aufgetreten. Das Jahr ist 2017, nicht 2015. Alles andere sieht genau aus.
JDB erinnert sich noch an Monica

1
new Date("2016");
Brandito

60

Wenn Sie das jQuery-Objekt in einer Variablen speichern, können Sie Folgendes tun:

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>

Wenn Sie möchten, können Sie auch eine Funktion erstellen, um dies mit einem einfachen Aufruf zu tun, genau wie es jQuery.text () tut:

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


In der zweiten Zeile des ersten Codeausschnitts fehlt eine enge Klammer.
Mahmoud Fayez

1
Dies beantwortet tatsächlich die Frage der OP
Tommy

Beste, arbeitete wie ein Zauber und löste das Problem.
ZEESHAN ARSHAD

37

Folgendes benutze ich:

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
Tatsächlich ist es Marks Vorschlag überlegen, da es nicht dem Risiko eines XSS-Angriffs ausgesetzt ist.
Andrew B.

Ich denke, Sie könnten das div (dh: document.createElement ('div')) aus der Funktion heraus erstellen und es einfach für alle Aufrufe verwenden, oder?
Fabio Zadrozny

@FabioZadrozny: Ja, du hast recht! Ich habe die Antwort (fast) entsprechend bearbeitet. Das div wird jetzt innerhalb der Funktion, aber außerhalb der Schleife erstellt. Es könnte sich vollständig außerhalb der Funktion befinden, aber dann wird die Verwendung umständlich.
Peter V. Mørch

1
Ich glaube, @ Cleongs Antwort ist die beste Lösung dafür
Minillinim

Wenn Ihr Text explizite Zeilenumbrüche enthält, möchten Sie möglicherweise mit text.split(/\\n/)oder sogar teilen text.split(/\\\\n|\\n|\n/). Ich bin darauf gestoßen, als ich Text im JSON-Format mit einer API weitergegeben habe, die Literal- \nSteuerzeichen in Zeichenfolgen eingebettet hat .
D. Visser

20

Alternativ versuchen Sie es mit .htmlund dann wickeln mit <pre>Tags:

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

13

Sie können htmlanstelle textund ersetzen jedes Vorkommen von \ndurch <br>. Sie müssen Ihren Text jedoch korrekt maskieren.

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

@ Matthew Flaschen: Danke, behoben.
Mark Byers

7
Einige Leute, die diese Antwort lesen, wissen wahrscheinlich nicht, wie gefährlich dies ist. Verwenden Sie diese Lösung niemals mit vom Benutzer bereitgestelltem Text. Die Lösung von Peter Mørch ist vorzuziehen.
Andrew B.

1
@kulebyashik Peters Lösung verwenden, textwährend diese Antwort htmldirekt verwenden.
John Xiao

1

Ich würde vorschlagen, someElemdirekt mit dem Element zu arbeiten , da das Ersetzen .html()durch auch andere HTML-Tags innerhalb der Zeichenfolge ersetzen würde.

Hier ist meine Funktion:

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

Nennen Sie es bei:

someElem = nl2br(someElem);

1
HINWEIS FÜR DEN LESER: Diese Antwort ist besonders nützlich, wenn Sie ein Firefox-Add-On entwickeln möchten. innerHTML oder (.html () bei Verwendung von jQuery) wird von W3C und Mozilla verpönt, und der obige Code ist sehr hilfreich beim Löschen des Überprüfungsprozesses. Weitere Informationen finden Sie unter Sicherheitsüberlegungen @ developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML
Delicia Brummitt

1

Versuche dies:

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

0

Die Verwendung der CSS-Leerraum-Eigenschaft ist wahrscheinlich die beste Lösung. Verwenden Sie die Firebug- oder Chrome Developer Tools, um die Quelle der zusätzlichen Polsterung zu ermitteln, die Sie gesehen haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.