การสร้างสตริงหลายบรรทัดใน JavaScript


2611

ฉันมีรหัสต่อไปนี้ใน Ruby ฉันต้องการแปลงรหัสนี้เป็น JavaScript รหัสเทียบเท่าใน JS คืออะไร

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


ลองใช้วิธีการต่าง ๆ ในการบรรลุเป้าหมายเดียวกัน ฉันได้เพิ่มประสิทธิภาพของแต่ละวิธีแล้วเช่นกันstackoverflow.com/a/23867090/848841
Vignesh Subramanian

คำตอบ:


3316

ปรับปรุง:

ECMAScript 6 (ES6) แนะนำชนิดใหม่ของตัวอักษรคืออักษรแม่แบบ พวกเขามีคุณสมบัติมากมายการแก้ไขตัวแปรในหมู่คนอื่น ๆ แต่ที่สำคัญที่สุดสำหรับคำถามนี้พวกเขาสามารถ multiline

เทมเพลตตัวอักษรถูกคั่นด้วยbackticks :

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

(หมายเหตุ: ฉันไม่ได้สนับสนุนให้ใช้ HTML ในสตริง)

การสนับสนุนเบราว์เซอร์ก็โอเคแต่คุณสามารถใช้ทรานสฟิลเลอร์เพื่อเข้ากันได้มากกว่า


คำตอบ ES5 ดั้งเดิม:

Javascript ไม่มีไวยากรณ์ของเอกสารที่นี่ คุณสามารถหลบหนีขึ้นบรรทัดใหม่ตามตัวอักษรได้ซึ่งใกล้เคียง:

"foo \
bar"

231
ได้รับคำเตือน: เบราว์เซอร์บางตัวจะแทรกบรรทัดใหม่ที่ต่อเนื่อง แต่บางเบราว์เซอร์จะไม่
staticsan

35
Visual Studio 2010 ดูเหมือนว่าจะสับสนกับไวยากรณ์นี้เช่นกัน
jcollum

47
@Nate มันถูกระบุไว้ในECMA-262 รุ่นที่ 5ส่วน 7.8.4 และเรียกว่าLineContinuation : "อักขระตัวยุติบรรทัดไม่สามารถปรากฏในสตริงตัวอักษรยกเว้นเป็นส่วนหนึ่งของLineContinuationเพื่อสร้างลำดับอักขระที่ว่างเปล่าวิธีที่ถูกต้องในการทำให้ อักขระตัวต่อท้ายบรรทัดที่เป็นส่วนหนึ่งของค่าสตริงของตัวอักษรสตริงคือการใช้ลำดับการยกเว้นเช่น \ n หรือ \ u000A "
บาง

16
ฉันไม่เห็นสาเหตุที่คุณต้องทำเมื่อเบราว์เซอร์จัดการกับมันอย่างไม่สอดคล้องกัน "line1 \ n" + "line2" ข้ามหลายบรรทัดสามารถอ่านได้เพียงพอและคุณรับประกันได้ว่าพฤติกรรมที่สอดคล้องกัน
SamStephens

11
"การรองรับเบราว์เซอร์ก็โอเค" ... ไม่รองรับโดย IE11 - ไม่เป็นไร
Tom Andraszek

1317

อัพเดท ES6:

ตามคำตอบแรกที่กล่าวถึงด้วย ES6 / Babel ตอนนี้คุณสามารถสร้างสตริงหลายบรรทัดได้ง่ายๆโดยใช้ backticks:

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

ตัวแปรการแก้ไขเป็นคุณลักษณะใหม่ที่ได้รับความนิยมที่มาพร้อมกับสตริงที่คั่นด้วยเครื่องหมายขีดหลัง:

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

นี่แค่ transpiles ลงไปที่การต่อกัน:

user.name + ' liked your post about strings'

คำตอบ ES5 ดั้งเดิม:

คู่มือสไตล์ JavaScript ของ Googleแนะนำให้ใช้การต่อสตริงแทนการขึ้นบรรทัดใหม่:

อย่าทำอย่างนี้:

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.';

ช่องว่างที่จุดเริ่มต้นของแต่ละบรรทัดไม่สามารถถอดแยกได้อย่างปลอดภัยในเวลารวบรวม ช่องว่างหลังจากเครื่องหมายทับจะทำให้เกิดข้อผิดพลาดหากิน และในขณะที่เอ็นจิ้นสคริปต์ส่วนใหญ่สนับสนุนสิ่งนี้มันไม่ได้เป็นส่วนหนึ่งของ ECMAScript

ใช้การต่อสตริงแทน:

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
ฉันไม่เข้าใจคำแนะนำของ Google เบราว์เซอร์ทั้งหมดยกเว้นเบราว์เซอร์ที่เก่ามากรองรับแบ็กสแลชตามด้วยวิธีการขึ้นบรรทัดใหม่และจะดำเนินการต่อในอนาคตเพื่อความเข้ากันได้แบบย้อนหลัง เวลาเดียวที่คุณต้องหลีกเลี่ยงคือถ้าคุณต้องการให้แน่ใจว่ามีการเพิ่มหนึ่งบรรทัดและหนึ่งบรรทัดเท่านั้น (หรือไม่มีการขึ้นบรรทัดใหม่) ในตอนท้ายของแต่ละบรรทัด (ดูความคิดเห็นของฉันเกี่ยวกับคำตอบที่ยอมรับ)
Matt Browne

6
โปรดทราบว่าไม่รองรับสตริงเทมเพลตใน IE11, Firefox 31, Chrome 35 หรือ Safari 7 ดูkangax.github.io/compat-table/es6
EricP

29
@MattBrowne คำแนะนำของ Google ได้รับการบันทึกไว้แล้วตามลำดับความสำคัญของเหตุผล: (1) ช่องว่างที่จุดเริ่มต้นของแต่ละบรรทัด [ในตัวอย่างคุณไม่ต้องการช่องว่างในสตริงของคุณ แต่ดูดีกว่าในรหัส ] (2) ช่องว่างหลังจากเครื่องหมายทับจะส่งผลให้เกิดข้อผิดพลาดหากคุณจบบรรทัดด้วย\ แทนที่จะเป็นเรื่องยากที่จะสังเกตเห็นและ (3) ในขณะที่โปรแกรมสคริปต์ส่วนใหญ่สนับสนุนสิ่งนี้มันไม่ได้เป็นส่วนหนึ่งของ ECMAScript [เช่นทำไม ใช้คุณสมบัติที่ไม่เป็นมาตรฐานหรือไม่] จำไว้ว่าเป็นแนวทางสไตล์ซึ่งเกี่ยวกับการทำรหัสง่ายต่อการอ่าน + บำรุงรักษา + แก้ไขข้อบกพร่อง: ไม่ใช่แค่ "ใช้งานได้" ถูกต้อง
ShreevatsaR

1
น่าอัศจรรย์ว่าหลังจากการเรียงสตริงเป็นเวลาหลายปีเหล่านี้ยังคงเป็นวิธีที่ดีที่สุด / ปลอดภัยที่สุด / เป็นไปตามข้อกำหนดนี้มากที่สุด เทมเพลตตัวอักษร (คำตอบด้านบน) ไม่ทำงานใน IE และการหลบเลี่ยงบรรทัดเป็นเพียงความยุ่งเหยิงที่คุณจะต้องเสียใจในเร็ว ๆ นี้
ติอาโกเตอาร์เต

1
พบวิธีที่ยากที่ Android รุ่นเก่าจะไม่รองรับ backticks ดังนั้นหากคุณมีแอพ Android ที่ใช้เว็บดู backticks ของคุณทำให้แอปของคุณไม่ทำงาน!
Michael Fever

684

รูปแบบtext = <<"HERE" This Is A Multiline String HEREไม่สามารถใช้ได้ใน js (ฉันจำได้ว่าใช้มันมากในวัน Perl เก่าของฉันดี)

เพื่อให้การดูแลกับสายที่ซับซ้อนหรือยาวหลายครั้งฉันใช้รูปแบบอาร์เรย์:

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

หรือรูปแบบที่ไม่ระบุชื่อแสดงขึ้นมาแล้ว (ยกเว้นการขึ้นบรรทัดใหม่) ซึ่งอาจเป็นบล็อกที่น่าเกลียดในรหัสของคุณ:

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

นี่คืออีกหนึ่งเคล็ดลับที่แปลก แต่ทำงาน ' 1 :

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

แก้ไขภายนอก: jsfiddle

ES20xxรองรับการขยายสตริงข้ามหลายบรรทัดโดยใช้สตริงเทมเพลต :

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หมายเหตุ: สิ่งนี้จะหายไปหลังจากการย่อ / ขยายรหัสของคุณ


34
โปรดอย่าใช้รูปแบบอาร์เรย์ มันจะช้ากว่าการต่อสตริงแบบธรรมดาในกรณีส่วนใหญ่
BMiner

73
รูปแบบอาร์เรย์สามารถอ่านได้มากขึ้นและประสิทธิภาพในการสูญเสียแอปพลิเคชันมักจะน้อยมาก การทดสอบแบบสมบูรณ์แสดงให้เห็นว่าแม้แต่ IE7 ก็สามารถทำงานได้นับหมื่นต่อวินาที
Benjamin Atkin

19
+1 สำหรับทางเลือกที่หรูหราซึ่งไม่เพียงทำงานในลักษณะเดียวกันกับเบราว์เซอร์ทั้งหมด แต่ยังเป็นข้อพิสูจน์ในอนาคต
Pavel

26
@KooiInc การทดสอบของคุณเริ่มต้นด้วยอาร์เรย์ที่สร้างไว้แล้วซึ่งจะบิดเบือนผลลัพธ์ หากคุณเพิ่มการกำหนดค่าเริ่มต้นของอาเรย์การต่อข้อมูลแบบตรงจะเร็วกว่าjsperf.com/string-concat-without-sringbuilder/7ดูstackoverflow.com/questions/51185/ในฐานะที่เป็นเคล็ดลับสำหรับการขึ้นบรรทัดใหม่อาจไม่เป็นไร ทำงานได้มากกว่าที่ควร
Juan Mendes

9
@Biner: 1) "การเพิ่มประสิทธิภาพก่อนกำหนดเป็นรากของความชั่วร้ายทั้งหมด" - โดนัลด์ Knuth และ 2) 'การอ่าน' อยู่ในสายตาของคนดู
Paul Bennett

348

คุณสามารถมีสตริงหลายบรรทัดใน JavaScript บริสุทธิ์

วิธีการนี้จะขึ้นอยู่กับอนุกรมของฟังก์ชั่นซึ่งถูกกำหนดให้เป็นขึ้นอยู่กับการดำเนินงาน มันทำงานได้ในเบราว์เซอร์ส่วนใหญ่ (ดูด้านล่าง) แต่ไม่มีการรับประกันว่ามันจะยังคงทำงานได้ในอนาคตดังนั้นอย่าพึ่งพา

ใช้ฟังก์ชั่นต่อไปนี้:

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

คุณสามารถมีเอกสารได้ที่นี่:

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

วิธีนี้ได้รับการทดสอบในเบราว์เซอร์ต่อไปนี้ (ไม่ได้กล่าวถึง = ไม่ทดสอบ):

  • IE 4 - 10
  • Opera 9.50 - 12 (ไม่ใช่ใน 9-)
  • Safari 4 - 6 (ไม่ใช่ใน 3-)
  • Chrome 1 - 45
  • Firefox 17 - 21 ( ไม่ใช่ใน 16- )
  • Rekonq 0.7.0 - 0.8.0
  • ไม่รองรับใน Konqueror 4.7.4

อย่างไรก็ตามระวังด้วย minifier ของคุณ มันมีแนวโน้มที่จะลบความคิดเห็น สำหรับคอมเพรสเซอร์ YUIความคิดเห็นที่เริ่มต้นด้วย/*!(เช่นเดียวกับที่ฉันใช้) จะถูกเก็บรักษาไว้

ผมคิดว่าจริงการแก้ปัญหาจะใช้CoffeeScript

ES6 UPDATE: คุณสามารถใช้ backtick แทนการสร้างฟังก์ชั่นที่มีความคิดเห็นและวิ่งไปที่ String ในความคิดเห็น regex จำเป็นต้องได้รับการอัปเดตเพื่อตัดพื้นที่เท่านั้น คุณสามารถมีวิธีการแบบสตริงสำหรับการทำสิ่งนี้:

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

นั่นจะเท่ห์ บางคนควรเขียนวิธีการลบ. RemoveIndentation นี้ ... ;)


232
อะไร!? การสร้างและแยกส่วนฟังก์ชั่นเพื่อแฮ็คความคิดเห็นหลายบรรทัดให้เป็นสตริงหลายบรรทัด? ตอนนี้มันน่าเกลียด
fforw

4
jsfiddle.net/fqpwfทำงานใน Chrome 13 และ IE8 / 9 แต่ไม่ใช่ FF6 ฉันเกลียดที่จะพูด แต่ฉันชอบมันและถ้ามันเป็นคุณสมบัติที่ตั้งใจของแต่ละเบราว์เซอร์ (เพื่อที่มันจะไม่หายไป) ฉันจะใช้มัน
Jason Kleban

2
@ uosɐſ: เพื่อให้เป็นไปตามเจตนามันจะต้องอยู่ในสเป็ค; หรือใช้กันอย่างแพร่หลายผู้ผลิตเบราว์เซอร์จะไม่ต้องการลบคุณลักษณะ "อุบัติเหตุ" นี้ ขอบคุณสำหรับการทดลองที่ ... ลองใช้ coffeescript
Jordão

1
a.toString (). substring (15, a.toString (). length-4) ยังใช้งานได้และไม่จำเป็นต้องสแกนสตริงทั้งหมด (แม้ว่าจะเป็นไปได้มากที่สุดและการนับจะสแกนอีกครั้งต่อไปโอ้ wel .)
Lodewijk

2
มีประโยชน์อย่างยิ่ง ฉันใช้มันสำหรับการทดสอบหน่วย (จัสมิน) แต่หลีกเลี่ยงเป็นรหัสการผลิต
46499 Jason

207

คุณสามารถทำสิ่งนี้ ...

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

ตัวอย่างแรกนั้นยอดเยี่ยมและเรียบง่าย ดีกว่าวิธี \ เพราะฉันไม่แน่ใจว่าเบราว์เซอร์จะจัดการแบ็กสแลชในฐานะตัวละคร Escape และอักขระหลายบรรทัดได้อย่างไร
Matt K


e4x.jsจะเป็นวิธีแก้ปัญหาที่ดีในอนาคต
Paul Sweatte

139

ฉันมากับวิธี rigged jimmy นี้ของสายที่มีหลายแถว เนื่องจากการแปลงฟังก์ชั่นเป็นสตริงจะส่งคืนความคิดเห็นใด ๆ ภายในฟังก์ชันคุณสามารถใช้ความคิดเห็นเป็นสตริงของคุณโดยใช้ความคิดเห็นแบบหลายบรรทัด / ** / คุณเพียงแค่ต้องตัดปลายและคุณมีสายของคุณ

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
มันน่ากลัวอย่างยิ่ง ฉันรักมัน (แม้ว่าคุณอาจจะต้องทำการแข่งขัน regex เพราะฉันไม่แน่ใจว่าช่องว่างที่แม่นยำสำหรับtoString()คืออะไร
Kevin Cox

วิธีแก้ปัญหานี้ดูเหมือนจะไม่ทำงานใน firefox มันอาจจะเป็นคุณลักษณะด้านความปลอดภัยสำหรับเบราว์เซอร์หรือไม่? แก้ไข: ไม่เป็นไรมันใช้ไม่ได้กับ Firefox เวอร์ชั่น 16 เท่านั้น
Bill Software Engineer

45
ยังระวัง minifiers ที่เปลื้องความคิดเห็น ... : D
jondavidjohn

3
นี่คือเหตุผลที่เราไม่สามารถมีสิ่งที่ดี
Danilo M. Oliveira

4
คุณสามารถทำสิ่งแปลก ๆ ในจาวาสคริปต์ที่ดิน แม้ว่าจะซื่อสัตย์ แต่คุณไม่ควรใช้สิ่งนี้
ลุค

88

ฉันประหลาดใจที่ฉันไม่เห็นสิ่งนี้เพราะมันใช้ได้ทุกที่ที่ฉันทดสอบและมีประโยชน์มากสำหรับเทมเพลตเช่น:

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

ใครรู้สภาพแวดล้อมที่มี HTML แต่มันไม่ทำงาน


23
ทุกที่ที่คุณไม่ต้องการใส่สายของคุณลงในองค์ประกอบสคริปต์แยกและไกล
Lodewijk

9
การคัดค้านที่ถูกต้อง! มันไม่สมบูรณ์แบบ แต่สำหรับเทมเพลตการแยกนั้นไม่เพียงแค่ตกลง แต่อาจได้รับการสนับสนุนด้วยซ้ำ
Peter V. Mørch

1
ฉันชอบแยกทุกอย่างมากกว่า 80/120 ตัวละครออกเป็นหลายบรรทัดฉันกลัวว่ามันไม่ใช่แค่เทมเพลต ตอนนี้ฉันชอบไวยากรณ์ 'line1' + 'line2' นอกจากนี้ยังเป็นวิธีที่เร็วที่สุด (แม้ว่าสิ่งนี้อาจเทียบได้กับข้อความที่มีขนาดใหญ่มาก) มันเป็นเคล็ดลับที่ดี
Lodewijk

27
จริงๆแล้วนี่ไม่ใช่ HTML Javascript: - /
CpILL

5
แม้กระนั้นงานของการได้รับสตริงหลาย
บรรทัด

52

ฉันแก้ไขมันโดยการแสดงผล div ทำให้มันถูกซ่อนและเรียกรหัส div โดย jQuery เมื่อฉันต้องการมัน

เช่น

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

จากนั้นเมื่อฉันต้องการรับสายฉันใช้ jQuery ต่อไปนี้:

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

ซึ่งส่งกลับข้อความของฉันในหลายบรรทัด ถ้าฉันโทร

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

ฉันเข้าใจ:

ป้อนคำอธิบายรูปภาพที่นี่


2
ขอบคุณสำหรับสิ่งนี้! เป็นคำตอบเดียวที่ฉันพบว่าแก้ปัญหาของฉันซึ่งเกี่ยวข้องกับสตริงที่ไม่รู้จักที่อาจมีการรวมกันของคำพูดเดี่ยวและคู่ที่ถูกแทรกโดยตรงในรหัสโดยไม่มีโอกาสในการเข้ารหัสล่วงหน้า (มันมาจากภาษาเทมเพลตที่สร้าง JS - ยังมาจากแหล่งที่เชื่อถือได้และไม่ใช่การส่งแบบฟอร์มดังนั้นจึงไม่ใช่การทำให้เสียโดยสิ้นเชิง)
ตุลาคม

นี่เป็นวิธีเดียวที่ใช้งานได้จริงสำหรับฉันในการสร้างตัวแปรสตริง javascript แบบหลายบรรทัดจาก Java String
เริ่มต้น

4
เกิดอะไรขึ้นถ้าสตริงเป็น HTML
Dan Dascalescu

4
$ ('# UniqueID'). content ()
mplungjan

1
@Pacerier ทุกอย่างที่ฉันได้อ่านจาก Google รวมถึงเว็บไซต์อื่น ๆ บอกว่าทุกวันนี้ Google ทำดัชนีdisplay:noneเนื้อหาน่าจะเป็นเพราะความนิยมของส่วนหน้าแบบจาวาสคริปต์ (ตัวอย่างเช่นหน้าคำถามที่พบบ่อยซึ่งมีฟังก์ชันซ่อน / แสดง) คุณต้องระวังเพราะ Google บอกว่าพวกเขาสามารถลงโทษคุณได้หากเนื้อหาที่ซ่อนอยู่นั้นดูเหมือนว่าได้รับการออกแบบมาเพื่อเพิ่มอันดับ SEO ของคุณให้สูงขึ้น
กาวิน

31

มีหลายวิธีในการบรรลุเป้าหมายนี้

1. การต่อสแลช

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

2. การต่อข้อมูลแบบปกติ

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

3. Array เข้าร่วมการต่อข้อมูล

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

ประสิทธิภาพที่ชาญฉลาดการต่อกัน Slash (อันแรก) เป็นวิธีที่เร็วที่สุด

อ้างถึง กรณีทดสอบนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับประสิทธิภาพ

ปรับปรุง:

ด้วยES2015เราสามารถใช้ประโยชน์จากคุณสมบัติสายแม่แบบของมัน ด้วยเราเพียงแค่ต้องใช้ back-ticks เพื่อสร้างสตริงหลายบรรทัด

ตัวอย่าง:

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

11
ฉันคิดว่าคุณเพิ่งสำรอกสิ่งที่มีอยู่แล้วในหน้านี้เป็นเวลาห้าปี แต่ในทางที่สะอาดกว่า
RandomInsano

จะไม่รวมการทับช่องว่างรวมช่องว่างในการเริ่มต้นของบรรทัดหรือไม่
f.khantsis

29

ใช้แท็กสคริปต์:

  • เพิ่ม<script>...</script>บล็อกที่มีข้อความหลายบรรทัดของคุณลงในheadแท็ก
  • รับข้อความหลายบรรทัดของคุณตามที่เป็น ... (ระวังการเข้ารหัสข้อความ: 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>

ฉันคิดว่ากลยุทธ์นี้สะอาดและใช้งานไม่ได้ jsrender ใช้สิ่งนี้
xdhmoore

ฉันใช้สิ่งนี้กับ innerText iso innerHTML แต่ฉันจะแน่ใจได้อย่างไรว่าช่องว่างที่ถูกเก็บรักษาไว้?
David Nouls

นอกจากนี้ยังมีการสอบถาม Ajax ในกรณีที่คุณใช้พวกเขา คุณสามารถลองเปลี่ยนส่วนหัวของคุณxhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");ฉันจำไม่ได้ว่ามีปัญหาอื่นนอกเหนือจากการพิมพ์ผิดใน JS ช่องว่างที่ไม่มีปัญหา
jpfreire

24

ฉันชอบไวยากรณ์และการทำดัชนี:

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

(แต่จริงๆแล้วไม่สามารถพิจารณาได้ว่าเป็นสตริงหลายบรรทัด)


3
ฉันใช้สิ่งนี้ยกเว้นฉันใส่ '+' ที่ท้ายบรรทัดก่อนหน้าเพื่อให้ชัดเจนว่าคำสั่งยังคงดำเนินต่อไปในบรรทัดถัดไป วิธีการของคุณจัดเรียงเยื้องมากขึ้นอย่างเท่าเทียมกัน
Sean

@Sean ฉันใช้สิ่งนี้ด้วยและฉันยังคงต้องการใส่ '+' ที่จุดเริ่มต้นของแต่ละบรรทัดใหม่ที่เพิ่มและสุดท้าย ';' ในบรรทัดใหม่เพราะฉันพบว่าถูกต้องมากขึ้น
AgelessEssence

7
การใส่ + ที่จุดเริ่มต้นอนุญาตให้หนึ่งสามารถคอมเม้นต์บรรทัดนั้นโดยไม่ต้องแก้ไขบรรทัดอื่นเมื่อบรรทัดแรก / ลำดับสุดท้ายของลำดับ
moliad

3
ฉันชอบเครื่องหมาย + ที่ด้านหน้าด้วยเนื่องจากฉันไม่จำเป็นต้องสแกนไปยังจุดสิ้นสุดของบรรทัดเพื่อให้รู้ว่าสิ่งต่อไปคือความต่อเนื่อง
Daniel Sokolowski

18

มีห้องสมุดนี้ที่ทำให้สวยงาม:

https://github.com/sindresorhus/multiline

ก่อน

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

หลังจาก

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

1
การสนับสนุนนี้ในการnodejsใช้งานในเบราว์เซอร์จะต้องมีความสำคัญ
Huei Tan

3
@HueiTan เอกสารระบุว่ายังใช้งานได้ในเบราว์เซอร์ ซึ่งสมเหตุสมผล - เป็นเพียงFunction.prototype.String()มันเป็นเพียงแค่
mikemaccana

ใช่ แต่มันบอกว่า "ในขณะที่มันทำงานได้ดีในเบราว์เซอร์ส่วนใหญ่มีไว้สำหรับใช้ใน Node.js การใช้งานของคุณต้องยอมรับความเสี่ยงขณะที่มันทำงานได้ดีในเบราว์เซอร์ คุณต้องยอมรับความเสี่ยง " (แค่เป็น XD
Huei Tan

@HueiTanYep ฉันอ่านส่วนนั้น แต่ Function.prototype.toString () ค่อนข้างเสถียรและเป็นที่รู้จักกันดี
mikemaccana

1
คำตอบที่ดีที่สุดสำหรับฉันเพราะอย่างน้อยก็บรรลุ multiline โดยไม่มีขยะอยู่ตรงกลาง (ขยะที่จุดเริ่มต้นและสิ้นสุดฉันสามารถจัดการกับ)
ดาเมียนโกลด์ดิง

14

Downvoters : รหัสนี้ให้มาเพื่อเป็นข้อมูลเท่านั้น

สิ่งนี้ได้รับการทดสอบใน Fx 19 และ Chrome 24 บน Mac

การสาธิต

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
มันช่างน่ากลัว +1 และคุณสามารถใช้document.currentScriptแทน getElement ...
Orwellophile

1
ไม่ได้กำหนด "you" ใน chrome สำหรับ osx
mplungjan

1
jsfiddle-fixed - ฉันต้องมี "คุณ" ที่กำหนดไว้ทั่วโลกในคอนโซลของฉัน ใช้งานได้ทันที (chrome / osx) สิ่งที่ดีเกี่ยวกับการเพิ่มข้อคิดเห็นลงใน var คือว่าคุณไม่ได้อยู่ในบริบทของฟังก์ชั่นjsfiddle-function-heredocแม้ว่าสิ่งที่ฟังก์ชั่นจะเจ๋งสำหรับวิธีการเรียน อาจจะดีกว่าถ้าจะส่งผ่านแทนที่สิ่งนี้ {that: that} วัตถุ สนุกที่จะผลักดันบางสิ่งที่บ้าให้ถึงขีดสุดได้ :) :)
Orwellophile

1
ลืมความเกลียดชัง นี่เป็นแถบคำตอบเดียวที่ถูกต้อง ES6 คำตอบอื่น ๆ ทั้งหมดต้องการการต่อข้อมูลการคำนวณบางอย่างหรือการหลบหนี นี่มันเจ๋งจริง ๆ และฉันจะใช้มันเป็นวิธีเพิ่มเอกสารในเกมที่ฉันทำงานเป็นงานอดิเรก ตราบใดที่เคล็ดลับนี้ไม่ได้ใช้สำหรับสิ่งที่อาจก่อให้เกิดข้อผิดพลาด (ฉันสามารถดูว่ามีใครบางคนจะไป "Semicolon, derp. ให้ใส่ความคิดเห็นในบรรทัดถัดไป" แล้วมันจะทำลายรหัสของคุณ) แต่เป็น นั่นเป็นเรื่องใหญ่ในเกมงานอดิเรกของฉัน? ไม่และฉันสามารถใช้เคล็ดลับเด็ด ๆ สำหรับสิ่งที่มีประโยชน์ คำตอบที่ดี
Thomas Dignan

2
ฉันไม่เคยกล้าพอที่จะใช้เทคนิคนี้ในรหัสการผลิต แต่ที่ฉันใช้บ่อยๆในการทดสอบหน่วยซึ่งบ่อยครั้งที่มันง่ายที่สุดในการถ่ายโอนค่าของโครงสร้างบางอย่างเป็นสตริง (ค่อนข้างยาว) และเปรียบเทียบกับ มันควรจะเป็นอะไร
Ben McIntyre

10

เพื่อสรุปฉันได้ลอง 2 วิธีที่ระบุไว้ที่นี่ในการเขียนโปรแกรมจาวาสคริปต์ผู้ใช้ (Opera 11.01):

ดังนั้นฉันแนะนำวิธีการทำงานสำหรับผู้ใช้ Opera ผู้ใช้ JS ไม่เหมือนกับที่ผู้เขียนพูดว่า:

มันใช้งานไม่ได้กับ firefox หรือ opera เฉพาะใน IE, chrome และ Safari

มันทำงานได้ใน Opera 11 อย่างน้อยก็ในสคริปต์ JS ของผู้ใช้ เสียดายที่ฉันไม่สามารถแสดงความคิดเห็นในคำตอบของแต่ละบุคคลหรือถอนคำตอบได้ฉันจะทำทันที ถ้าเป็นไปได้ผู้ที่มีสิทธิ์สูงกว่าโปรดทำเพื่อฉัน


นี่เป็นความคิดเห็นที่แท้จริงครั้งแรกของฉัน ฉันได้รับสิทธิ์การอัปโหลดแล้ว 2 วันที่แล้วดังนั้นฉันจึงอัปเกรดคำตอบเดียวที่ฉันได้กล่าวไว้ข้างต้นทันที ขอบคุณทุกคนที่ลงคะแนนความพยายามที่อ่อนแอของฉันเพื่อช่วย
Tyler

ขอบคุณทุกคนที่ตอบโต้คำตอบนี้จริง ๆ : ฉันมีสิทธิ์มากพอที่จะโพสต์ความคิดเห็นปกติ! ขอบคุณอีกครั้ง
Tyler

10

ส่วนขยายของฉันเพื่อhttps://stackoverflow.com/a/15558082/80404 มันคาดว่าจะแสดงความคิดเห็นในรูปแบบ/*! any multiline comment */ที่เป็นสัญลักษณ์! ใช้เพื่อป้องกันการลบโดยการทำให้มีขนาดเล็ก (อย่างน้อยสำหรับคอมเพรสเซอร์ 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));
};

ตัวอย่าง:

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

9

อัปเดตในปี 2558 : หกปีต่อมาขณะนี้: คนส่วนใหญ่ใช้ตัวโหลดโมดูลและระบบโมดูลหลักแต่ละระบบมีวิธีการโหลดเทมเพลต ไม่ใช่อินไลน์ แต่สตริง multiline ชนิดที่พบมากที่สุดคือเทมเพลตและโดยทั่วไปแล้วเทมเพลตควรเก็บจาก JS อยู่ดีอยู่แล้ว

require.js: 'ต้องการข้อความ'

การใช้plugin 'text' plugin ที่จำเป็นต้องใช้กับเทมเพลตหลายบรรทัดในtemplate.html

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

NPM / browserify: โมดูล 'brfs'

Browserify ใช้โมดูล 'brfs'เพื่อโหลดไฟล์ข้อความ สิ่งนี้จะสร้างเทมเพลตของคุณเป็น HTML ที่รวมเป็นกลุ่ม

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

ง่าย.


9

หากคุณยินดีที่จะใช้การขึ้นบรรทัดใหม่หนีพวกเขาสามารถนำมาใช้เป็นอย่างดี ดูเหมือนว่าเอกสารที่มีเส้นขอบหน้า

ป้อนคำอธิบายรูปภาพที่นี่


2
สิ่งนี้จะเพิ่มช่องว่างที่ไม่เกี่ยวข้องหรือไม่
tomByrer

1
@ TomByrer ใช่สังเกตดี เหมาะสำหรับสตริงที่คุณไม่สนใจพื้นที่สีขาวเท่านั้นเช่น HTML
seo


8

สามารถใช้งานได้กับ IE, Safari, Chrome และ 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
แค่คิดเกี่ยวกับมัน คุณคิดว่ามันถูกต้องหรือไม่ คุณไม่คิดว่ามันจะทำให้เกิดปัญหาการแสดงผล?
Sk8erPeter

5
ทำไมต้องลงคะแนน? นี่คือคำตอบที่สร้างสรรค์ถ้าไม่ได้ใช้ประโยชน์ได้มาก!
dotancohen

2
ไม่มันไม่ใช่. หนึ่งควรใช้เทมเพลต: $ .tmpl () ( api.jquery.com/tmpl ) หรือ EJS ( embeddedjs.com/getting_started.html ) ฯลฯ เหตุผลหนึ่งที่ทำให้ downvotes นั้นอยู่ไกลจากรหัสที่ใช้งานจริงและการใช้งาน ซึ่งอาจทำให้เกิดปัญหาการแสดงผลขนาดใหญ่
Sk8erPeter

ฉันหวังว่าจะไม่มีใครใช้คำตอบนี้ในทางปฏิบัติ แต่มันเป็นความคิดที่เรียบร้อย
DCShannon

7

คุณสามารถใช้TypeScript (JavaScript SuperSet) รองรับสตริงหลายบรรทัดและ transpilesกลับไปที่ JavaScript บริสุทธิ์โดยไม่มีค่าใช้จ่าย:

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

alert(templates.myString);

หากคุณต้องการทำเช่นเดียวกันกับ JavaScript ธรรมดา:

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)

โปรดทราบว่า iPad / Safari ไม่รองรับ 'functionName.toString()'

หากคุณมีรหัสดั้งเดิมจำนวนมากคุณสามารถใช้ตัวแปร JavaScript ธรรมดาใน TypeScript (เพื่อวัตถุประสงค์ในการล้างข้อมูล):

interface externTemplates
{
    myString:string;
}

declare var templates:externTemplates;

alert(templates.myString)

และคุณสามารถใช้วัตถุหลายสตริงจากตัวแปร JavaScript ธรรมดาซึ่งคุณใส่แม่แบบลงในไฟล์อื่น (ซึ่งคุณสามารถผสานในบันเดิล)

คุณสามารถลองใช้ TypeScript ได้ที่
http://www.typescriptlang.org/Playground


เอกสารใด ๆ เกี่ยวกับข้อ จำกัด ของ iPad / Safari MDN ดูเหมือนว่าจะเป็นสิ่งที่ดี - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

@Campbeln: CoWorker บอกฉันนี้ (เขาใช้รหัส) ยังไม่ได้ทดสอบด้วยตนเอง อาจขึ้นอยู่กับรุ่น iPad / Safari - ดังนั้นอาจขึ้นอยู่กับ
Stefan Steiger

6

วิธีการทำ ES6 โดยใช้แม่แบบตัวอักษร:

const str = `This 

is 

a

multiline text`; 

console.log(str);

อ้างอิงเพิ่มเติมที่นี่


คำตอบนี้ไม่เพียง แต่มีขนาดเล็กไม่สมบูรณ์และจัดรูปแบบไม่ดี แต่ยังไม่ได้เพิ่มคำตอบก่อนหน้านี้อย่างแน่นอน ติดธงทำเครื่องหมายและกระโดดเพื่อลบ
Victor Schröder

5

ES6 ช่วยให้คุณใช้ backtick เพื่อระบุสตริงในหลายบรรทัด มันเรียกว่าเทมเพลตตัวอักษร แบบนี้:

var multilineString = `One line of text
    second line of text
    third line of text
    fourth line of text`;

การใช้ backtick ใช้งานได้ใน NodeJS และรองรับ Chrome, Firefox, Edge, Safari และ Opera

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals


4

วิธีที่ง่ายที่สุดในการสร้างสตริงหลายบรรทัดใน Javascrips คือการใช้ backticks (``) สิ่งนี้อนุญาตให้คุณสร้างสตริงหลายบรรทัดซึ่งคุณสามารถแทรกตัวแปรได้${variableName}ได้

ตัวอย่าง:

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

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

my age is: ${age}
`;

console.log(multilineString);

ความเข้ากันได้:

  • มันแนะนำในES6//es2015
  • ตอนนี้ได้รับการสนับสนุนจากผู้จำหน่ายเบราว์เซอร์รายใหญ่ทั้งหมด (ยกเว้น Internet Explorer)

ตรวจสอบความเข้ากันได้ที่แน่นอนใน Mozilla docs ที่นี่


ตอนนี้มันเข้ากันได้กับเบราว์เซอร์ล่าสุดทั้งหมดหรือไม่ หรือมีเบราว์เซอร์บางตัวที่ยังไม่รองรับไวยากรณ์นี้หรือไม่?
cmpreshn

ขออภัยสำหรับความคิดเห็นที่ล่าช้าของฉันแก้ไขคำตอบที่เพิ่มข้อมูลความเข้ากันได้;)
Willem van der Veen

3

รุ่นของฉันของการรวมอาเรย์ตามสำหรับสตริง 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'));

สิ่งนี้ใช้ได้ดีสำหรับฉันโดยเฉพาะอย่างยิ่งเมื่อฉันแทรกค่าลงใน html ที่สร้างขึ้นด้วยวิธีนี้ แต่มีข้อ จำกัด มากมาย การเยื้องจะดี ไม่ต้องจัดการกับเครื่องหมายคำพูดซ้อนจะดีจริงๆและความใหญ่โตของมันทำให้ฉันรำคาญ

.push () เพื่อเพิ่มไปยังอาร์เรย์ใช้เวลานานหรือไม่? ดูคำตอบที่เกี่ยวข้องนี้:

( มีเหตุผลที่นักพัฒนา JavaScript ไม่ใช้ Array.push () หรือไม่ )

หลังจากดูที่การทดสอบการทำงาน (ตรงข้าม) เหล่านี้ดูเหมือนว่า. พุช () เป็นสิ่งที่ดีสำหรับสตริงอาเรย์ซึ่งไม่น่าจะเติบโตมากกว่า 100 รายการ - ฉันจะหลีกเลี่ยงการเพิ่มดัชนีที่มีขนาดใหญ่กว่าสำหรับอาเรย์


3

คุณสามารถใช้+=เพื่อเชื่อมสตริงของคุณดูเหมือนไม่มีใครตอบว่าซึ่งจะอ่านได้และยังเรียบร้อย ... บางสิ่งเช่นนี้

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

สามารถเขียนได้เช่นกัน

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

console.log(hello);

3

นอกจากนี้โปรดทราบว่าเมื่อขยายสตริงไปยังหลายบรรทัดโดยใช้เครื่องหมายทับขวาด้านหน้าที่จุดสิ้นสุดของแต่ละบรรทัดอักขระพิเศษใด ๆ (ส่วนใหญ่จะมีช่องว่างแท็บและความคิดเห็นที่เพิ่มโดยไม่ได้ตั้งใจ) หลังจากเครื่องหมายทับขวาข้างหน้าจะทำให้เกิดข้อผิดพลาดที่ไม่คาดคิด ออก

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

3

กรุณาเพื่อความรักของอินเทอร์เน็ตใช้การเรียงต่อสตริงและเลือกที่จะไม่ใช้โซลูชั่น ES6 สำหรับสิ่งนี้ ES6 ไม่ได้รับการสนับสนุนทั่วทั้งกระดานเช่นเดียวกับ CSS3 และเบราว์เซอร์บางตัวช้าที่จะปรับตัวเข้ากับการเคลื่อนไหว CSS3 ใช้จาวาสคริปต์ธรรมดาผู้ใช้ของคุณจะขอบคุณ

ตัวอย่าง:

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


3
ในขณะที่ฉันเห็นด้วยกับจุดของคุณฉันจะไม่เรียกจาวาสคริปต์ "ดี" ol
user151496

2

คุณต้องใช้ตัวดำเนินการเรียงต่อกัน '+'

<!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>

โดยการใช้\nซอร์สโค้ดของคุณจะมีลักษณะ -

นี้ 
 <br> คือ
 <br> หลาย
 <br> สตริง

โดยใช้การ<br>ส่งออกเบราว์เซอร์ของคุณจะมีลักษณะ -

นี้
คือ
หลาย
เชือก

1

ฉันคิดว่าวิธีแก้ปัญหานี้ควรทำงานใน IE, Chrome, Firefox, Safari, Opera -

ใช้ 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>

ใช้จาวาสคริปต์เพียว:

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

ไชโย !!


<xmp>เลิกใช้แล้ว มันอาจได้รับอนุญาตใน HTML แต่ไม่ควรใช้โดยผู้เขียนใด ๆ ดูstackoverflow.com/questions/8307846/…
Bergi

@Bergi คุณพูดถูก .. และใช้<pre>;กับ escapes ไม่ช่วยฉันแก้ปัญหา .. ฉันเจอปัญหาที่คล้ายกันในวันนี้และพยายามหาวิธีแก้ปัญหา .. แต่ในกรณีของฉันฉันพบวิธีหนึ่งที่ดีมากในการแก้ไขปัญหานี้โดย เอาท์พุทในความคิดเห็น html แทน <xmp> หรือแท็กอื่น ๆ ฮ่า ๆ. ฉันรู้ว่ามันไม่ใช่วิธีมาตรฐานในการทำเช่นนี้ แต่ฉันจะแก้ไขปัญหานี้ในเช้าวันพรุ่งนี้อีกแล้ว .. ไชโย !!
Aditya Hajare

น่าเสียดายที่แม้style="display:none"Chrome จะพยายามโหลด<img>ภาพที่กล่าวถึงในบล็อกตัวอย่าง
Jesse Glick

0

เพิ่งลองตอบคำถามแบบไม่ระบุชื่อและพบว่ามีเคล็ดลับเล็กน้อยที่นี่มันไม่ทำงานหากมีช่องว่างหลังแบ็กสแลช\
ดังนั้นวิธีการแก้ปัญหาต่อไปนี้ใช้ไม่ได้ -

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

แต่เมื่อพื้นที่ถูกลบมันทำงาน -

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

alert(x.test);​

หวังว่ามันจะช่วย !!


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