Tạo các chuỗi nhiều dòng trong JavaScript


2611

Tôi có đoạn mã sau trong Ruby. Tôi muốn chuyển đổi mã này thành JavaScript. Mã tương đương trong JS là gì?

text = <<"HERE"
This
Is
A
Multiline
String
HERE


Kiểm tra điều này trên các cách khác nhau để đạt được như nhau. Tôi đã thêm hiệu suất của từng phương thức quá stackoverflow.com/a/23867090/848841
Vignesh Subramanian

Câu trả lời:


3318

Cập nhật:

ECMAScript 6 (ES6) giới thiệu một loại chữ mới, cụ thể là chữ mẫu . Chúng có nhiều tính năng, nội suy biến đổi giữa các loại khác, nhưng quan trọng nhất đối với câu hỏi này, chúng có thể là đa dòng.

Một mẫu chữ được phân định bởi backticks :

var html = `
  <div>
    <span>Some HTML here</span>
  </div>
`;

(Lưu ý: Tôi không ủng hộ việc sử dụng HTML trong chuỗi)

Hỗ trợ trình duyệt là OK , nhưng bạn có thể sử dụng các bộ chuyển đổi để tương thích hơn.


Câu trả lời ES5 gốc:

Javascript không có cú pháp tài liệu ở đây. Bạn có thể thoát khỏi dòng mới theo nghĩa đen, tuy nhiên, nó đến gần:

"foo \
bar"

231
Được cảnh báo: một số trình duyệt sẽ chèn dòng mới khi tiếp tục, một số trình duyệt thì không.
staticsan

35
Visual Studio 2010 dường như cũng bị nhầm lẫn bởi cú pháp này.
jcollum

47
@Nate Nó được chỉ định trong ECMA-262 Phiên bản thứ 5 7.8.4 và được gọi là LineContininating : "Một ký tự kết thúc dòng không thể xuất hiện trong một chuỗi ký tự, ngoại trừ một phần của LineContininating để tạo ra chuỗi ký tự trống. Cách chính xác để gây ra một chuỗi ký tự trống. ký tự kết thúc dòng là một phần của giá trị Chuỗi của một chuỗi ký tự là sử dụng một chuỗi thoát như \ n hoặc \ u000A. "
một số

16
Tôi không thấy lý do tại sao bạn làm điều này khi trình duyệt xử lý nó không nhất quán. "line1 \ n" + "line2" trên nhiều dòng có thể đọc được và bạn được đảm bảo hành vi nhất quán.
SamStephens

11
"Hỗ trợ trình duyệt vẫn ổn" ... không được IE11 hỗ trợ - không ổn
Tom Andraszek

1317

Cập nhật ES6:

Như câu trả lời đầu tiên đề cập, với ES6 / Babel, giờ đây bạn có thể tạo các chuỗi nhiều dòng chỉ bằng cách sử dụng backticks:

const htmlString = `Say hello to 
multi-line
strings!`;

Biến nội suy là một tính năng mới phổ biến đi kèm với các chuỗi phân cách back-tick:

const htmlString = `${user.name} liked your post about strings`;

Điều này chỉ chuyển xuống để ghép nối:

user.name + ' liked your post about strings'

Câu trả lời ES5 gốc:

Hướng dẫn về kiểu JavaScript của Google khuyên bạn nên sử dụng nối chuỗi thay vì thoát các dòng mới:

Đừng làm điều này:

var myString = 'A rather long string of English text, an error message \
                actually that just keeps going and going -- an error \
                message to make the Energizer bunny blush (right through \
                those Schwarzenegger shades)! Where was I? Oh yes, \
                you\'ve got an error and all the extraneous whitespace is \
                just gravy.  Have a nice day.';

Khoảng trắng ở đầu mỗi dòng không thể bị xóa một cách an toàn tại thời gian biên dịch; khoảng trắng sau dấu gạch chéo sẽ dẫn đến các lỗi khó khăn; và trong khi hầu hết các công cụ tập lệnh hỗ trợ điều này, nó không phải là một phần của ECMAScript.

Sử dụng nối chuỗi thay thế:

var myString = 'A rather long string of English text, an error message ' +
               'actually that just keeps going and going -- an error ' +
               'message to make the Energizer bunny blush (right through ' +
               'those Schwarzenegger shades)! Where was I? Oh yes, ' +
               'you\'ve got an error and all the extraneous whitespace is ' +
               'just gravy.  Have a nice day.';

19
Tôi không hiểu khuyến nghị của Google. Tất cả các trình duyệt ngoại trừ những trình duyệt cực kỳ cũ đều hỗ trợ dấu gạch chéo ngược theo cách tiếp cận dòng mới và sẽ tiếp tục làm như vậy trong tương lai để tương thích ngược. Lần duy nhất bạn cần tránh là nếu bạn cần chắc chắn rằng một và chỉ một dòng mới (hoặc không có dòng mới) đã được thêm vào cuối mỗi dòng (xem thêm nhận xét của tôi về câu trả lời được chấp nhận).
Matt Browne

6
Lưu ý rằng các chuỗi mẫu không được hỗ trợ trong IE11, Firefox 31, Chrome 35 hoặc Safari 7. Xem kangax.github.io/compat-table/es6
EricP

29
@MattBrowne Đề xuất của Google đã được họ ghi lại, theo mức độ quan trọng của các lý do: (1) Khoảng trắng ở đầu mỗi dòng [trong ví dụ, bạn không muốn khoảng trắng đó trong chuỗi của mình nhưng mã này trông đẹp hơn trong mã ] (2) khoảng trắng sau dấu gạch chéo sẽ dẫn đến các lỗi khó khăn [nếu bạn kết thúc một dòng \ thay vì `\` thật khó để ý] và (3) trong khi hầu hết các công cụ tập lệnh hỗ trợ điều này, thì đó không phải là một phần của ECMAScript [tức là tại sao sử dụng các tính năng không chuẩn?] Hãy nhớ đó là hướng dẫn về phong cách, đó là về cách làm cho mã dễ đọc + duy trì + gỡ lỗi: không chỉ "nó hoạt động" chính xác.
ShreevatsaR

1
thật đáng ngạc nhiên rằng sau tất cả những năm này, nối chuỗi vẫn là cách tốt nhất / an toàn nhất / phù hợp nhất để đi với điều này. mẫu chữ (câu trả lời ở trên) không hoạt động trong IE và thoát các dòng chỉ là một mớ hỗn độn mà bạn sẽ sớm hối hận
Tiago Duarte

1
Phát hiện ra một cách khó khăn là các phiên bản Android cũ hơn không hỗ trợ backticks vì vậy nếu bạn có ứng dụng Android sử dụng webView thì backticks của bạn khiến ứng dụng của bạn không chạy!
Michael Fever

684

mô hình text = <<"HERE" This Is A Multiline String HERE không có sẵn trong js (tôi nhớ sử dụng nó nhiều trong những ngày Perl cũ tốt của tôi).

Để giám sát các chuỗi đa dòng phức tạp hoặc dài, đôi khi tôi sử dụng một mẫu mảng:

var myString = 
   ['<div id="someId">',
    'some content<br />',
    '<a href="#someRef">someRefTxt</a>',
    '</div>'
   ].join('\n');

hoặc mẫu ẩn danh đã được hiển thị (thoát dòng mới), có thể là một khối xấu xí trong mã của bạn:

    var myString = 
       '<div id="someId"> \
some content<br /> \
<a href="#someRef">someRefTxt</a> \
</div>';

Đây là một 'mẹo' kỳ lạ nhưng hoạt động 1 :

var myString = (function () {/*
   <div id="someId">
     some content<br />
     <a href="#someRef">someRefTxt</a>
    </div>        
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

chỉnh sửa bên ngoài: jsfiddle

ES20xx hỗ trợ kéo dài chuỗi trên nhiều dòng bằng chuỗi mẫu :

let str = `This is a text
    with multiple lines.
    Escapes are interpreted,
    \n is a newline.`;
let str = String.raw`This is a text
    with multiple lines.
    Escapes are not interpreted,
    \n is not a newline.`;

1 Lưu ý: điều này sẽ bị mất sau khi thu nhỏ / làm xáo trộn mã của bạn


34
Vui lòng không sử dụng mô hình mảng. Nó sẽ chậm hơn so với nối chuỗi cũ đơn giản trong hầu hết các trường hợp.
BMiner

73
Mẫu mảng dễ đọc hơn và mất hiệu năng cho một ứng dụng thường không đáng kể. Như thử nghiệm hoàn hảo đó cho thấy, thậm chí IE7 có thể thực hiện hàng chục nghìn thao tác mỗi giây.
Benjamin Atkin

19
+1 cho một giải pháp thay thế thanh lịch không chỉ hoạt động theo cùng một cách trong tất cả các trình duyệt mà còn là bằng chứng trong tương lai.
Pavel

26
@KooiInc Các bài kiểm tra của bạn bắt đầu với mảng đã được tạo, làm lệch kết quả. Nếu bạn thêm phần khởi tạo của mảng, thì phép nối thẳng sẽ nhanh hơn jsperf.com/opes-concat-without-sringbuilder/7 Xem stackoverflow.com/questions/51185/iêu Như một mẹo cho dòng mới, nó có thể ổn, nhưng chắc chắn là nó ổn làm nhiều việc hơn mức cần thiết
Juan Mendes

9
@BMiner: 1) "Tối ưu hóa sớm là gốc rễ của mọi tội lỗi" - Donald Knuth, và 2) "khả năng đọc" nằm trong mắt của kẻ si tình
Paul Bennett

348

Bạn có thể có các chuỗi nhiều dòng trong JavaScript thuần.

Phương pháp này dựa trên việc tuần tự hóa các chức năng, được xác định là phụ thuộc vào việc thực hiện . Nó hoạt động trong hầu hết các trình duyệt (xem bên dưới), nhưng không có gì đảm bảo rằng nó sẽ vẫn hoạt động trong tương lai, vì vậy đừng dựa vào nó.

Sử dụng chức năng sau:

function hereDoc(f) {
  return f.toString().
      replace(/^[^\/]+\/\*!?/, '').
      replace(/\*\/[^\/]+$/, '');
}

Bạn có thể có tài liệu ở đây:

var tennysonQuote = hereDoc(function() {/*!
  Theirs not to make reply,
  Theirs not to reason why,
  Theirs but to do and die
*/});

Phương pháp đã được thử nghiệm thành công trong các trình duyệt sau (không được đề cập = không được kiểm tra):

  • IE 4 - 10
  • Opera 9,50 - 12 (không phải trong 9-)
  • Safari 4 - 6 (không phải trong 3-)
  • Chrome 1 - 45
  • Firefox 17 - 21 ( không phải trong 16- )
  • Rekonq 0.7.0 - 0.8.0
  • Không được hỗ trợ trong Konqueror 4.7.4

Hãy cẩn thận với công cụ khai thác của bạn, mặc dù. Nó có xu hướng loại bỏ ý kiến. Đối với máy nén YUI , một nhận xét bắt đầu bằng/*! (như cái tôi đã sử dụng) sẽ được giữ nguyên.

Tôi nghĩ rằng một giải pháp thực sự sẽ là sử dụng CoffeeScript .

CẬP NHẬT ES6: Bạn có thể sử dụng backtick thay vì tạo một chức năng với một bình luận và chạy toString trên bình luận. Các regex sẽ cần phải được cập nhật để chỉ dải không gian. Bạn cũng có thể có một phương thức nguyên mẫu chuỗi để làm điều này:

let foo = `
  bar loves cake
  baz loves beer
  beer loves people
`.removeIndentation()

Điều đó sẽ rất tuyệt. Ai đó nên viết phương thức chuỗi .removeInentation này ...;)


232
Gì!? tạo và dịch ngược một Hàm để hack một bình luận đa dòng thành một chuỗi nhiều dòng? Bây giờ thì xấu xí.
fforw

4
jsfiddle.net/fqpwf hoạt động trong Chrome 13 và IE8 / 9, nhưng không phải FF6. Tôi ghét phải nói nó, nhưng tôi thích nó, và nếu nó có thể là một tính năng có chủ ý của mỗi trình duyệt (để nó không biến mất), tôi sẽ sử dụng nó.
Jason Kleban

2
@ uosɐſ: để nó có chủ ý, nó phải nằm trong thông số kỹ thuật; hoặc được sử dụng rộng rãi đến mức các nhà sản xuất trình duyệt sẽ không muốn xóa tính năng "tình cờ" này. Cảm ơn các thí nghiệm mặc dù ... Hãy thử một số coffeescript.
Jordão

1
chuỗi con a.toString (). .)
Lodewijk

2
Vô cùng tiện dụng. Tôi đang sử dụng nó cho các thử nghiệm đơn vị (Jasmine), nhưng tránh nó cho mã sản xuất.
Jason

207

Bạn có thể làm được việc này...

var string = 'This is\n' +
'a multiline\n' + 
'string';

Ví dụ đầu tiên là tuyệt vời và đơn giản. Tốt hơn nhiều so với cách tiếp cận \ vì tôi không chắc cách trình duyệt sẽ xử lý dấu gạch chéo ngược như một ký tự thoát và như một ký tự nhiều dòng.
Matt K


e4x.js sẽ là giải pháp tốt trong tương lai
Paul Sweatte

139

Tôi đã đưa ra phương pháp gian lận rất linh hoạt của một chuỗi nhiều hàng. Vì chuyển đổi một hàm thành một chuỗi cũng trả về bất kỳ nhận xét nào bên trong hàm, bạn có thể sử dụng các nhận xét làm chuỗi của mình bằng cách sử dụng một nhận xét đa biến / ** /. Bạn chỉ cần cắt bỏ các kết thúc và bạn có chuỗi của bạn.

var myString = function(){/*
    This is some
    awesome multi-lined
    string using a comment 
    inside a function 
    returned as a string.
    Enjoy the jimmy rigged code.
*/}.toString().slice(14,-3)

alert(myString)

37
Điều này là hoàn toàn đáng sợ. Tôi thích nó (mặc dù bạn có thể cần thực hiện một trận đấu regex vì tôi không chắc khoảng trắng chính xác đến mức nào toString().
Kevin Cox

Giải pháp này dường như không hoạt động trong firefox, có lẽ đó là một tính năng bảo mật cho trình duyệt? EDIT: Nevermind, nó chỉ không hoạt động cho Firefox Phiên bản 16.
Kỹ sư phần mềm Bill

45
Ngoài ra, hãy cẩn thận với các công cụ khai thác lấy ý kiến ​​...: D
jondavidjohn

3
Đây là lý do tại sao chúng ta không thể có những điều tốt đẹp.
Danilo M. Oliveira

4
Bạn có thể làm một số thứ kỳ lạ trong vùng đất javascript. Mặc dù trong tất cả sự trung thực, bạn không bao giờ nên sử dụng điều này.
Lu-ca

88

Tôi ngạc nhiên tôi đã không thấy điều này, bởi vì nó hoạt động ở mọi nơi tôi đã thử nghiệm và rất hữu ích cho các ví dụ:

<script type="bogus" id="multi">
    My
    multiline
    string
</script>
<script>
    alert($('#multi').html());
</script>

Có ai biết về một môi trường có HTML nhưng nó không hoạt động không?


23
Bất cứ nơi nào bạn không muốn đặt các chuỗi của mình vào các thành phần tập lệnh riêng biệt và xa.
Lodewijk

9
Một phản đối hợp lệ! Nó không hoàn hảo. Nhưng đối với các mẫu, sự tách biệt đó không chỉ ok, mà thậm chí có thể được khuyến khích.
Peter V. Mørch

1
Tôi thích chia mọi thứ trên 80/120 ký tự thành nhiều dòng, tôi sợ đó không chỉ là các mẫu. Bây giờ tôi thích cú pháp 'line1' + 'line2'. Đây cũng là cách nhanh nhất (mặc dù điều này có thể cạnh tranh với các văn bản thực sự lớn). Đó là một mẹo hay mặc dù.
Lodewijk

27
thực ra, đây không phải là HTML chứ không phải Javascript: - /
CpILL

5
tuy nhiên, nhiệm vụ để có được một chuỗi nhiều dòng trong javascript có thể được thực hiện theo cách này
Davi Fiamenghi

52

Tôi đã giải quyết điều này bằng cách xuất ra một div, làm cho nó bị ẩn và gọi id div bằng jQuery khi tôi cần.

ví dụ

<div id="UniqueID" style="display:none;">
     Strings
     On
     Multiple
     Lines
     Here
</div>

Sau đó, khi tôi cần lấy chuỗi, tôi chỉ cần sử dụng jQuery sau đây:

$('#UniqueID').html();

Trả về văn bản của tôi trên nhiều dòng. Nếu tôi gọi

alert($('#UniqueID').html());

Tôi có:

nhập mô tả hình ảnh ở đây


2
Cám ơn vì cái này! Đó là câu trả lời duy nhất tôi thấy rằng giải quyết vấn đề của mình, bao gồm các chuỗi không xác định có thể chứa bất kỳ sự kết hợp nào của dấu ngoặc đơn và dấu ngoặc kép được chèn trực tiếp vào mã mà không có cơ hội mã hóa trước. (nó đến từ một ngôn ngữ tạo khuôn mẫu tạo ra JS - vẫn từ một nguồn đáng tin cậy và không phải là một biểu mẫu, vì vậy nó không bị HOÀN TOÀN mất trí nhớ).
octern

Đây là phương pháp duy nhất thực sự hiệu quả với tôi để tạo biến chuỗi chuỗi javascript nhiều dòng từ Chuỗi Java.
người mới bắt đầu_

4
Nếu chuỗi là HTML thì sao?
Dan Dascalescu

4
$ ('# UniqueID'). Nội dung ()
mplungjan

1
@Pacerier Tất cả mọi thứ tôi đã đọc, từ Google cũng như các trang web khác, nói rằng ngày nay Google có chỉ mục display:nonenội dung, rất có thể là do sự phổ biến của các giao diện người dùng theo kiểu JavaScript. (Ví dụ: trang FAQ có chức năng ẩn / hiển thị.) Tuy nhiên, bạn cần cẩn thận, bởi vì Google cho biết họ có thể trừng phạt bạn nếu nội dung ẩn dường như được thiết kế để làm tăng thứ hạng SEO của bạn một cách giả tạo.
Gavin

31

Có nhiều cách để đạt được điều này

1. Chém chém

  var MultiLine=  '1\
    2\
    3\
    4\
    5\
    6\
    7\
    8\
    9';

2. nối thường xuyên

var MultiLine = '1'
+'2'
+'3'
+'4'
+'5';

3. Mảng tham gia nối

var MultiLine = [
'1',
'2',
'3',
'4',
'5'
].join('');

Hiệu suất khôn ngoan, Slash concatenation (cái đầu tiên) là nhanh nhất.

Tham khảo trường hợp thử nghiệm này để biết thêm chi tiết về hiệu suất

Cập nhật:

Với ES2015 , chúng ta có thể tận dụng tính năng chuỗi Mẫu của nó. Với nó, chúng ta chỉ cần sử dụng back-tick để tạo chuỗi nhiều dòng

Thí dụ:

 `<h1>{{title}}</h1>
  <h2>{{hero.name}} details!</h2>
  <div><label>id: </label>{{hero.id}}</div>
  <div><label>name: </label>{{hero.name}}</div>
  `

11
Tôi nghĩ rằng bạn đã lấy lại những gì đã có trên trang trong năm năm, nhưng theo một cách sạch hơn.
RandomInsano

sẽ không cắt giảm kết hợp cũng bao gồm khoảng trắng ở đầu dòng?
f.khantsis

29

Sử dụng thẻ script:

  • thêm một <script>...</script>khối chứa văn bản nhiều dòng của bạn vào headthẻ;
  • nhận được văn bản đa dòng của bạn như ... (coi chừng mã hóa văn bản: UTF-8, ASCII)

    <script>
    
        // pure javascript
        var text = document.getElementById("mySoapMessage").innerHTML ;
    
        // using JQuery's document ready for safety
        $(document).ready(function() {
    
            var text = $("#mySoapMessage").html(); 
    
        });
    
    </script>
    
    <script id="mySoapMessage" type="text/plain">
    
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="...">
           <soapenv:Header/>
           <soapenv:Body>
              <typ:getConvocadosElement>
                 ...
              </typ:getConvocadosElement>
           </soapenv:Body>
        </soapenv:Envelope>
    
        <!-- this comment will be present on your string -->
        //uh-oh, javascript comments...  SOAP request will fail 
    
    
    </script>

Tôi nghĩ rằng chiến lược này là sạch sẽ và không được sử dụng nhiều. jsrender sử dụng điều này.
xdhmoore

Tôi đang sử dụng điều này với InternalText iso InternalHTML, nhưng làm cách nào để đảm bảo rằng các khoảng trắng được giữ nguyên?
David Nouls 16/07/2015

Ngoài ra các truy vấn ajax trong trường hợp bạn đang sử dụng chúng. Bạn có thể cố gắng thay đổi tiêu đề của mình. xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");Tôi không nhớ có vấn đề nào khác ngoài việc nhận xét sai trong JS. Không gian nơi không có vấn đề.
jpfreire

24

Tôi thích cú pháp và sự bổ sung này:

string = 'my long string...\n'
       + 'continue here\n'
       + 'and here.';

(nhưng thực tế không thể được coi là chuỗi đa dòng)


3
Tôi sử dụng cái này, ngoại trừ tôi đặt '+' ở cuối dòng trước, để làm rõ câu lệnh được tiếp tục ở dòng tiếp theo. Cách của bạn không xếp hàng thụt lề đều hơn mặc dù.
Sean

@Sean tôi cũng sử dụng cái này và tôi vẫn thích đặt '+' ở đầu mỗi dòng mới được thêm vào và cuối cùng ';' trên một dòng mới, vì tôi thấy nó 'đúng' hơn.
AglessEssence

7
đặt dấu + ở đầu cho phép người ta nhận xét dòng đó mà không phải chỉnh sửa các dòng khác khi dòng đầu tiên / cuối cùng của chuỗi.
moliad

3
Tôi thích dấu + ở phía trước hơn vì trực quan tôi không cần phải quét đến cuối dòng để biết cái tiếp theo là phần tiếp theo.
Daniel Sokolowski

18

Có thư viện này làm cho nó đẹp:

https://github.com/sindresorhus/multiline

Trước

var str = '' +
'<!doctype html>' +
'<html>' +
'   <body>' +
'       <h1>❤ unicorns</h1>' +
'   </body>' +
'</html>' +
'';

Sau

var str = multiline(function(){/*
<!doctype html>
<html>
    <body>
        <h1>❤ unicorns</h1>
    </body>
</html>
*/});

1
Hỗ trợ này nodejs, sử dụng trong trình duyệt phải thật tuyệt vời.
Huei Tân

3
@HueiTan Docs tuyên bố nó cũng hoạt động trong trình duyệt. Điều đó có ý nghĩa - chỉ là Function.prototype.String().
mikemaccana

ya nhưng nó nói "Mặc dù nó hoạt động tốt trong trình duyệt, nhưng nó chủ yếu được sử dụng trong Node.js. Sử dụng có nguy cơ của riêng bạn. Trong khi trình duyệt hoạt động tốt, nó chủ yếu được sử dụng trong Node.js. có nguy cơ của riêng bạn. " (Chỉ cần XD đáng sợ)
Huei Tan

@HueiTanYep Tôi đọc phần đó. Nhưng Function.prototype.toString () khá ổn định và được nhiều người biết đến.
mikemaccana

1
Câu trả lời tốt nhất cho tôi bởi vì nó ít nhất đạt được multiline mà không có tất cả rác ở giữa (Rác ở đầu và cuối tôi có thể xử lý).
Damien Golding

14

Downvoters : Mã này chỉ được cung cấp cho thông tin.

Điều này đã được thử nghiệm trong Fx 19 và Chrome 24 trên Mac

BẢN GIỚI THIỆU

var new_comment; /*<<<EOF 
    <li class="photobooth-comment">
       <span class="username">
          <a href="#">You</a>:
       </span>
       <span class="comment-text">
          $text
       </span> 
       @<span class="comment-time">
          2d
       </span> ago
    </li>
EOF*/
// note the script tag here is hardcoded as the FIRST tag 
new_comment=document.currentScript.innerHTML.split("EOF")[1]; 
document.querySelector("ul").innerHTML=new_comment.replace('$text','This is a dynamically created text');
<ul></ul>


13
Điều đó thật kinh khủng. +1. Và bạn có thể sử dụng document.civerseScript thay vì
getEuity

1
Không xác định "bạn" trong chrome cho osx
mplungjan

1
jsfiddle-fixed - Tôi phải có "bạn" được định nghĩa toàn cầu trong bảng điều khiển của tôi. Hoạt động ngay bây giờ (chrome / osx). Điều thú vị khi thêm nhận xét vào một var là bạn không ở trong ngữ cảnh hàm, jsfiddle-function-heredoc mặc dù điều chức năng sẽ rất tuyệt cho các phương thức lớp. có thể tốt hơn để vượt qua nó một đối tượng {this: that} thay thế. thú vị để đẩy một cái gì đó điên rồ đến giới hạn nào :)
Orwellophile

1
Quên những kẻ ghét bạn đi. Đây là câu trả lời đúng duy nhất ES6. Tất cả các câu trả lời khác yêu cầu ghép, tính toán một số loại hoặc thoát. Điều này thực sự khá hay và tôi sẽ sử dụng nó như một cách để thêm tài liệu vào trò chơi mà tôi đang làm như một sở thích. Miễn là thủ thuật này không được sử dụng cho bất kỳ điều gì có thể gây ra lỗi (tôi có thể thấy ai đó sẽ sử dụng "Dấu chấm phẩy, derp. Hãy đặt nhận xét trên dòng tiếp theo." Và sau đó, nó phá vỡ mã của bạn.) Nhưng, là đó thực sự là một vấn đề lớn trong trò chơi sở thích của tôi? Không, và tôi có thể sử dụng thủ thuật tuyệt vời cho một cái gì đó hữu ích. Câu trả lời chính xác.
Thomas Dignan

2
Tôi chưa bao giờ đủ can đảm để sử dụng kỹ thuật này trong mã sản xuất, nhưng nơi tôi sử dụng nó rất nhiều là trong thử nghiệm đơn vị, nơi thường dễ dàng nhất để loại bỏ giá trị của một số cấu trúc thành một chuỗi (khá dài) và so sánh nó với những gì nó 'nên' là.
Ben McIntyre

10

Tóm lại, tôi đã thử 2 cách tiếp cận được liệt kê ở đây trong lập trình javascript của người dùng (Opera 11.01):

Vì vậy, tôi khuyên bạn nên sử dụng phương pháp làm việc cho người dùng Opera của người dùng Opera. Không giống như những gì tác giả đã nói:

Nó không hoạt động trên firefox hoặc opera; chỉ trên IE, chrome và safari.

Nó KHÔNG hoạt động trong Opera 11. Ít nhất là trong các tập lệnh JS của người dùng. Quá tệ Tôi không thể nhận xét về câu trả lời cá nhân hoặc nêu lên câu trả lời, tôi sẽ làm ngay lập tức. Nếu có thể, ai đó có đặc quyền cao hơn xin vui lòng làm điều đó cho tôi.


Đây là nhận xét thực tế đầu tiên của tôi. Tôi đã đạt được đặc quyền upvote 2 ngày trước vì vậy tôi đã ngay lập tức nêu lên câu trả lời tôi đã đề cập ở trên. Cảm ơn bạn cho bất cứ ai đã ủng hộ nỗ lực yếu đuối của tôi để giúp đỡ.
Tyler

Cảm ơn tất cả những người thực sự ủng hộ câu trả lời này: Bây giờ tôi có đủ đặc quyền để đăng bình luận bình thường! Vì vậy, cảm ơn một lần nữa.
Tyler

10

Tiện ích mở rộng của tôi tới https://stackoverflow.com/a/15558082/80404 . Nó mong nhận xét ở dạng /*! any multiline comment */biểu tượng! được sử dụng để ngăn chặn loại bỏ bằng cách thu nhỏ (ít nhất là cho máy nén YUI)

Function.prototype.extractComment = function() {
    var startComment = "/*!";
    var endComment = "*/";
    var str = this.toString();

    var start = str.indexOf(startComment);
    var end = str.lastIndexOf(endComment);

    return str.slice(start + startComment.length, -(str.length - end));
};

Thí dụ:

var tmpl = function() { /*!
 <div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
    </ul>
 </div>
*/}.extractComment();

9

Cập nhật cho năm 2015 : bây giờ là sáu năm sau: hầu hết mọi người sử dụng trình tải mô-đun và mỗi hệ thống mô-đun chính đều có cách tải mẫu. Nó không phải là nội tuyến, nhưng loại chuỗi đa dòng phổ biến nhất là các mẫu và nói chung các mẫu nên được loại bỏ khỏi JS .

Yêu cầu: 'yêu cầu văn bản'.

Sử dụng plugin 'text' của request.js , với mẫu nhiều dòng trong template.html

var template = require('text!template.html')

NPM / browserify: mô-đun 'brfs'

Browserify sử dụng mô-đun 'brfs' để tải các tệp văn bản. Điều này thực sự sẽ xây dựng mẫu của bạn vào HTML kèm theo của bạn.

var fs = require("fs");
var template = fs.readFileSync(template.html', 'utf8');

Dễ dàng.


9

Nếu bạn sẵn sàng sử dụng các dòng mới thoát, chúng có thể được sử dụng độc đáo . Nó trông giống như một tài liệu với một đường viền trang .

nhập mô tả hình ảnh ở đây


2
Điều này sẽ không thêm không gian trống bên ngoài?
tomByrer

1
@tomByrer Vâng, quan sát tốt. Nó chỉ tốt cho các chuỗi mà bạn không quan tâm đến khoảng trắng, ví dụ HTML.
seo


8

Điều này hoạt động trong IE, Safari, Chrome và Firefox:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<div class="crazy_idea" thorn_in_my_side='<table  border="0">
                        <tr>
                            <td ><span class="mlayouttablecellsdynamic">PACKAGE price $65.00</span></td>
                        </tr>
                    </table>'></div>
<script type="text/javascript">
    alert($(".crazy_idea").attr("thorn_in_my_side"));
</script>

6
Nghĩ về nó đi. Bạn có nghĩ rằng nó hợp lệ? Bạn không nghĩ rằng nó có thể gây ra vấn đề hiển thị?
Sk8erPeter

5
Tại sao các downvote? Đây là một câu trả lời sáng tạo, nếu không thực tế!
dotancohen

2
không, không phải vậy Một thay vì phải sử dụng các mẫu: $ .tmpl () ( api.jquery.com/tmpl ), hoặc EJS ( embeddedjs.com/getting_started.html ) vv Một lý do cho downvotes là nó thực sự xa từ một mã hợp lệ và sử dụng điều này có thể gây ra vấn đề hiển thị lớn.
Sk8erPeter

Tôi hy vọng không ai từng sử dụng câu trả lời này trong thực tế, nhưng đó là một ý tưởng gọn gàng
DCShannon 13/03/2015

7

Bạn có thể sử dụng TypeScript (JavaScript Superset), nó hỗ trợ các chuỗi đa dòng và chuyển mã trở lại thành JavaScript thuần mà không cần phí:

var templates = {
    myString: `this is
a multiline
string` 
}

alert(templates.myString);

Nếu bạn muốn thực hiện tương tự với JavaScript đơn giản:

var templates = 
{
 myString: function(){/*
    This is some
    awesome multi-lined
    string using a comment 
    inside a function 
    returned as a string.
    Enjoy the jimmy rigged code.
*/}.toString().slice(14,-3)

}
alert(templates.myString)

Lưu ý rằng iPad / Safari không hỗ trợ 'functionName.toString()'

Nếu bạn có nhiều mã kế thừa, bạn cũng có thể sử dụng biến thể JavaScript đơn giản trong TypeScript (cho mục đích dọn dẹp):

interface externTemplates
{
    myString:string;
}

declare var templates:externTemplates;

alert(templates.myString)

và bạn có thể sử dụng đối tượng chuỗi đa dòng từ biến thể JavaScript đơn giản, nơi bạn đặt các mẫu vào một tệp khác (mà bạn có thể hợp nhất trong gói).

Bạn có thể thử TypeScript tại
http://www.typescriptlang.org/Playground


Bất kỳ tài liệu về giới hạn iPad / Safari? MDN dường như nghĩ rằng tất cả đều tốt - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Kẻ

@Campbeln: CoWorker đã nói với tôi điều này (anh ấy đã sử dụng mã). Không tự mình kiểm tra nó. Cũng có thể phụ thuộc vào phiên bản iPad / Safari - vì vậy có lẽ phụ thuộc.
Stefan Steiger

6

Cách làm ES6 sẽ là bằng cách sử dụng các mẫu chữ:

const str = `This 

is 

a

multiline text`; 

console.log(str);

Tham khảo thêm tại đây


Câu trả lời này không chỉ nhỏ, không đầy đủ và được định dạng xấu, mà còn không thêm hoàn toàn bất cứ điều gì vào các câu trả lời trước đó. Đánh dấu nó và nhảy để được xóa.
Victor Schröder


4

Cách dễ nhất để tạo các chuỗi nhiều dòng trong Javascrips là sử dụng backticks (``). Điều này cho phép bạn tạo các chuỗi nhiều dòng trong đó bạn có thể chèn các biến với${variableName} .

Thí dụ:

let name = 'Willem'; 
let age = 26;

let multilineString = `
my name is: ${name}

my age is: ${age}
`;

console.log(multilineString);

tương thích:

  • Nó được giới thiệu trong ES6//es2015
  • Hiện tại, nó được hỗ trợ bởi tất cả các nhà cung cấp trình duyệt lớn (trừ trình duyệt internet explorer)

Kiểm tra tính tương thích chính xác trong tài liệu Mozilla tại đây


Bây giờ điều này có tương thích với tất cả các trình duyệt gần đây không? Hoặc có một số trình duyệt vẫn không hỗ trợ cú pháp này?
cmpreshn

Xin lỗi vì nhận xét cực kỳ muộn của tôi, đã chỉnh sửa câu trả lời thêm thông tin tương thích;)
Willem van der Veen

3

Phiên bản tham gia dựa trên mảng của tôi cho chuỗi concat:

var c = []; //c stands for content
c.push("<div id='thisDiv' style='left:10px'></div>");
c.push("<div onclick='showDo(\'something\');'></div>");
$(body).append(c.join('\n'));

Điều này đã làm việc tốt cho tôi, đặc biệt là khi tôi thường chèn các giá trị vào html được xây dựng theo cách này. Nhưng nó có rất nhiều hạn chế. Lõm sẽ là tốt đẹp. Không phải đối phó với dấu ngoặc kép lồng nhau sẽ thực sự tốt đẹp, và chỉ sự cồng kềnh của nó làm phiền tôi.

Là .push () để thêm vào mảng chiếm nhiều thời gian? Xem câu trả lời liên quan này:

( Có lý do gì các nhà phát triển JavaScript không sử dụng Array.push () không? )

Sau khi xem các lần chạy thử (đối lập) này, có vẻ như .push () vẫn ổn đối với các mảng chuỗi không có khả năng phát triển hơn 100 mục - tôi sẽ tránh nó để bổ sung cho các mảng lớn hơn.


3

Bạn có thể sử dụng +=để nối chuỗi của mình, dường như không ai trả lời rằng, điều này sẽ có thể đọc được và cũng gọn gàng ... đại loại như thế này

var hello = 'hello' +
            'world' +
            'blah';

cũng có thể được viết là

var hello = 'hello';
    hello += ' world';
    hello += ' blah';

console.log(hello);

3

Cũng lưu ý rằng, khi mở rộng chuỗi trên nhiều dòng bằng cách sử dụng dấu gạch chéo ngược ở cuối mỗi dòng, bất kỳ ký tự phụ nào (chủ yếu là khoảng trắng, tab và nhận xét được thêm do nhầm lẫn) sau dấu gạch chéo ngược sẽ gây ra lỗi ký tự không mong muốn, tôi mất một giờ để tìm ngoài

var string = "line1\  // comment, space or tabs here raise error
line2";

3

Xin vui lòng cho internet yêu thích sử dụng nối chuỗi và chọn không sử dụng các giải pháp ES6 cho việc này. ES6 KHÔNG được hỗ trợ trên tất cả các bảng, giống như CSS3 và một số trình duyệt nhất định chậm thích ứng với chuyển động CSS3. Sử dụng JavaScript đơn giản, người dùng cuối của bạn sẽ cảm ơn bạn.

Thí dụ:

var str = "This world is neither flat nor round. "+ "Once was lost will be found";


3
trong khi tôi đồng ý với quan điểm của bạn, tôi sẽ không gọi javascript là "tốt" ol
user151496

2

Bạn phải sử dụng toán tử ghép nối '+'.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <p id="demo"></p>
    <script>
        var str = "This "
                + "\n<br>is "
                + "\n<br>multiline "
                + "\n<br>string.";
        document.getElementById("demo").innerHTML = str;
     </script>
</body>
</html>

Bằng cách sử dụng \nmã nguồn của bạn sẽ trông như thế nào -

Điều này 
 <br> là
 <br> đa dòng
 chuỗi <br>.

Bằng cách sử dụng <br>đầu ra trình duyệt của bạn sẽ trông như thế nào -

Điều này
Là
đa dòng
chuỗi.

1

Tôi nghĩ cách giải quyết này sẽ hoạt động trong IE, Chrome, Firefox, Safari, Opera -

Sử dụng jQuery :

<xmp id="unique_id" style="display:none;">
  Some plain text
  Both type of quotes :  " ' " And  ' " '
  JS Code : alert("Hello World");
  HTML Code : <div class="some_class"></div>
</xmp>
<script>
   alert($('#unique_id').html());
</script>

Sử dụng Javascript thuần túy:

<xmp id="unique_id" style="display:none;">
  Some plain text
  Both type of quotes :  " ' " And  ' " '
  JS Code : alert("Hello World");
  HTML Code : <div class="some_class"></div>
</xmp>
<script>
   alert(document.getElementById('unique_id').innerHTML);
</script>

Chúc mừng !!


<xmp>thật là chán nản Nó có thể được cho phép trong HTML, nhưng không được sử dụng bởi bất kỳ tác giả nào. Xem stackoverflow.com/questions/8307846/ từ
Bergi

@Bergi, bạn đã đúng .. và sử dụng <pre>;với thoát không giúp ích gì cho giải pháp của tôi .. Tôi đã gặp vấn đề tương tự ngày hôm nay và cố gắng tìm ra cách giải quyết .. nhưng trong trường hợp của tôi, tôi đã tìm thấy một cách rất khó để khắc phục vấn đề này bằng cách đặt đầu ra trong các nhận xét html thay vì <xmp> hoặc bất kỳ thẻ nào khác. cười lớn. Tôi biết nó không phải là một cách tiêu chuẩn để làm điều này nhưng tôi sẽ làm việc về vấn đề này nhiều hơn vào ngày mai .. Chúc mừng !!
Aditya Hajare

Thật không may, ngay cả với style="display:none"Chrome cũng cố tải bất kỳ <img>hình ảnh nào được đề cập trong khối ví dụ.
Jesse Glick

0

Chỉ cần thử câu trả lời ẩn danh và thấy có một mẹo nhỏ ở đây, nó không hoạt động nếu có khoảng trống sau dấu gạch chéo ngược. \
Vì vậy, giải pháp sau không hiệu quả -

var x = { test:'<?xml version="1.0"?>\ <-- One space here
            <?mso-application progid="Excel.Sheet"?>' 
};

Nhưng khi không gian được loại bỏ, nó hoạt động -

var x = { test:'<?xml version="1.0"?>\<-- No space here now
          <?mso-application progid="Excel.Sheet"?>' 
};

alert(x.test);​

Hy vọng nó giúp !!


7
rõ ràng nếu bạn có một khoảng trắng sau dấu gạch chéo ngược, dấu gạch chéo ngược thoát khỏi khoảng trắng. Nó được cho là để thoát linebreak, không phải không gian.
Sejanus
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.