在JavaScript中创建多行字符串

问题描述 投票:2244回答:36

我在Ruby中有以下代码。我想将此代码转换为JavaScript。什么是JS中的等效代码?

text = <<"HERE"
This
Is
A
Multiline
String
HERE
javascript string multiline heredoc
36个回答
2813
投票

Update:

ECMAScript 6(ES6)引入了一种新的文字,即template literals。它们具有许多特征,可变插值等,但最重要的是,对于这个问题,它们可以是多线的。

模板文字由反引号分隔:

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

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

Browser support is OK,但你可以使用transpilers更兼容。


Original ES5 answer:

Javascript没有here-document语法。但是,你可以逃避文字换行符:

"foo \
bar"

27
投票

使用脚本标签:

  • 将包含多行文字的<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>

24
投票

我喜欢这种语法和缩进:

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

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


17
投票

有这个图书馆使它美丽:

https://github.com/sindresorhus/multiline

Before

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

After

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

13
投票

Downvoters:此代码仅供参考。

这已经在Mac上的Fx 19和Chrome 24中进行了测试

DEMO

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>
    </li>
EOF*/
// note the script tag here is hardcoded as the FIRST tag 
new_comment=document.currentScript.innerHTML.split("EOF")[1]; 
alert(new_comment.replace('$text','Here goes some text'));

10
投票

总结一下,我在用户javascript编程中尝试了2种方法(Opera 11.01):

所以我推荐Opera用户JS用户的工作方法。与作者所说的不同:

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

它可以在Opera 11中运行。至少在用户JS脚本中。太糟糕了,我不能评论个别答案或提出答案,我会马上做。如果可能,有特权的人请为我做。


9
投票

更新于2015年:现在已经六年了:大多数人使用模块加载器,主模块系统各自都有加载模板的方法。它不是内联的,但最常见的多行字符串类型是模板,并且模板通常应该保留在JS之外。

require.js:'require text'。

使用require.js 'text' plugin,在template.html中使用多行模板

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

NPM / browserify:'brfs'模块

Browserify uses a 'brfs' module加载文本文件。这实际上会将您的模板构建到捆绑的HTML中。

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

简单。


9
投票

如果您愿意使用转义换行符,可以很好地使用它们。它看起来像带有页面边框的文档。


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>

8
投票

我对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();

8
投票

javascript中的等价物是:

var text = `
This
Is
A
Multiline
String
`;

这是specification。请参阅此page底部的浏览器支持。这里也有一些examples


1222
投票

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's JavaScript style guide建议使用字符串连接而不是转义换行符:

不要这样做:

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

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


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


5
投票

在Javascript中制作多行字符串的最简单方法是使用反引号(``)。这允许您创建多行字符串,您可以在其中使用qazxsw poi插入变量。

例:

${variableName}

兼容性:

  • 它是在qazxsw poi // qazxsw poi中引入的
  • 它现在由所有主要浏览器供应商本地支持(Internet Explorer除外)

let name = 'Willem'; let age = 26; let multilineString = ` my name is: ${name} my age is: ${age} `; console.log(multilineString);


3
投票

我的基于数组的字符串concat连接版本:

ES6

这对我来说效果很好,特别是因为我经常在以这种方式构造的html中插入值。但它有很多局限性。缩进会很好。不必处理嵌套的引号会非常好,只是它的庞大性让我感到烦恼。

添加到阵列的.push()是否占用了大量时间?看到这个相关的答案:

(Qazxswpoi)

在查看这些(相反的)测试运行之后,看起来.push()对于字符串数组来说是好的,它不会超过100个项目 - 我会避免它支持更大数组的索引添加。


3
投票

你可以使用es2015连接你的字符串,似乎没有人回答,这将是可读的,也很整洁...像这样的东西

Check exact compatibility in Mozilla docs here

也可以写成

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

3
投票

另外请注意,当在每行末尾使用正向反斜杠将字符串扩展到多行时,在反向反斜杠之后任何多余的字符(大多数是空格,制表符和错误添加的注释)都会导致意外的字符错误,我花了一个小时才找到出

Is there a reason JavaScript developers don't use Array.push()?

3
投票

请为互联网的爱使用字符串连接,并选择不使用ES6解决方案。全面支持ES6,就像CSS3和某些浏览器慢慢适应CSS3运动一样。使用普通的'JavaScript,你的最终用户会感谢你。

例:

+=


2
投票

您必须使用连接运算符“+”。

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

通过使用var hello = 'hello'; hello += ' world'; hello += ' blah'; console.log(hello); ,您的源代码将如下所示 -

This 
 <br>is
 <br>multiline
 <br>string.

通过使用var string = "line1\ // comment, space or tabs here raise error line2"; ,您的浏览器输出将如下所示 -

This
is
multiline
string.

2
投票

ES6的方法是使用模板文字:

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

更多参考<!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>


1
投票

我认为这个解决方法应该适用于IE,Chrome,Firefox,Safari,Opera -

使用jQuery:

\n

使用纯Javascript:

<br>

干杯!!


659
投票

模式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支持使用template strings跨多行生成字符串:

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注意:在缩小/混淆代码后,这将丢失


0
投票

刚刚尝试了Anonymous的答案,发现这里有一个小技巧,如果反斜杠const str = `This is a multiline text`; console.log(str); 之后有空格,它就不起作用 所以以下解决方案不起作用 -

here

但是当空间被移除时它起作用 -

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

希望能帮助到你 !!


337
投票

您可以在纯JavaScript中使用多行字符串。

此方法基于函数的序列化,即defined to be implementation-dependent。它在大多数浏览器中都有效(见下文),但不能保证它将来仍能使用,所以不要依赖它。

使用以下功能:

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(not in 16-
  • Rekonq 0.7.0 - 0.8.0
  • Konqueror 4.7.4不支持

但是要小心你的缩放器。它往往会删除评论。对于YUI compressor,将保留以/*!开头的评论(就像我使用的那样)。

我认为一个真正的解决方案是使用CoffeeScript


194
投票

你可以这样做...

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

133
投票

我想出了这种多线式弦乐器的装配方法。由于将函数转换为字符串也会返回函数内的任何注释,您可以使用多行注释/ ** /将注释用作字符串。你只需要修剪两端,你就有了你的字符串。

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)

88
投票

我很惊讶我没有看到这一点,因为它在我测试它的任何地方都有用,并且对于例如它非常有用。模板:

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

有没有人知道有HTML的环境但它不起作用?


50
投票

我通过输出div,使其隐藏,并在需要时通过jQuery调用div id来解决这个问题。

EG

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

然后,当我需要获取字符串时,我只使用以下jQuery:

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

这会在多行返回我的文字。如果我打电话

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

我明白了:


27
投票

有多种方法可以实现这一目标

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连接(第一个)是最快的。

有关性能的更多详细信息,请参阅this test case

更新:

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

例:

 `<h1>{{title}}</h1>
  <h2>{{hero.name}} details!</h2>
  <div><label>id: </label>{{hero.id}}</div>
  <div><label>name: </label>{{hero.name}}</div>
  `
© www.soinside.com 2019 - 2024. All rights reserved.