jQuery text () e newline


114

Voglio poterlo dire

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

ed esegue il rendering con le nuove righe nel browser. L'unica soluzione alternativa che ho trovato è impostare la proprietà CSS "white-space" su "pre" su someElem. Questo quasi funziona, ma poi ho una spaziatura fastidiosamente grande tra il testo e la parte superiore di someElem, anche quando ho impostato la spaziatura a 0. C'è un modo per sbarazzarsene?


2
avvolgendolo con <pre>tag (e usando .html () invece di .text ()) è la soluzione più semplice e migliore per mantenere le interruzioni di riga da un file di testo o da testo normale secondo me (questo è suggerito dalla risposta di Karim di seguito). TUTTAVIA: L'alternativa più recente a questo è quella di utilizzare white-space: pre-wrap;come suggerito nella risposta di
Cleong

1
perché non usare append()invece di test()e <br/>invece di \n? come questo -$(someElem).append("this <br/> has <br/> newlines");
Erfan Ahmed,

Risposte:


132

È l'anno 2015. La risposta corretta a questa domanda a questo punto è usare CSS white-space: pre-lineo white-space: pre-wrap. Pulito ed elegante. La versione più bassa di IE che supporta la coppia è 8.

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

PS Fino a quando CSS3 non diventerà comune , probabilmente dovrai tagliare manualmente gli spazi bianchi iniziali e / o finali.


3
Questa dovrebbe essere la risposta.
Axel

3
QUESTA è la risposta. Dovrebbe essere più alto. Benvenuti nel 2016.
neoRiley

3
Trovato questo nel 2017: ancora rilevante, e ancora la risposta alla domanda.
Troy Harris

6
C'è un errore in questo post. L'anno è il 2017, non il 2015. Tutto il resto sembra accurato.
JDB ricorda ancora Monica

1
new Date("2016");
Brandito

60

Se memorizzi l'oggetto jQuery in una variabile puoi farlo:

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>

Se preferisci, puoi anche creare una funzione per farlo con una semplice chiamata, proprio come fa 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>


Manca una parentesi chiusa nella seconda riga del primo frammento di codice.
Mahmoud Fayez

1
questo risponde effettivamente alla domanda degli OP
Tommy

Il migliore, ha funzionato alla grande e ha risolto il problema.
ZEESHAN ARSHAD

37

Ecco cosa uso:

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
In effetti, è superiore al suggerimento di Mark perché non è a rischio di un attacco XSS.
Andrew B.

Penso che potresti creare il div (ad esempio: document.createElement ('div')) dalla funzione e usarlo per tutte le chiamate, giusto?
Fabio Zadrozny

@FabioZadrozny: Sì, hai ragione! Ho modificato la risposta (quasi) di conseguenza. Il div viene creato all'interno della funzione ma ora fuori dal ciclo. Potrebbe essere completamente al di fuori della funzione, ma poi diventa complicato da usare.
Peter V. Mørch

1
Credo che la risposta di @ cleong sia la soluzione migliore per questo
minillinim

Se hai caratteri di nuova riga espliciti nel tuo testo, potresti voler dividere usando text.split(/\\n/), o anche text.split(/\\\\n|\\n|\n/). Ho riscontrato questo problema durante la trasmissione di testo in formato JSON con un'API che incorporava \ncaratteri di controllo letterali nelle stringhe.
D.Visser

20

In alternativa, provare a utilizzare .htmle poi avvolgere con <pre>tag:

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

13

È possibile utilizzare htmlinvece di texte sostituire ogni occorrenza di \ncon <br>. Tuttavia, dovrai eseguire correttamente l'escape del testo.

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

@ Matthew Flaschen: Grazie, risolto.
Mark Byers

7
Alcune persone che leggono questa risposta probabilmente non sanno quanto sia pericoloso. Non utilizzare mai questa soluzione con il testo fornito dall'utente. La soluzione di Peter Mørch è preferibile.
Andrew B.

1
@kulebyashik La soluzione di Peter usa textmentre questa risposta viene utilizzata htmldirettamente.
John Xiao

1

Suggerirei di lavorare someElemdirettamente con l' elemento, poiché le sostituzioni con .html()sostituirebbero anche altri tag HTML all'interno della stringa.

Ecco la mia funzione:

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

Chiamalo da:

someElem = nl2br(someElem);

1
NOTA PER IL LETTORE: questa risposta è particolarmente utile se prevedi di sviluppare un componente aggiuntivo per Firefox. innerHTML o (.html () se si utilizza jQuery) è disapprovato da W3C e Mozilla, e il codice sopra è molto utile per cancellare il processo di revisione. Per maggiori informazioni, vedi Considerazioni sulla sicurezza @ developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML
Delicia Brummitt

1

Prova questo:

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

0

L'uso della proprietà CSS white-space è probabilmente la soluzione migliore. Utilizza Firebug o Strumenti per sviluppatori di Chrome per identificare la fonte del riempimento aggiuntivo che stavi vedendo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.