JavaScript에서 여러 줄 문자열 만들기


2610

Ruby에는 다음 코드가 있습니다. 이 코드를 JavaScript로 변환하고 싶습니다. JS의 동등한 코드는 무엇입니까?

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


동일한 방법으로 다른 방법으로 확인하십시오. 각 방법의 성능도 추가했습니다 stackoverflow.com/a/23867090/848841
— Vignesh Subramanian

답변:


3315

최신 정보:

ECMAScript 6 (ES6)에는 새로운 유형의 리터럴, 즉 템플릿 리터럴이 도입되었습니다 . 그것들은 다른 많은 것들과 다양한 보간법을 가지고 있지만, 가장 중요한 것은이 질문에 대해 여러 줄이 될 수 있습니다.

템플릿 리터럴은 백틱 으로 구분됩니다 .

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

(참고 : 문자열에서 HTML을 사용하는 것을 옹호하지 않습니다)

브라우저 지원은 가능 하지만 트랜스 파일러 를 사용 하여 호환성을 높일 수 있습니다.


원래 ES5 답변 :

Javascript에는 here-document 구문이 없습니다. 그러나 리터럴 개행을 피할 수 있습니다.

"foo \
bar"

231
경고 : 일부 브라우저는 계속해서 개행 문자를 삽입하지만 일부는 그렇지 않습니다.
— staticsan 2009

35
Visual Studio 2010은이 구문으로 인해 혼동되는 것 같습니다.
— jcollum

47
그것은에 지정된 @Nate ECMA-262 5 판의 섹션 7.8.4 및 전화 LineContinuation : "A 줄 끝 문자가의 일부를 제외하고, 문자열 리터럴에 표시 할 수 LineContinuation 빈 문자 시퀀스를 생성하는 원인 A와 올바른 방법. 문자열 리터럴의 문자열 값의 일부인 줄 종결 자 문자는 \ n 또는 \ u000A와 같은 이스케이프 시퀀스를 사용하는 것입니다. "
— 일부

16
브라우저가 일관성이없는 것으로 취급 할 때 왜이 작업을 수행해야하는지 모르겠습니다. 여러 줄에 걸친 "line1 \ n"+ "line2"는 충분히 읽을 수 있으며 일관된 동작을 보장합니다.
— SamStephens

11
IE11에서 지원하지 ... "브라우저 지원은 OK입니다"- OK하지
— 톰 Andraszek

1317

ES6 업데이트 :

첫 번째 답변에서 언급했듯이 ES6 / Babel을 사용하면 백틱을 사용하여 여러 줄 문자열을 만들 수 있습니다.

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

보간 변수는 백틱으로 구분 된 문자열과 함께 제공되는 인기있는 새로운 기능입니다.

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

이것은 단지 연결로 변환됩니다.

user.name + ' liked your post about strings'

원래 ES5 답변 :

Google의 JavaScript 스타일 가이드 는 줄 바꿈을 피하는 대신 문자열 연결을 사용하는 것이 좋습니다.

이 작업을 수행하지 마십시오 :

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의 권장 사항은 다음과 같은 이유로 중요하게 이미 문서화되어 있습니다. ] (2) 슬래시 뒤의 공백은 까다로운 오류를 초래합니다.` \ \`대신 줄을 끝내면 눈에 띄기가 어렵습니다.] (3) 대부분의 스크립트 엔진이이를 지원하지만 ECMAScript의 일부가 아닙니다. 비표준 기능을 사용 하시겠습니까?]이 코드는 스타일 가이드로, 코드를 읽기 + 유지 + 디버그하기 쉽게 만드는 것입니다.
— ShreevatsaR

1
몇 년이 지난 후에도 문자열 연결이 여전히 가장 안전하고 가장 적합한 방법입니다. 템플릿 리터럴 (답변 위)은 IE에서 작동하지 않으며 줄을 이스케이프하는 것은 곧 후회하게 될 혼란입니다
— Tiago Duarte

1
이전 버전의 Android가 백틱을 지원하지 않는 어려운 방법을 찾았으므로 webView를 사용하는 Android 앱이 있으면 백틱으로 인해 앱이 실행되지 않습니다!
— Michael Fever

684

패턴 text = <<"HERE" This Is A Multiline String HEREjs 사용할 수 없습니다 (좋은 펄 시절에 많이 사용하는 것을 기억합니다).

복잡하거나 긴 여러 줄 문자열을 감독하기 위해 때때로 배열 패턴을 사용합니다.

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
@BMiner : 1) "조기 최적화는 모든 악의 근원"-도널드 크 누스 (Donald 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
  • 오페라 9.50-12 (9가 아님)
  • Safari 4-6 (3 아님)
  • 크롬 1-45
  • Firefox 17-21 ( 16-이 아닌 )
  • Rekonq 0.7.0-0.8.0
  • Konqueror 4.7.4에서 지원되지 않습니다

그래도 축소기를 조심하십시오. 주석을 제거하는 경향이 있습니다. 를 들어 YUI 압축기 , 코멘트로 시작/*! 보존됩니다 (내가 사용하는 것과 같은).

실제 해결책은 CoffeeScript 를 사용하는 것이라고 생각합니다 .

ES6 업데이트 : 주석이있는 함수를 만들고 주석에서 toString을 실행하는 대신 backtick를 사용할 수 있습니다. 공간을 제거하기 위해 정규식을 업데이트해야합니다. 이를 위해 문자열 프로토 타입 방법을 사용할 수도 있습니다.

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ɐſ : 의도적으로하기 위해서는 사양에 있어야합니다. 브라우저 제조업체는이 "우발적 인"기능을 제거하고 싶지 않을 것입니다. 실험 해 주셔서 감사합니다 ... 커피 스크립트를 사용해보십시오.
— Jordão

1
a.toString (). substring (15, a.toString (). length-4)도 작동하며 전체 문자열을 스캔 할 필요가 없습니다 (가장 가능성이 높고 계산으로 인해 다른 스캔이 발생하더라도). .)
— Lodewijk

2
매우 편리합니다. (Jasmine) 단위 테스트에 사용하고 있지만 프로덕션 코드에서는 사용하지 않습니다.
— Jason

207

당신은 이것을 할 수 있습니다 ...

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

첫 번째 예는 위대하고 단순합니다. 브라우저가 백 슬래시를 이스케이프 문자 및 여러 줄 문자로 처리하는 방법을 잘 모르겠 기 때문에 \ 접근 방식보다 훨씬 낫습니다.
— Matt K


e4x.js 는 미래를위한 훌륭한 솔루션입니다.
— Paul Sweatte

139

나는 다중 줄 문자열의이 지 미식 리깅 방법을 생각해 냈습니다. 함수를 문자열로 변환하면 함수 내부의 주석도 반환되므로 여러 줄 주석 / ** /를 사용하여 주석을 문자열로 사용할 수 있습니다. 끝을 다듬어야하고 줄이 있습니다.

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
이것은 절대적으로 끔찍합니다. 공백이 얼마나 정확한지 잘 모르기 때문에 정규식 일치를 수행해야 할 수도 있습니다 toString().
— Kevin Cox

이 솔루션은 firefox에서 작동하지 않는 것 같습니다. 아마도 브라우저의 보안 기능일까요? 편집 : 신경 끄시 고, 그것은 단지 파이어 폭스 버전 (16)이 작동하지 않습니다
— 빌 소프트웨어 엔지니어

45
주석을 제거하는
— 축소 기에도

3
이것이 우리가 좋은 것을 가질 수없는 이유입니다.
— Danilo M. Oliveira

4
자바 스크립트 땅에서 이상한 일을 할 수 있습니다. 모든 정직에도 불구하고 이것을 사용해서는 안됩니다.
— Luke

88

나는 그것을 보지 못한 것에 놀랐다. 왜냐하면 그것이 테스트 한 모든 곳에서 작동하기 때문에 템플릿과 같이 매우 유용하다.

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

HTML이 있지만 작동하지 않는 환경을 아는 사람이 있습니까?


23
어딘가에서 문자열을 분리되고 먼 스크립트 요소에 넣고 싶지 않습니다.
— Lodewijk

9
유효한 이의 제기! 완벽하지 않습니다. 그러나 템플릿의 경우 이러한 분리는 괜찮을뿐만 아니라 권장됩니다.
— 피터 V. Mørch

1
80/120자를 넘는 모든 문자를 여러 줄로 나누는 것을 선호합니다. 단순한 템플릿 이상의 것이 아닙니다. 이제 'line1'+ 'line2'구문을 선호합니다. 그것은 또한 가장 빠릅니다 (실제로 큰 텍스트를 위해 경쟁 할 수도 있지만). 그래도 좋은 속임수입니다.
— Lodewijk

27
실제로, 이것은 자바 스크립트가 아닌 HTML입니다 :-/
— CpILL

5
그러나 자바 스크립트에서 여러 줄 문자열을 얻는 작업은 다음과 같이 수행 할 수 있습니다.
— Davi Fiamenghi

52

div를 출력하고 숨기고 필요할 때 jQuery로 div id를 호출 하여이 문제를 해결했습니다.

예 :

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

그런 다음 문자열을 가져와야 할 때 다음 jQuery를 사용합니다.

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

어떤 텍스트를 여러 줄로 반환합니다. 내가 전화하면

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

나는 얻다:

여기에 이미지 설명을 입력하십시오


2
감사합니다! 내가 찾은 유일한 대답은 내 인코딩을 할 기회없이 작은 따옴표와 큰 따옴표를 코드에 직접 삽입 할 수있는 알 수없는 문자열을 포함하는 내 문제를 해결하는 유일한 대답입니다. (여전히 양식 제출이 아닌 신뢰할 수있는 소스에서 JS를 작성하는 템플릿 언어에서 제공되므로 완전히 변경되지는 않습니다.)
— octern

이것은 실제로 Java String에서 여러 줄 자바 스크립트 문자열 변수를 만드는 데 효과적이었습니다.
— beginner_

4
문자열이 HTML이면 어떻게 되나요?
— Dan Dascalescu

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

1
@Pacerier Google과 다른 사이트에서 읽은 모든 display:none내용 은 현재 Google이 JavaScript 스타일의 프론트 엔드의 인기로 인해 콘텐츠를 색인화한다고 말합니다 . (예를 들어, 숨기기 / 표시 기능이있는 FAQ 페이지) 숨겨진 컨텐츠가 SEO 순위를 인위적으로 부 풀리게 설계 한 것으로 보이는 경우 Google에서이를 처벌 할 수 있으므로 Google은 조심해야한다고 말합니다.
— Gavin

31

이것을 달성하는 여러 가지 방법이 있습니다

1. 슬래시 연결

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

2. 규칙적인 연결

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

3. 배열 결합 연결

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

현명한 성능, 슬래시 연결 (첫 번째)이 가장 빠릅니다.

이 테스트 사례를 참조하십시오 성능에 대한 자세한 내용은

최신 정보:

ES2015를 사용하면 템플릿 문자열 기능을 활용할 수 있습니다. 그것으로, 우리는 멀티 라인 문자열을 만들기 위해 백 틱을 사용해야합니다.

예:

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

11
5 년 동안 이미 페이지에있는 내용을 정리했지만 더 깔끔하게 정리 한 것 같습니다.
— 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

또한 당신이 그들을 사용하는 경우에도 아약스 쿼리. xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");JS에서 주석을 잘못 입력하는 것 외에 다른 문제가 있다는 것을 기억하지 못하는 헤더를 변경하려고 할 수 있습니다 . 문제가없는 공간.
— jpfreire

24

나는이 구문과 indendation을 좋아한다 :

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

(그러나 실제로 여러 줄 문자열로 간주 될 수는 없습니다)


3
나는 앞줄의 끝에 '+'를 두는 것을 제외하고는 이것을 사용한다. 당신의 방법은 들여 쓰기를보다 균등하게 정렬합니다.
— Sean

@Sean 나도 이것을 사용하고, 나는 추가 된 각 줄의 시작 부분에 '+'를 붙이고 마지막 ';'을 선호합니다. 새로운 줄에, cuz 나는 더 '올바른'것을 발견했다.
— AgelessEssence 5

7
맨 앞에 +를 넣으면 시퀀스의 첫 번째 / 마지막 행일 때 다른 행을 편집하지 않고도 해당 행을 주석 처리 할 수 ​​있습니다.
— moliad December

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 Docs는 브라우저에서도 작동합니다. 어떤 의미가 있습니다-그것은 단지 Function.prototype.String()입니다.
— mikemaccana

"하지만 브라우저에서 제대로 작동하지만 주로 Node.js에서 사용하기위한 것입니다. 위험 부담으로 사용하십시오. 브라우저에서 제대로 작동하는 동안 주로 Node.js에서 사용하기위한 것입니다. "당신의 책임하에." (그냥 조심 XD)
— Huei Tan

@HueiTanYep 나는 그 부분을 읽었다. 그러나 Function.prototype.toString ()은 꽤 안정적이며 잘 알려져 있습니다.
— mikemaccana

1
적어도 중간에 모든 쓰레기없이 멀티 라인을 달성하기 때문에 가장 좋은 대답입니다 (처음에는 쓰레기가 처리 할 수 ​​있습니다).
— Damien Golding

14

Downvoters :이 코드는 정보 용으로 만 제공됩니다.

이것은 Mac의 Fx 19 및 Chrome 24에서 테스트되었습니다.

데모

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. getElement 대신 document.currentScript 를 사용할 수 있습니다 ...
— Orwellophile

1
OSX를위한 크롬에 "당신"을 정의되지 않음
— mplungjan

1
jsfiddle-fixed- 내 콘솔에서 "당신"을 전역 적으로 정의 했어야합니다. 지금 작동합니다 (chrome / osx). var에 주석을 추가하는 것에 대한 좋은 점은 함수 컨텍스트에 있지 않다는 것입니다. jsfiddle-function-heredoc 는 함수가 클래스 메소드에 멋지지만. 어쨌든 교체 {this : that} 객체를 전달하는 것이 좋습니다. 어쨌든 한계에 미친 무언가를 밀어 재미 :)
— Orwellophile

1
증오자를 잊어 버리십시오. 이것은 유일한 정답 막대 ES6입니다. 다른 모든 답변에는 연결, 일종의 계산 또는 탈출이 필요합니다. 이것은 실제로 매우 시원하며 취미로 작업중 인 게임에 문서를 추가하는 방법으로 사용할 것입니다. 이 트릭이 버그를 유발할 수있는 어떤 것에도 사용되지 않는 한 ( "Semicolon, derp. 다음 줄에 주석을 달자"라고 말하면 코드가 깨집니다.) 내 취미 게임에서 정말 큰 일입니까? 아니요, 유용한 유용한 방법을 사용할 수 있습니다. 좋은 대답입니다.
— Thomas Dignan

2
나는이 코드를 생산 코드에서 사용하기에 결코 용감한 적이 없었지만, 그것을 사용하는 곳은 단위 테스트에서 많이 사용됩니다. 여기서 일부 구조의 값을 (quite long) 문자열로 덤프하고 비교하는 것이 가장 쉽습니다. 그게 뭐야?
— Ben McIntyre 2019

10

요약하면 사용자 자바 스크립트 프로그래밍 (Opera 11.01)에 나열된 두 가지 접근법을 시도했습니다.

따라서 Opera 사용자 JS 사용자에게는 작동 방식을 권장합니다. 저자의 말과 달리 :

파이어 폭스 나 오페라에서는 작동하지 않습니다. IE, 크롬 및 사파리에서만 가능합니다.

Opera 11에서는 작동합니다. 최소한 사용자 JS 스크립트에서는 작동합니다. 안타깝게도 개별 답변에 댓글을 달거나 답변을 찬성 할 수 없습니다. 즉시 처리하겠습니다. 가능하다면, 더 높은 특권을 가진 사람이 저를 위해 그것을하십시오.


이것은 나의 첫 번째 실제 의견입니다. 나는 이틀 전에 공감 권한을 얻었으므로 위에서 언급 한 답변을 즉시 공감했습니다. 나의 연약한 도움을 시도한 사람에게 감사합니다.
— 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

2015 년 업데이트 : 6 년 후 : 대부분의 사람들은 모듈 로더를 사용하고 기본 모듈 시스템에는 각각 템플릿을로드하는 방법이 있습니다. 인라인은 아니지만 가장 일반적인 유형의 여러 줄 문자열은 템플릿이며 템플릿은 일반적으로 JS 외부에 보관해야합니다 .

require.js : '텍스트 필요'.

template.html의 여러 줄 템플릿 과 함께 require.js 'text'플러그인 사용

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 ) 등의 템플릿을 사용해야합니다. 다운 보트의 한 가지 이유는 실제로 유효한 코드와 거리가 멀고 사용하기 때문입니다. 이로 인해 큰 디스플레이 문제가 발생할 수 있습니다.
— Sk8erPeter


7

TypeScript (JavaScript SuperSet)를 사용할 수 있으며 여러 줄 문자열을 지원하며 오버 헤드없이 순수한 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()'

많은 레거시 코드가있는 경우 정리를 위해 TypeScript에서 일반 JavaScript 변형을 사용할 수도 있습니다.

interface externTemplates
{
    myString:string;
}

declare var templates:externTemplates;

alert(templates.myString)

템플릿을 다른 파일 (번들에 병합 할 수 있음)에 넣는 일반 JavaScript 변형의 여러 줄 문자열 객체를 사용할 수 있습니다.

http://www.typescriptlang.org/Playground 에서 TypeScript를 사용해 볼 수 있습니다


iPad / Safari 제한에 대한 문서가 있습니까? - MDN은 모든 좋은 생각하는 것 같다 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
— Campbeln

@Campbeln : CoWorker가이 코드를 사용했습니다. 직접 테스트하지 않았습니다. 또한 iPad / Safari 버전에 따라 달라질 수 있습니다.
— Stefan Steiger

6

ES6 방식은 템플릿 리터럴을 사용하는 것입니다.

const str = `This 

is 

a

multiline text`; 

console.log(str);

여기에 더 많은 참조


이 답변은 작고 불완전하며 형식이 잘못되었을뿐 아니라 이전 답변에 전혀 아무것도 추가하지 않습니다. 플래그를 지정하고 삭제를 원합니다.
— Victor Schröder


4

Javascrips에서 여러 줄로 된 문자열을 만드는 가장 쉬운 방법은 백틱 (``)을 사용하는 것입니다. 이를 통해 변수를 삽입 할 수있는 여러 줄 문자열을 만들 수 있습니다.${variableName} .

예:

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

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

my age is: ${age}
`;

console.log(multilineString);

호환성 :

  • ES6// 에서 소개되었습니다es2015
  • 이제 모든 주요 브라우저 공급 업체에서 기본적으로 지원합니다 (인터넷 탐색기 제외).

여기에서 Mozilla 문서의 정확한 호환성 확인


이제 모든 최신 브라우저와 호환됩니까? 아니면 여전히이 구문을 지원하지 않는 브라우저가 있습니까?
— cmpreshn

내 극단적 인 늦은 의견에 대해 죄송합니다, 답변 추가 호환성 정보를 편집;)
— Willem van der Veen

3

문자열 연결에 대한 내 배열 기반 조인 버전 :

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 ()를 사용하지 않는 이유가 있습니까? )

이 (반대) 테스트 실행을 살펴본 후 .push ()는 100 개가 넘지 않는 문자열 배열에 적합합니다. 더 큰 배열에 대해서는 인덱스 추가를 선호하지 않습니다.


3

+=문자열을 연결 하는 데 사용할 수 있으며 아무도 대답하지 않은 것처럼 보입니다.

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

로 쓸 수도 있습니다

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

console.log(hello);

3

또한 각 줄의 끝에서 백 슬래시를 사용하여 문자열을 여러 줄로 확장하면 슬래시 뒤에 추가 문자 (대부분 공백, 탭 및 주석이 실수로 추가됨)가 예기치 않은 문자 오류를 일으켜 발견하는 데 1 시간이 걸렸습니다. 밖

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

3

인터넷 사용 문자열 연결을 좋아하고 ES6 솔루션을 사용하지 않도록 선택하십시오. ES6는 CSS3 및 특정 브라우저가 CSS3 동작에 느리게 적응하는 것처럼 보드 전체에서 지원되는 것은 아닙니다. 일반 ol 'JavaScript를 사용하면 최종 사용자가 감사합니다.

예:

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>브라우저 출력 을 사용 하면 다음과 같이 보입니다.

이
이다
여러 줄
끈.

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>;탈출과 함께 사용 하면 내 솔루션에 도움이되지 않습니다. 오늘 비슷한 문제가 발생하여 해결 방법을 찾으려고 노력했지만. <xmp> 또는 다른 태그 대신 html 주석에 출력을 넣습니다. lol. 나는 이것이 표준 방법이 아니라는 것을 알고 있지만 내일 아침에이 문제를 해결해 나갈 것입니다.
— 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.