jQuery text () และขึ้นบรรทัดใหม่


114

อยากได้ทักมา

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

และแสดงผลด้วยบรรทัดใหม่ในเบราว์เซอร์ วิธีแก้ปัญหาเดียวที่ฉันพบคือการตั้งค่าคุณสมบัติ css 'white-space' เป็น 'pre' บน someElem เกือบจะได้ผล แต่ฉันก็มีช่องว่างระหว่างข้อความกับด้านบนของ someElem ขนาดใหญ่จนน่ารำคาญแม้ว่าฉันจะตั้งค่าช่องว่างภายในเป็น 0 มีวิธีกำจัดสิ่งนี้หรือไม่?


2
การห่อด้วย<pre>แท็ก (และใช้. html () แทน. text () เป็นวิธีที่ง่ายและดีที่สุดในการรักษาการแบ่งบรรทัดจากไฟล์ข้อความหรือจากข้อความธรรมดาในความคิดของฉัน (นี่คือคำตอบของ Karim ที่แนะนำด้านล่าง) อย่างไรก็ตาม: ทางเลือกใหม่กว่านี้คือการใช้white-space: pre-wrap;ตามที่แนะนำในคำตอบของ
cleong

1
ทำไมไม่ใช้append()แทนtest()และ<br/>แทน\n? แบบนี้ -$(someElem).append("this <br/> has <br/> newlines");
Erfan Ahmed

คำตอบ:


132

เป็นปี 2015 คำตอบที่ถูกต้องสำหรับคำถามนี้ ณ จุดนี้คือการใช้ CSS white-space: pre-lineหรือwhite-space: pre-wrap. สะอาดและสง่างาม IE เวอร์ชันต่ำสุดที่รองรับทั้งคู่คือ 8

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

PS จนกว่า CSS3 จะกลายเป็นเรื่องปกติคุณอาจต้องตัดค่าเริ่มต้นและ / หรือการเว้นวรรคสีขาวต่อท้ายด้วยตนเอง


3
นี่น่าจะเป็นคำตอบ
Axel

3
นี่คือคำตอบ ควรจะสูง. ยินดีต้อนรับสู่ปี 2559
neoRiley

3
พบสิ่งนี้ในปี 2560: ยังคงมีความเกี่ยวข้องและยังคงเป็นคำตอบสำหรับคำถาม
Troy Harris

6
มีข้อผิดพลาดในโพสต์นี้ ปีนี้คือ 2017 ไม่ใช่ 2015 ทุกอย่างดูแม่นยำ
JDB ยังคงจำโมนิกา

1
new Date("2016");
Brandito

60

หากคุณเก็บออบเจ็กต์ jQuery ไว้ในตัวแปรคุณสามารถทำได้:

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>

หากคุณต้องการคุณยังสามารถสร้างฟังก์ชั่นเพื่อทำสิ่งนี้ด้วยการโทรธรรมดาเช่นเดียวกับที่ 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>


ไม่มีวงเล็บปิดในบรรทัดที่สองของข้อมูลโค้ดแรก
Mahmoud Fayez

1
สิ่งนี้ตอบคำถาม OPs ได้จริง
Tommy

ดีที่สุดทำงานอย่างมีเสน่ห์และแก้ไขปัญหาได้
ZEESHAN ARSHAD

37

นี่คือสิ่งที่ฉันใช้:

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
ในความเป็นจริงมันเหนือกว่าคำแนะนำของ Mark เพราะมันไม่เสี่ยงต่อการโจมตี XSS
Andrew B.

ฉันคิดว่าคุณสามารถสร้าง div (เช่น document.createElement ('div')) จากฟังก์ชันและใช้สำหรับการโทรทั้งหมดได้ใช่ไหม
Fabio Zadrozny

@FabioZadrozny: ใช่คุณพูดถูก! ฉันได้แก้ไขคำตอบ (เกือบ) ตามนั้น div ถูกสร้างขึ้นภายในฟังก์ชัน แต่จะอยู่นอกลูปในขณะนี้ อาจอยู่นอกฟังก์ชั่นทั้งหมด แต่ก็ใช้งานได้ยาก
Peter V.Mørch

1
ฉันเชื่อว่าคำตอบของ @ cleong เป็นทางออกที่ดีที่สุดสำหรับสิ่งนี้
minillinim

หากคุณมีอักขระขึ้นบรรทัดใหม่อย่างชัดเจนในข้อความของคุณคุณอาจต้องการแยกโดยใช้text.split(/\\n/)หรือแม้กระทั่งtext.split(/\\\\n|\\n|\n/)หรือแม้กระทั่งฉันพบสิ่งนี้ขณะส่งข้อความในรูปแบบ JSON ด้วย API ซึ่งฝัง\nอักขระควบคุมตามตัวอักษรไว้ในสตริง
D.Visser

20

อีกทางเลือกหนึ่งให้ลองใช้.htmlแล้วห่อด้วย<pre>แท็ก:

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

13

คุณสามารถใช้ htmlแทนtextและแทนที่แต่ละเกิดกับ\n <br>คุณจะต้องหลีกเลี่ยงข้อความของคุณให้ถูกต้อง

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

@Matthew Flaschen: ขอบคุณแก้ไขแล้ว
Mark Byers

7
บางคนที่อ่านคำตอบนี้อาจจะไม่รู้ว่าสิ่งนี้อันตรายแค่ไหน อย่าใช้โซลูชันนี้กับข้อความที่ผู้ใช้จัดหา วิธีแก้ปัญหาของ Peter Mørchนั้นดีกว่า
Andrew B.

1
วิธีแก้ปัญหาของ @kulebyashik Peter ใช้textในขณะที่คำตอบนี้ใช้htmlโดยตรง
John Xiao

1

ฉันขอแนะนำให้ทำงานกับsomeElemองค์ประกอบโดยตรงเนื่องจากการแทนที่ด้วย.html()จะแทนที่แท็ก HTML อื่น ๆ ภายในสตริงด้วย

นี่คือหน้าที่ของฉัน:

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

เรียกโดย:

someElem = nl2br(someElem);

1
หมายเหตุถึงผู้อ่าน: คำตอบนี้มีประโยชน์อย่างยิ่งหากคุณวางแผนที่จะพัฒนาโปรแกรมเสริม Firefox innerHTML หรือ (.html () หากใช้ jQuery) ถูก W3C และ Mozilla ขมวดคิ้วและโค้ดด้านบนมีประโยชน์มากในการล้างกระบวนการตรวจสอบ สำหรับข้อมูลเพิ่มเติมโปรดดูข้อพิจารณาด้านความปลอดภัย @ developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML
Delicia Brummitt


0

การใช้คุณสมบัติ CSS white-space น่าจะเป็นทางออกที่ดีที่สุด ใช้ Firebug หรือเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome เพื่อระบุแหล่งที่มาของการขยายเพิ่มเติมที่คุณเห็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.