jQuery text () dan baris baru

114

Saya ingin bisa mengatakan

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

dan merender dengan baris baru di browser. Satu-satunya solusi yang saya temukan adalah menyetel properti css 'white-space' menjadi 'pre' on someElem. Ini hampir berhasil, tetapi kemudian saya memiliki padding yang sangat besar antara teks dan bagian atas beberapaElem, bahkan ketika saya menyetel padding ke 0. Apakah ada cara untuk menghilangkan ini?

Joe Armstrong
sumber
2
membungkusnya dengan <pre>tag (dan menggunakan .html () daripada .text ()) adalah solusi termudah dan terbaik untuk mempertahankan jeda baris dari file teks atau dari teks biasa menurut pendapat saya (ini disarankan oleh jawaban Karim di bawah). NAMUN: Alternatif yang lebih baru untuk ini adalah dengan menggunakan white-space: pre-wrap;seperti yang disarankan dalam jawaban
cleong
1
mengapa tidak digunakan append()sebagai gantinya test()dan <br/>sebagai gantinya \n? seperti ini -$(someElem).append("this <br/> has <br/> newlines");
Erfan Ahmed

Jawaban:

132

Ini tahun 2015. Jawaban yang benar untuk pertanyaan ini pada saat ini adalah menggunakan CSS white-space: pre-lineatauwhite-space: pre-wrap . Bersih dan elegan. Versi IE terendah yang mendukung pasangan ini adalah 8.

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

PS Sampai CSS3 menjadi umum, Anda mungkin perlu memangkas spasi awal dan / atau akhiran secara manual.

cleong
sumber
3
Ini harus menjadi jawabannya.
Axel
3
INILAH jawabannya. Seharusnya lebih tinggi. Selamat datang di 2016.
neoRiley
3
Menemukan ini di 2017: Masih relevan, dan masih merupakan jawaban atas pertanyaan.
Troy Harris
6
Ada kesalahan dalam posting ini. Tahunnya 2017, bukan 2015. Yang lainnya terlihat akurat.
JDB masih mengingat Monica
1
new Date("2016");
Brandito
60

Jika Anda menyimpan objek jQuery dalam variabel, Anda dapat melakukan ini:

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>

Jika mau, Anda juga dapat membuat fungsi untuk melakukan ini dengan panggilan sederhana, seperti yang dilakukan 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>

José Roberto Araújo Júnior
sumber
Ada tanda kurung tutup yang hilang di baris kedua dari cuplikan kode pertama.
Mahmoud Fayez
1
ini sebenarnya menjawab pertanyaan OP
Tommy
Yang terbaik, bekerja dengan sangat baik dan menyelesaikan masalah.
ZEESHAN ARSHAD
37

Inilah yang saya gunakan:

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
sumber
1
Faktanya, ini lebih unggul dari saran Mark karena tidak berisiko terkena serangan XSS.
Andrew B.
Saya pikir Anda dapat membuat div (yaitu: document.createElement ('div')) dari fungsi dan hanya menggunakannya untuk semua panggilan, bukan?
Fabio Zadrozny
@FabioZadrozny: Ya, Anda benar! Saya telah mengedit jawabannya (hampir) sesuai. Div dibuat di dalam fungsi tetapi di luar loop sekarang. Bisa jadi di luar fungsi seluruhnya, tapi kemudian menjadi rumit untuk digunakan.
Peter V. Mørch
1
Saya percaya jawaban @ cleong adalah solusi terbaik untuk ini
minillinim
Jika Anda memiliki karakter baris baru yang eksplisit dalam teks Anda, maka Anda mungkin ingin memisahkan menggunakan text.split(/\\n/), atau bahkan text.split(/\\\\n|\\n|\n/). Saya mengalami ini saat membagikan teks dalam format JSON dengan API yang menyematkan \nkarakter kontrol literal dalam string.
D. Visser
20

Atau, coba gunakan .htmllalu bungkus dengan <pre>tag:

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

Anda dapat menggunakan htmlsebagai textganti dan mengganti setiap kemunculan \ndengan <br>. Anda harus benar-benar keluar dari teks Anda.

x = x.replace(/&/g, '&amp;')
     .replace(/>/g, '&gt;')
     .replace(/</g, '&lt;')
     .replace(/\n/g, '<br>');
Mark Byers
sumber
@Matthew Flaschen: Terima kasih, sudah diperbaiki.
Mark Byers
7
Beberapa orang yang membaca jawaban ini mungkin tidak tahu betapa berbahayanya ini. Jangan pernah menggunakan solusi ini dengan teks yang disediakan pengguna. Solusi Peter Mørch lebih disukai.
Andrew B.
1
@kulebyashik Peter menggunakan solusi textsementara jawaban ini digunakan htmlsecara langsung.
John Xiao
1

Saya akan menyarankan untuk bekerja dengan someElemelemen secara langsung, karena penggantian dengan .html()akan menggantikan tag HTML lain di dalam string juga.

Inilah fungsi saya:

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

Sebut dengan:

someElem = nl2br(someElem);
JochenJung
sumber
1
CATATAN UNTUK PEMBACA: Jawaban ini sangat berguna jika Anda berencana mengembangkan pengaya Firefox. innerHTML atau (.html () jika menggunakan jQuery) disukai oleh W3C dan Mozilla, dan kode di atas sangat membantu dalam membersihkan proses review. Untuk info selengkapnya, lihat Pertimbangan keamanan @ developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML
Delicia Brummitt
1

Coba ini:

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

Menggunakan properti ruang putih CSS mungkin merupakan solusi terbaik. Gunakan Firebug atau Alat Pengembang Chrome untuk mengidentifikasi sumber padding ekstra yang Anda lihat.

Andrew B.
sumber