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?

Joe Armstrong
quelle
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.

Cleong
quelle
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>

José Roberto Araújo Júnior
quelle
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"));
Peter V. Mørch
quelle
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 />');
karim79
quelle
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>');
Mark Byers
quelle
@ 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);
JochenJung
quelle
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);
daCoda
quelle
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.

Andrew B.
quelle