我在Ruby中有以下代码。我想将此代码转换为JavaScript。什么是JS中的等效代码?
text = <<"HERE"
This
Is
A
Multiline
String
HERE
ECMAScript 6(ES6)引入了一种新的文字,即template literals。它们具有许多特征,可变插值等,但最重要的是,对于这个问题,它们可以是多线的。
模板文字由反引号分隔:
var html = `
<div>
<span>Some HTML here</span>
</div>
`;
(注意:我不主张在字符串中使用HTML)
Browser support is OK,但你可以使用transpilers更兼容。
Javascript没有here-document语法。但是,你可以逃避文字换行符:
"foo \
bar"
使用脚本标签:
<script>...</script>
块添加到head
标签中;<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>
我喜欢这种语法和缩进:
string = 'my long string...\n'
+ 'continue here\n'
+ 'and here.';
(但实际上不能被视为多行字符串)
有这个图书馆使它美丽:
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>
*/});
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>
</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'));
总结一下,我在用户javascript编程中尝试了2种方法(Opera 11.01):
所以我推荐Opera用户JS用户的工作方法。与作者所说的不同:
它不适用于Firefox或Opera;仅适用于IE,Chrome和Safari。
它可以在Opera 11中运行。至少在用户JS脚本中。太糟糕了,我不能评论个别答案或提出答案,我会马上做。如果可能,有特权的人请为我做。
更新于2015年:现在已经六年了:大多数人使用模块加载器,主模块系统各自都有加载模板的方法。它不是内联的,但最常见的多行字符串类型是模板,并且模板通常应该保留在JS之外。
使用require.js 'text' plugin,在template.html中使用多行模板
var template = require('text!template.html')
Browserify uses a 'brfs' module加载文本文件。这实际上会将您的模板构建到捆绑的HTML中。
var fs = require("fs");
var template = fs.readFileSync(template.html', 'utf8');
简单。
如果您愿意使用转义换行符,可以很好地使用它们。它看起来像带有页面边框的文档。
这适用于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>
我对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();
javascript中的等价物是:
var text = `
This
Is
A
Multiline
String
`;
这是specification。请参阅此page底部的浏览器支持。这里也有一些examples。
正如第一个回答提到的那样,使用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'
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.';
你可以使用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
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
在Javascript中制作多行字符串的最简单方法是使用反引号(``)。这允许您创建多行字符串,您可以在其中使用qazxsw poi插入变量。
${variableName}
let name = 'Willem';
let age = 26;
let multilineString = `
my name is: ${name}
my age is: ${age}
`;
console.log(multilineString);
我的基于数组的字符串concat连接版本:
ES6
这对我来说效果很好,特别是因为我经常在以这种方式构造的html中插入值。但它有很多局限性。缩进会很好。不必处理嵌套的引号会非常好,只是它的庞大性让我感到烦恼。
添加到阵列的.push()是否占用了大量时间?看到这个相关的答案:
(Qazxswpoi)
在查看这些(相反的)测试运行之后,看起来.push()对于字符串数组来说是好的,它不会超过100个项目 - 我会避免它支持更大数组的索引添加。
你可以使用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'));
另外请注意,当在每行末尾使用正向反斜杠将字符串扩展到多行时,在反向反斜杠之后任何多余的字符(大多数是空格,制表符和错误添加的注释)都会导致意外的字符错误,我花了一个小时才找到出
Is there a reason JavaScript developers don't use Array.push()?
请为互联网的爱使用字符串连接,并选择不使用ES6解决方案。全面支持ES6,就像CSS3和某些浏览器慢慢适应CSS3运动一样。使用普通的'JavaScript,你的最终用户会感谢你。
例:
+=
您必须使用连接运算符“+”。
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.
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>
我认为这个解决方法应该适用于IE,Chrome,Firefox,Safari,Opera -
使用jQuery:
\n
使用纯Javascript:
<br>
干杯!!
模式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注意:在缩小/混淆代码后,这将丢失
刚刚尝试了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>
希望能帮助到你 !!
您可以在纯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
*/});
该方法已在以下浏览器中成功测试过(未提及=未测试):
但是要小心你的缩放器。它往往会删除评论。对于YUI compressor,将保留以/*!
开头的评论(就像我使用的那样)。
我认为一个真正的解决方案是使用CoffeeScript。
你可以这样做...
var string = 'This is\n' +
'a multiline\n' +
'string';
我想出了这种多线式弦乐器的装配方法。由于将函数转换为字符串也会返回函数内的任何注释,您可以使用多行注释/ ** /将注释用作字符串。你只需要修剪两端,你就有了你的字符串。
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)
我很惊讶我没有看到这一点,因为它在我测试它的任何地方都有用,并且对于例如它非常有用。模板:
<script type="bogus" id="multi">
My
multiline
string
</script>
<script>
alert($('#multi').html());
</script>
有没有人知道有HTML的环境但它不起作用?
我通过输出div,使其隐藏,并在需要时通过jQuery调用div id来解决这个问题。
EG
<div id="UniqueID" style="display:none;">
Strings
On
Multiple
Lines
Here
</div>
然后,当我需要获取字符串时,我只使用以下jQuery:
$('#UniqueID').html();
这会在多行返回我的文字。如果我打电话
alert($('#UniqueID').html());
我明白了:
有多种方法可以实现这一目标
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>
`