JavaScriptで複数行の文字列を作成する


2611

Rubyには次のコードがあります。このコードをJavaScriptに変換したいと思います。JSの同等のコードは何ですか?

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


同じことを達成するために、さまざまな方法でこれを確認してください。各メソッドのパフォーマンスも追加しましたstackoverflow.com/a/23867090/848841
Vignesh Subramanian

回答:


3318

更新:

ECMAScript 6(ES6)では、新しいタイプのリテラル、つまりテンプレートリテラルが導入されています。彼らは多くの機能、とりわけ変数補間を持っていますが、この質問にとって最も重要なのは、複数行になる可能性があることです。

テンプレートリテラルはバッククォートで区切られています

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

(注:文字列でHTMLを使用することは推奨していません)

ブラウザのサポートは問題ありませんが、トランスパイラを使用して互換性を高めることができます。


元のES5の回答:

Javascriptにはヒアドキュメントの構文はありません。ただし、文字通りの改行はエスケープできます。

"foo \
bar"

231
警告:一部のブラウザーは継続的に改行を挿入しますが、挿入しないブラウザーもあります。
staticsan 2009

35
Visual Studio 2010もこの構文に混乱しているようです。
jcollum 2011

47
それはで指定され@Nate ECMA-262第5版のセクション7.8.4と呼ばれるLineContinuation:「行終端文字がの一部として以外、文字列リテラルに表示することはできませんLineContinuation空の文字列を生成する原因aに正しい方法。文字列リテラルの文字列値の一部となる行終了文字は、\ nや\ u000Aなどのエスケープシーケンスを使用することです。
いくつかの

16
ブラウザーが一貫性のない扱いをするときに、なぜこれを行うのかわかりません。「line1 \ n」+「line2」は複数行にわたって十分に読みやすく、一貫した動作が保証されます。
SamStephens 2013年

11
「ブラウザのサポートは問題ありません」... IE11でサポートされていません-問題ありません
Tom 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の推奨事項が理解できません。非常に古いブラウザを除くすべてのブラウザは、バックスラッシュとそれに続く改行アプローチをサポートしており、後方互換性のために今後もサポートします。これを避ける必要があるのは、各行の終わりに改行が1つだけ(または改行なし)追加されていることを確認する必要がある場合のみです(承認された回答に関する私のコメントも参照)。
Matt Browne 2013

6
IE11、Firefox 31、Chrome 35、またはSafari 7ではテンプレート文字列がサポートされていないことに注意してください。kangax.github.io/ compat
table / es6を

29
@MattBrowne Googleの推奨事項は、理由の重要性の高い順に、すでに文書化されています:(1)各行の先頭の空白[例では、文字列にその空白を入れたくないが、コードでは見栄えが良い](2)スラッシュの後の空白は、トリッキーなエラーになります[ \ `\`の代わりに行を終了すると、気づきにくい]および(3)ほとんどのスクリプトエンジンはこれをサポートしますが、ECMAScriptの一部ではありません[理由非標準の機能を使用しますか?]これは、コードを読みやすく、維持し、デバッグしやすくするためのスタイルガイドであることを忘れないでください。
ShreevatsaR 2016

1
これらすべての年の後に、文字列の連結がこれに対応するための最良/安全/最も準拠した方法であることは驚くべきことです。テンプレートリテラル(回答の上)がIEで機能せず、行をエスケープするのはごちゃごちゃしていることです
Tiago Duarte

1
古いバージョンのAndroidがバックティックをサポートしていないという難しい方法を発見したので、webViewを使用するAndroidアプリがある場合、バックティックが原因でアプリが実行されません。
マイケルフィーバー

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でも1秒あたり数万の操作を実行できます。
Benjamin Atkin

19
+1は、すべてのブラウザーで同じように機能するだけでなく、将来も使用できるエレガントな代替手段です。
Pavel

26
@KooiIncテストは、作成済みの配列から開始され、結果が歪んでしまいます。あなたは、配列の初期化を追加する場合は、ストレート連結は高速ですjsperf.com/string-concat-without-sringbuilder/7参照くださいstackoverflow.com/questions/51185/...改行のためのトリックとして、それはOKかもしれないが、それは間違いです必要以上の作業を行う
Juan Mendes 2013

9
@BMiner:1)「時期尚早な最適化がすべての悪の根源」-ドナルドクヌース、および2)「読みやすさ」は見る人の目にある
ポールベネット

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-2116-ではない
  • Rekonq 0.7.0-0.8.0
  • Konqueror 4.7.4ではサポートされていません

ただし、ミニファイアには注意してください。コメントを削除する傾向があります。YUIコンプレッサー、で始まるコメント/*!(私が使用したものなど)が保持されます。

実際の解決策は、CoffeeScriptを使用することだと思います。

ES6の更新:コメント付きの関数を作成し、コメントに対してtoStringを実行する代わりに、バックティックを使用できます。正規表現は、スペースのみを削除するように更新する必要があります。これを行うための文字列プロトタイプメソッドを使用することもできます。

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ɐſ:意図的であるためには、仕様に含まれている必要があります。または広く使用されているため、ブラウザメーカーはこの「偶発的な」機能を削除したくありません。でも実験してくれてありがとう...コーヒースクリプトを試してみてください。
ジョルダン

1
a.toString()。substring(15、a.toString()。length-4)も機能し、文字列全体をスキャンする必要はありません(ほとんどの場合それが実行され、カウントすると、とにかく別のスキャンになります。 。)
Lodewijk 2012年

2
非常に便利です。(ジャスミン)単体テストに使用していますが、製品コードには使用しません。
Jason

207

あなたはこれを行うことができます...

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

最初の例は素晴らしくてシンプルです。ブラウザがバックスラッシュをエスケープ文字および複数行文字として処理する方法がわからないため、\アプローチよりもはるかに優れています。
Matt K


e4x.jsは将来性のある優れたソリューションになるでしょう
Paul Sweatte 2013年

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では機能しないようですが、おそらくブラウザのセキュリティ機能ですか?編集:気にしないでください。Firefoxバージョン16では機能しません
ビルソフトウェアエンジニア

45
コメントを取り除くミニファイアにも注意してください...:D
jondavidjohn 2013年

3
これが私たちが良いものを手に入れることができない理由です。
Danilo M. Oliveira

4
あなたはjavascriptの土地でいくつかの奇妙なことをすることができます。正直なところ、これは絶対に使用しないでください。
ルーク、

88

私がこれをテストしたすべての場所で機能し、テンプレートなどに非常に役立つので、これが表示されなかったことに驚いています。

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

HTMLはあるが動作しない環境を知っている人はいますか?


23
文字列を別の遠方のスクリプト要素に配置したくない場所。
Lodewijk 2012年

9
有効な反対意見!それは完璧ではありません。しかし、テンプレートの場合、その分離は問題ないだけでなく、おそらく推奨されます。
PeterV.Mørch12年

1
私は80/120文字を超えるすべてを複数行に分割することを好みます。これは単なるテンプレートではありません。私は今 'line1' + 'line2'構文を好みます。また、これは最速です(ただし、これは非常に大きなテキストの場合には匹敵する可能性があります)。それは素晴らしいトリックですが。
Lodewijk

27
実際、これはJavascriptではなくHTMLです:-/
CpILL

5
ただし、JavaScriptで複数行の文字列を取得するタスクは、この方法で行うことができます
Davi Fiamenghi 2013

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を作成するテンプレート言語から来ています-フォームの送信ではなく、信頼できるソースからのものであるため、まったく気になりません)。
オクターン2013年

これは、Java Stringから複数行のJavaScript文字列変数を作成するために実際に機能した唯一の方法でした。
beginner_

4
文字列がHTMLの場合はどうなりますか?
Dan Dascalescu、2014年

4
$( '
#UniqueID

1
@Pacerier Googleや他のサイトから私が読んだすべてのことは、現在Googleはdisplay:noneコンテンツをインデックスに登録していると言っていますが、これはおそらくJavaScriptスタイルのフロントエンドの人気によるものです。(たとえば、非表示/表示機能のあるFAQページ。)ただし、非表示のコンテンツがSEOランキングを人為的に膨らませるために設計されているように見える場合、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 14

スラッシュ連結には行頭の空白も含まれませんか?
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 2015年

これをinnerText iso innerHTMLで使用していますが、空白が保持されていることを確認するにはどうすればよいですか?
David Nouls、2015

また、それらを使用している場合のajaxクエリ。私がxhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");覚えていないヘッダーを変更してみてください。JSでのコメントの誤入力以外の問題が発生します。問題のないスペース。
jpfreire 2015年

24

私はこの構文とインデンションが好きです:

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

(しかし、実際には複数行の文字列と見なすことはできません)


3
前の行の最後に「+」を置くことを除いて、これを使用して、ステートメントが次の行に続くことを明確にします。しかし、あなたの方法はインデントをより均等に並べます。
Sean

@Sean私もこれを使用していますが、追加された各新しい行の先頭に「+」を置き、最後の「;」を付けることを好みます。新しい行で、私はそれがより「正しい」とわかりました。
AgelessEssence 2013年

7
先頭に+を付けると、シーケンスの最初/最後の行のときに他の行を編集しなくても、その行をコメント化できます。
moliad 2013

3
視覚的には次の行が継続であることを知るために行の最後までスキャンする必要がないので、私も前の+を好みます。
Daniel Sokolowski、2014年

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 2014

3
@HueiTan Docsは、ブラウザでも機能すると述べています。それは理にかなっている-それはただFunction.prototype.String()です。
mikemaccana 2014

ya氏は、「ブラウザでは正常に動作しますが、主にNode.jsでの使用を目的としています。自己責任で使用してください。ブラウザで正常に動作しますが、主にNode.jsでの使用を目的としています。ご自身の責任で。" (XDに注意してください)
Tan

@HueiTanYepその部分を読んだ。しかし、Function.prototype.toString()はかなり安定していてよく知られています。
mikemaccana 2014

1
少なくとも途中ですべてのゴミがないマルチラインを実現するため、私にとって最良の答えです(最初と最後のゴミは処理できます)。
Damien Golding 2014

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の

1
jsfiddle-fixed-コンソールで「あなた」をグローバルに定義していたに違いありません。現在動作します(chrome / osx)。varにコメントを追加することの良い点は、関数のコンテキストではなく、jsfiddle-function-heredocであるということですが、関数のメソッドはクラスメソッドにとってクールです。とにかく、それをreplace {this:that}オブジェクトに渡す方が良いでしょう。とにかくクレイジーなものを限界まで押し込むのは楽しい:)
Orwellophile

1
憎しみを忘れてください。これが唯一の正解ES6です。他のすべての答えには、連結、ある種の計算、またはエスケープが必要です。これは実際にはかなりクールで、趣味で取り組んでいるゲームにドキュメントを追加する方法として使用します。このトリックがバグを引き起こす可能性のあるものに使用されない限り(誰かが「セミコロン、derp。次の行にコメントを付けてみましょう。」と表示され、それによってコードが破損します。)しかし、それは私の趣味のゲームで本当に大したことですか?いいえ、私は便利な何かのためにクールなトリックを使用できます。すばらしい答えです。
Thomas Dignan 2015

2
このテクニックを製品コードで使用するのに十分な勇気はありませんでしたが、それを頻繁に使用するのは単体テストであり、多くの場合、構造体の値を(かなり長い)文字列としてダンプして比較するのが最も簡単です。それがどうあるべきか
Ben McIntyre

10

要約すると、ユーザーJavaScriptプログラミング(Opera 11.01)でここにリストされている2つのアプローチを試しました。

したがって、OperaユーザーのJSユーザーには実用的なアプローチをお勧めします。著者が言っていたのとは異なり:

Firefoxやオペラでは機能しません。IE、Chrome、Safariのみ。

Opera 11では機能します。少なくともユーザーのJSスクリプトでは機能します。残念ながら、個々の回答にコメントしたり、回答に賛成投票したりすることはできません。すぐに回答します。可能であれば、より高い権限を持つ誰かが私のためにそれをしてください。


これが私の最初の実際のコメントです。私は2日前に賛成投票の特権を得たので、私は上記の1つの回答をすぐに反対票を投じました。私の微力な支援に賛成してくれた人に感謝します。
タイラー

この回答に実際に賛成してくれた皆さんに感謝します。今では通常のコメントを投稿するのに十分な権限があります!もう一度ありがとう。
タイラー

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:「テキストが必要」。

require.js 'text'プラグインを使用し、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など、空白を気にしない文字列にのみ適しています。
2015


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)などのテンプレートを使用する必要があります。ダウン投票の理由の1つは、有効なコードとこれにより、表示に大きな問題が発生する可能性があります。
Sk8erPeter 2012年

私は実際にこの答えを誰も使用しないことを願っていますが、それは
すばらしい

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バリアントの複数行ストリングオブジェクトを使用して、テンプレートを別のファイル(バンドルにマージできます)に配置できます。

TypeScriptはhttp://www.typescriptlang.org/Playgroundで試すことができ
ます


iPad / Safariの制限に関するドキュメントはありますか?- MDNは、それはすべて良いことだと考えているようだdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Campbeln

@Campbeln:CoWorkerが教えてくれました(彼はコードを使用しました)。自分でテストしていません。iPad / Safariのバージョンにも依存する可能性があります-おそらく依存します。
Stefan Steiger 2017

6

ES6でこれを行うには、テンプレートリテラルを使用します。

const str = `This 

is 

a

multiline text`; 

console.log(str);

詳細はこちら


この回答は小さく、不完全であり、フォーマットが悪いだけでなく、以前の回答にまったく何も追加していません。フラグを立ててホッピングを削除します。
VictorSchröder19年

5

ES6では、バックティックを使用して複数行の文字列を指定できます。これはテンプレートリテラルと呼ばれます。このような:

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

バックティックの使用はNodeJSで機能し、Chrome、Firefox、Edge、Safari、Operaでサポートされています。

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


4

Javascripsで複数行の文字列を作成する最も簡単な方法は、バックティック( ``)を使用することです。これにより、で変数を挿入できる複数行の文字列を作成できます${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ドキュメントの正確な互換性をこちらで確認してください


これは最近のすべてのブラウザと互換性がありますか?それとも、この構文をまだサポートしていないブラウザがありますか?
cmpreshn 2018

私の極端な遅いコメントで申し訳ありませんが、回答を編集して互換性情報を追加しました;)
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の動きへの対応が遅い特定のブラウザーと同様に、全面的にサポートされているわけではありません。プレーンオールJavaScriptを使用してください。エンドユーザーに感謝します。

例:

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


3
私はあなたの意見に同意しますが、javascriptを「良い」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>

純粋なJavascriptの使用:

<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コメントに出力を配置します。笑。これを行うための標準的な方法ではないことはわかっていますが、この問題については、明日の朝に取り組んでいきます。
Aditya Hajare 2013年

残念ながら、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.