jQuery metni () ve satırsonları


114

Söyleyebilmek istiyorum

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

ve tarayıcıda yeni satırlarla işlenir. Bulduğum tek çözüm, bazıElem'de 'beyaz boşluk' css özelliğini 'pre' olarak ayarlamaktır. Bu neredeyse işe yarıyor, ancak dolguyu 0'a ayarlasam bile, metin ile bazı Elemlerin üstü arasında can sıkıcı derecede büyük bir dolgu var. Bundan kurtulmanın bir yolu var mı?


2
bunu <pre>etiketlerle sarmak (ve .text () yerine .html () kullanmak) bence bir metin dosyasından veya düz metinden satır sonlarını korumak için en kolay ve en iyi çözümdür (bu, Karim'in aşağıdaki cevabı tarafından önerilmektedir). ANCAK: Buna daha yeni bir alternatif white-space: pre-wrap;, cleong'un cevabında önerildiği gibi kullanmaktır
edwardtyl

1
neden append()yerine test()ve <br/>yerine kullanılmasın \n? böyle -$(someElem).append("this <br/> has <br/> newlines");
Erfan Ahmed

Yanıtlar:


132

2015 yılı. Bu noktada bu sorunun doğru cevabı CSS white-space: pre-lineveya white-space: pre-wrap. Temiz ve zarif. Çifti destekleyen en düşük IE sürümü 8'dir.

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

Not: CSS3 yaygınlaşana kadar, muhtemelen ilk ve / veya sondaki beyaz boşlukları manuel olarak kesmeniz gerekecektir.


3
Cevap bu olmalı.
Axel

3
İşte cevap. Daha yüksek olmalı. 2016'ya hoş geldiniz.
neoRiley

3
Bunu 2017'de buldum: Hala alakalı ve hala sorunun cevabı.
Troy Harris

6
Bu yazıda bir hata var. Yıl 2015 değil, 2017'dir. Diğer her şey doğru görünüyor.
JDB,

1
new Date("2016");
Brandito

60

JQuery nesnesini bir değişkende depolarsanız, bunu yapabilirsiniz:

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>

Tercih ederseniz, jQuery.text () 'in yaptığı gibi, bunu basit bir çağrı ile yapacak bir işlev de oluşturabilirsiniz:

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


İlk kod parçacığının ikinci satırında eksik bir yakın parantez var.
Mahmud Fayez

1
bu aslında OP'lerin sorusuna cevap veriyor
Tommy

En iyisi, harika çalıştı ve sorunu çözdü.
ZEESHAN ARSHAD

37

İşte kullandığım şey:

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
Aslında, Mark'ın önerisinden daha üstündür çünkü XSS saldırısı riski taşımaz.
Andrew B.

Sanırım fonksiyondan div (yani: document.createElement ('div')) oluşturabilir ve sadece tüm çağrılar için kullanabilirsiniz, değil mi?
Fabio Zadrozny

@FabioZadrozny: Evet, haklısın! Cevabı (neredeyse) buna göre düzenledim. Div, işlevin içinde ancak şimdi döngünün dışında oluşturulur. Tamamen işlevin dışında olabilir, ancak daha sonra kullanımı zahmetli hale gelir.
Peter V.Mørch

1
@ Cleong'un cevabının bunun için en iyi çözüm olduğuna inanıyorum
minillinim

Metninizde açık satırsonu karakterleri varsa, o zaman text.split(/\\n/)veya hatta kullanarak bölmek isteyebilirsiniz text.split(/\\\\n|\\n|\n/). Dizelere değişmez \nkontrol karakterleri katıştıran bir API ile JSON formatında metin dolaşırken bununla karşılaştım .
D. Visser

20

Alternatif olarak, kullanmayı deneyin .htmlve sonra sarın ile <pre>etiketleri:

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

13

Her bir oluşumunu ile htmlyerine kullanabilir textve değiştirebilirsiniz . Yine de metninizden doğru bir şekilde kaçmanız gerekecek.\n<br>

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

@Matthew Flaschen: Teşekkürler, düzeltildi.
Mark Byers

7
Bu cevabı okuyan bazı insanlar bunun ne kadar tehlikeli olduğunu muhtemelen bilmeyeceklerdir. Bu çözümü asla kullanıcı tarafından sağlanan metinle kullanmayın. Peter Mørch'un çözümü tercih edilir.
Andrew B.

1
@kulebyashik Peter'ın çözümü text, bu cevap htmldoğrudan kullanılırken kullanılır .
John Xiao

1

someElemYerine doğrudan elemanla çalışmayı öneririm..html() değiştirmeler dize içindeki diğer HTML etiketlerinin yerini alacağından .

İşte benim fonksiyonum:

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

Şununla arayın:

someElem = nl2br(someElem);

1
OKUYUCU İÇİN NOT: Bu cevap özellikle bir Firefox eklentisi geliştirmeyi planlıyorsanız yararlıdır. innerHTML veya (jQuery kullanılıyorsa .html ()), W3C ve Mozilla tarafından hoş karşılanmaz ve yukarıdaki kod, inceleme sürecini temizlemede çok yardımcı olur. Daha fazla bilgi için Güvenlik konuları @ developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML
Delicia Brummitt

1

Bunu dene:

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

0

CSS beyaz boşluk özelliğini kullanmak muhtemelen en iyi çözümdür. Gördüğünüz fazladan dolgunun kaynağını belirlemek için Firebug veya Chrome Geliştirici Araçlarını kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.