在JavaScript中创建多行字符串


Answers:


3313

更新:

ECMAScript 6(ES6)引入了一种新型的文字,即模板文字。它们具有许多功能,其中包括变量插值,但对于这个问题最重要的是,它们可以是多行的。

模板文字由反引号分隔:

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

(注意:我不主张在字符串中使用HTML)

浏览器支持还可以,但是您可以使用编译器来更好地兼容。


ES5原始答案:

Javascript没有here-document语法。但是,您可以转义文字换行符,该换行符很接近:

"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,您现在只需使用反引号即可创建多行字符串:

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的建议。除极旧的浏览器外,所有浏览器都支持反斜杠和换行符方法,并且将来会继续这样做以实现向后兼容性。唯一需要避免的情况是,如果需要确保在每行的末尾添加一个且仅一个换行符(或不添加任何换行符)(另请参见我对已接受答案的评论)。
马特·布朗

6
请注意,IE11,Firefox 31,Chrome 35或Safari 7不支持模板字符串。请参阅kangax.github.io/compat-table/es6
EricP 2014年

29
@MattBrowne谷歌的推荐已经由他们记录在案,按照原因的重要性排序:(1)每行开头的空格[在示例中,您不希望字符串中包含空格,但是在代码中看起来更好](2)斜线后的空格将导致棘手的错误[如果您用\ 而不是`\` 结束行,这很难注意到],并且(3)虽然大多数脚本引擎都支持,但它不是ECMAScript的一部分[即为什么使用非标准功能吗?]请记住,这是一个样式指南,该指南旨在使代码易于阅读+维护+调试:不仅“正确”。
ShreevatsaR

1
令人惊讶的是,这些年来,字符串连接仍然是最好/最安全/最合规的方式。模板文字(上面的答案)在IE中不起作用,转义行只是一团糟,您很快就会后悔
Tiago Duarte

1
发现旧版本的Android不支持反引号的困难方式,因此,如果您有使用webView的Android应用,则反引号会导致您的应用无法运行!
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 2011年

73
阵列模式更具可读性,应用程序的性能损失通常可以忽略不计。如性能测试所示,即使IE7每秒也可以执行数万次操作。
本杰明·阿特金

19
+1是一种优雅的替代方案,不仅可以在所有浏览器中以相同的方式工作,而且还可以面向未来。
帕维尔

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
  • Opera 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。正则表达式将需要更新为仅删除空格。您也可以使用字符串原型方法来执行此操作:

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

那肯定很棒。有人应该写这个.removeIndentation字符串方法...;)


232
什么!?创建并反编译将多行注释修改为多行字符串的函数?现在这是丑陋的。
fforw 2011年

4
jsfiddle.net/fqpwf可在Chrome 13和IE8 / 9中使用,但不适用于FF6。我不想这么说,但是我喜欢它,如果它可以成为每个浏览器的故意功能(这样它就不会消失),我会使用它。
詹森·克莱班

2
@ uosɐſ:要有意为之,必须符合规范;或被广泛使用,以至于浏览器制造商都不想删除此“偶然”功能。不过,感谢您的实验...尝试一些coffeescript。
–Jordão

1
a.toString()。substring(15,a.toString()。length-4)也可以工作,并且不需要扫描整个字符串(尽管很有可能,并且计数仍会对其进行另一次扫描。 。)
Lodewijk 2012年

2
非常方便。我将其用于(Jasmine)单元测试,但避免将其用于生产代码。
杰森


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()的。
凯文·考克斯

此解决方案似乎无法在Firefox中使用,也许这是浏览器的安全功能?编辑:没关系,它不仅不会对Firefox版本16.工作
比尔软件工程师

45
也要注意那些剥夺评论者的内容...:D
jondavidjohn

3
这就是为什么我们不能拥有美好的事物的原因。
Danilo M. Oliveira,

4
您可以在JavaScript领域中做一些奇怪的事情。虽然老实说,您永远不要使用此功能。
路加福音

88

令我惊讶的是,我没有看到它,因为它在我测试过的任何地方都可以使用,并且对于例如模板非常有用:

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

有人知道存在HTML但无法使用HTML的环境吗?


23
任何您不想将字符串放入单独和遥远的脚本元素中的地方。
罗德韦克2012年

9
有效的反对意见!这不是完美的。但是对于模板,这种分离不仅可以,而且甚至可以鼓励。
Peter V.Mørch'02

1
我更喜欢将超过80/120个字符的所有内容分割成多行,恐怕不仅仅是模板。我现在更喜欢'line1'+'line2'语法。它也是最快的(尽管这对于真正的大文本来说可以与之匹敌)。这是一个很好的技巧。
罗德韦克

27
实际上,这是HTML而不是Javascript:-/
CpILL 2012年

5
但是,可以用这种方式完成在javascript中获取多行字符串的任务
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的模板语言-仍来自受信任的来源,而不是来自表单提交,因此不会造成严重影响)。
2013年

这是唯一对我有效的从Java String创建多行javascript字符串变量的方法。
beginner_

4
如果字符串是HTML怎么办?
Dan Dascalescu 2014年

4
$('#UniqueID')。content()
mplungjan 2014年

1
@Pacerier我从Google以及其他网站上阅读的所有内容都表明,如今Google确实会索引display:none内容,这很可能是由于JavaScript样式的前端的流行。(例如,具有隐藏/显示功能的FAQ页面。)但是您需要小心,因为Google表示,如果隐藏的内容似乎旨在人为地提高您的SEO排名,他们会惩罚您。
加文

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('');

在性能方面,Slash串联(第一个)是最快的。

有关性能的更多详细信息,请参考此测试用例

更新:

借助ES2015,我们可以利用其模板字符串功能。有了它,我们只需要使用反引号来创建多行字符串

例:

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

11
我认为这是您对页面上已有的内容进行了五年的重新思考,但使用的方式更简洁。
RandomInsano 2014年

斜线连接不会在行首也包含空格吗?
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

24

我喜欢这种语法和倾向:

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

(但实际上不能视为多行字符串)


3
除了在前一行的末尾加上“ +”之外,我用它来使语句在下一行继续。您的方式确实使凹痕排列更均匀。
肖恩

@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在浏览器中使用的支持必须谨慎。
谭惠恩

3
@HueiTan Docs指出它也可以在浏览器中使用。有道理-就是Function.prototype.String()
mikemaccana

是的,但它说:“虽然它在浏览器中可以正常工作,但主要用于Node.js。使用时需要您自担风险。虽然它在浏览器中可以正常工作,但主要用于Node.js。风险自负。” (请小心XD)
Huei Tan

@HueiTanYep我读了那部分。但是Function.prototype.toString()非常稳定并且众所周知。
mikemaccana

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。您可以使用document.currentScript代替getElement ...
Orwellophile 2015年

1
chrome中未定义的“ you”用于osx
mplungjan

1
jsfiddle-fixed-我必须在控制台中全局定义了“ you”。现在可以使用(chrome / osx)。将注释添加到var的好处是,虽然函数对于类方法来说很酷,但是您不在函数上下文jsfiddle-function-heredoc中。无论如何,将其传递给replace {this:that}对象可能会更好。无论如何将疯狂的事情推到极限的乐趣:)
Orwellophile 2015年

1
忘记仇恨者。这是唯一正确的答案栏ES6。所有其他答案都需要连接,某种计算或转义。这实际上很酷,我将使用它作为向我正在从事的游戏添加文档的方式。只要此技巧未用于任何可能引起错误的东西(我可以看到有人会这样说:“ Semicolon,derp。让我们将注释放在下一行。”然后破坏代码。)但是,是这对我的业余爱好游戏真的很重要吗?不,我可以使用一些很酷的技巧。好答案。
托马斯·迪格南2015年

2
我从来没有足够的勇气在生产代码中使用这种技术,但是在单元测试中我经常使用它,在这种情况下,通常最简单的方法是将某个结构的值转储为(相当长的)字符串并将其与它应该是什么。
Ben McIntyre

10

总结起来,我已经尝试了用户javascript编程(Opera 11.01)中列出的2种方法:

因此,我为Opera用户JS用户推荐了一种工作方法。与作者所说的不同:

它不适用于Firefox或Opera;仅适用于IE,Chrome和Safari。

它确实在Opera 11中起作用。至少在用户JS脚本中。太糟糕了,我无法对单个答案发表评论或对答案进行投票,我会立即这样做。如果可能的话,请具有较高特权的人替我做。


这是我的第一个实际评论。我已经在2天前获得了upvote特权,所以我立即就上面提到的一个答案进行了投票。感谢所有支持我微不足道的帮助的人。
泰勒

感谢实际上支持此答案的每个人:我现在有足够的特权发表常规评论!再次感谢。
泰勒

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年更新:六年后:大多数人使用模块加载器,并且每个主模块系统都有加载模板的方式。它不是内联的,但是最常见的多行字符串类型是模板,并且无论如何模板通常都应该放在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 2015年

1
@tomByrer是的,观察很好。它仅适用于您不关心空格的字符串,例如HTML。
seo 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 2012年

2
不,这不对。宁可使用模板:$ .tmpl()(api.jquery.com/tmpl)或EJS(Embeddedjs.com/getting_started.html)等。否决票的原因之一是它实际上与有效的代码和使用方法相去甚远这可能会导致巨大的显示问题。
Sk8erPeter'3

我希望没有人在实践中使用此答案,但这是一个巧妙的想法
DCShannon

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变体中的multiline-string对象,在该对象中,您可以将模板放入另一个文件(可以合并到分发包中)。

您可以在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);

在这里更多参考


这个答案不仅很小,不完整而且格式不正确,而且绝对不会在以前的答案中添加任何内容。对其进行标记并希望将其删除。
维克多·施罗德


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

对不起,我的最新评论很抱歉,已编辑答案并添加了兼容性信息;)
Willem van der Veen '18

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()是否有原因?

在查看了这些(相反的)测试运行之后,看起来.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的速度也很慢。使用普通的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>;转义符一起使用不会对我的解决方案有帮助。.今天我遇到了类似的问题,试图找出解决方法。.但就我而言,我发现了一种非常好的解决方法,将输出放在html注释中,而不是<xmp>或任何其他标签中。大声笑。我知道这不是标准的方法,但是明天早上我会在这个问题上做更多工作。
Aditya Hajare

不幸的是,即使使用style="display:none"Chrome,它也会尝试加载<img>示例块中提到的所有图像。
Jesse Glick 2013年

0

刚刚尝试了Anonymous答案,发现这里有一个小窍门,如果反斜杠\
后面有空格,它就不起作用,因此以下解决方案不起作用-

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.