jQuery text () và dòng mới


114

Tôi muốn có thể nói

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

và nó hiển thị với các dòng mới trong trình duyệt. Cách giải quyết duy nhất mà tôi đã tìm thấy là đặt thuộc tính css 'white-space' thành 'pre' trên someElem. Điều này gần như hoạt động, nhưng sau đó tôi có một khoảng đệm lớn gây khó chịu giữa văn bản và phần trên cùng của someElem, ngay cả khi tôi đặt đệm thành 0. Có cách nào để loại bỏ điều này không?


2
gói nó bằng <pre>các thẻ (và sử dụng .html () thay vì .text ()) là giải pháp dễ nhất và tốt nhất để duy trì ngắt dòng từ tệp văn bản hoặc từ văn bản thuần túy theo ý kiến ​​của tôi (theo ý kiến ​​của tôi đây là câu trả lời của Karim dưới đây). TUY NHIÊN: Các thay thế mới này là để sử dụng white-space: pre-wrap;như đề xuất trong cleong của câu trả lời
edwardtyl

1
tại sao không sử dụng append()thay vì test()<br/>thay vì \n? như thế này -$(someElem).append("this <br/> has <br/> newlines");
Erfan Ahmed

Câu trả lời:


132

Đó là năm 2015. Câu trả lời chính xác cho câu hỏi này vào thời điểm này là sử dụng CSS white-space: pre-linehoặc white-space: pre-wrap. Sạch sẽ và thanh lịch. Phiên bản thấp nhất của IE hỗ trợ cặp này là 8.

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

PS Cho đến khi CSS3 trở nên phổ biến, bạn có thể cần phải cắt bỏ các khoảng trắng đầu và / hoặc cuối theo cách thủ công.


3
Đây nên là câu trả lời.
Axel,

3
Đây là câu trả lời. Nên cao hơn. Chào mừng bạn đến 2016.
neoRiley

3
Tìm thấy điều này vào năm 2017: Vẫn có liên quan và vẫn là câu trả lời cho câu hỏi.
Troy Harris

6
Có một lỗi trong bài đăng này. Năm là 2017, không phải 2015. Mọi thứ khác đều có vẻ chính xác.
JDB vẫn nhớ Monica

1
new Date("2016");
Brandito

60

Nếu bạn lưu trữ đối tượng jQuery trong một biến, bạn có thể thực hiện việc này:

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>

Nếu muốn, bạn cũng có thể tạo một hàm để thực hiện việc này bằng một lệnh gọi đơn giản, giống như jQuery.text () làm:

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


Thiếu dấu ngoặc đơn ở dòng thứ hai của đoạn mã đầu tiên.
Mahmoud Fayez

1
điều này thực sự trả lời câu hỏi OP
Tommy,

Tốt nhất, đã làm việc như một sự quyến rũ và giải quyết vấn đề.
ZEESHAN ARSHAD

37

Đây là những gì tôi sử dụng:

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
Trên thực tế, nó tốt hơn đề xuất của Mark vì nó không có nguy cơ bị tấn công XSS.
Andrew B.

Tôi nghĩ bạn có thể tạo div (ví dụ: document.createElement ('div')) ngoài hàm và chỉ sử dụng nó cho tất cả các cuộc gọi đúng không?
Fabio Zadrozny

@FabioZadrozny: Vâng, bạn nói đúng! Tôi đã chỉnh sửa câu trả lời (gần như) cho phù hợp. Div được tạo bên trong hàm nhưng bên ngoài vòng lặp bây giờ. Nó có thể hoàn toàn nằm ngoài chức năng, nhưng sau đó nó sẽ trở nên cồng kềnh khi sử dụng.
Peter V. Mørch

1
Tôi tin rằng câu trả lời @ cleong là giải pháp tốt nhất cho điều này
minillinim

Nếu bạn có các ký tự dòng mới rõ ràng trong văn bản của mình, thì bạn có thể muốn tách bằng cách sử dụng text.split(/\\n/)hoặc thậm chí text.split(/\\\\n|\\n|\n/). Tôi gặp sự cố này khi chuyển văn bản ở định dạng JSON bằng một API nhúng các ký tự \nđiều khiển theo nghĩa đen trong chuỗi.
D. Visser

20

Ngoài ra, hãy thử sử dụng .htmlvà sau đó bọc bằng <pre>các thẻ:

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

13

Bạn có thể sử dụng htmlthay thế textvà thay thế mỗi lần xuất hiện của \nvới <br>. Tuy nhiên, bạn sẽ phải thoát chính xác văn bản của mình.

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

@Matthew Flaschen: Cảm ơn, đã sửa.
Mark Byers

7
Một số người đọc câu trả lời này có thể không biết điều này nguy hiểm như thế nào. Không bao giờ sử dụng giải pháp này với văn bản do người dùng cung cấp. Giải pháp của Peter Mørch là thích hợp hơn.
Andrew B.

1
@kulebyashik sử dụng giải pháp của Peter texttrong khi câu trả lời này sử dụng htmltrực tiếp.
John Xiao

1

Tôi khuyên bạn nên làm việc someElemtrực tiếp với phần tử, vì các thay thế bằng .html()cũng sẽ thay thế các thẻ HTML khác trong chuỗi.

Đây là chức năng của tôi:

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

Gọi nó bằng:

someElem = nl2br(someElem);

1
LƯU Ý CHO NGƯỜI ĐỌC: Câu trả lời này đặc biệt hữu ích nếu bạn dự định phát triển tiện ích Firefox. innerHTML hoặc (.html () nếu sử dụng jQuery) được W3C và Mozilla không thích, và đoạn mã trên rất hữu ích trong việc xóa quy trình xem xét. Để biết thêm thông tin, hãy xem
Cân

1

Thử cái này:

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

0

Sử dụng thuộc tính khoảng trắng CSS có lẽ là giải pháp tốt nhất. Sử dụng Firebug hoặc Công cụ dành cho nhà phát triển Chrome để xác định nguồn gốc của phần đệm bổ sung mà bạn đang thấy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.