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.