479

\nJavaScript 中的通用换行符序列是否适用于所有平台?如果不是,我如何确定当前环境的角色?

我不是在询问 HTML 换行元素 ( <BR/>)。我在询问 JavaScript 字符串中使用的换行符序列。

4

15 回答 15

388

我刚刚使用这个愚蠢的 JavaScript 测试了一些浏览器:

function log_newline(msg, test_value) {
  if (!test_value) { 
    test_value = document.getElementById('test').value;
  }
  console.log(msg + ': ' + (test_value.match(/\r/) ? 'CR' : '')
              + ' ' + (test_value.match(/\n/) ? 'LF' : ''));
}

log_newline('HTML source');
log_newline('JS string', "foo\nbar");
log_newline('JS template literal', `bar
baz`);
<textarea id="test" name="test">

</textarea>

Windows 上的 IE8 和 Opera 9 使用\r\n. 我测试的所有其他浏览器(Windows 上的 Safari 4 和 Firefox 3.5,以及 Linux 上的 Firefox 3.0)都使用\n. 在设置值时,它们都可以处理\n得很好,尽管 IE 和 Opera 会在内部再次将其转换回\r\n。有一篇 SitePoint 文章,其中包含更多详细信息,称为Line endings in Javascript

另请注意,这与 HTML 文件本身中的实际行结尾无关(两者都\n给出\r\n相同的结果)。

提交表单时,所有浏览器都会将换行符规范化为%0D%0AURL 编码。要查看它,请加载 egdata:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>并按下提交按钮。(某些浏览器会阻止提交页面的加载,但您可以在控制台中看到 URL 编码的表单值。)

不过,我认为你真的不需要做太多的决定。如果您只想在换行符上拆分文本,可以执行以下操作:

lines = foo.value.split(/\r\n|\r|\n/g);
于 2009-07-20T22:46:51.017 回答
91

是的,它是通用的。

尽管'\n'是通用换行符,但您必须记住,根据您的输入,换行符前面可能有回车符 ( '\r')。

于 2009-07-20T20:09:33.813 回答
77

不要使用“\n”。试试这个:

var string = "this\
is a multi\
line\
string";

只需输入反斜杠并继续运输!它就像一个魅力。

于 2016-04-10T07:51:55.153 回答
58

处理换行符的所有情况而不是检查哪种情况然后应用它可能是最简单的。例如,如果您需要替换换行符,请执行以下操作:

htmlstring = stringContainingNewLines.replace(/(\r\n|\n|\r)/gm, "<br>");
于 2012-01-21T20:32:53.077 回答
26

是的,使用 \n,除非你正在生成 HTML 代码,在这种情况下你想使用<br />.

于 2009-07-20T20:11:08.053 回答
14

在电子邮件链接功能中,我使用“%0D%0A”:

function sendMail() {
    var bodydata="Before "+ "%0D%0A";
        bodydata+="After"

    var MailMSG = "mailto:aaa@sss.com"
             + "?cc=07@sss.com"
             + "&subject=subject"
             + "&body=" + bodydata;
    window.location.href = MailMSG;
}

HTML

<a href="#" onClick="sendMail()">Contact Us</a>
于 2012-10-10T06:27:43.877 回答
8

您可以在ES6中使用 `` 引号(在Esc按钮下方)。所以你可以这样写:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;
于 2017-05-26T12:46:13.673 回答
7

获取当前浏览器的行分隔符:

function getLineSeparator() {
  var textarea = document.createElement("textarea");
  textarea.value = "\n"; 
  return textarea.value;
}
于 2011-12-19T03:40:16.903 回答
4

注意 - 当使用 ExtendScript JavaScript(Photoshop CS3+ 等应用程序中使用的 Adob​​e 脚本语言)时,要使用的字符是“\r”。"\n" 将被解释为字体字符,因此许多字体将具有块字符。

例如(选择一个名为“Note”的图层并在所有句点后添加换行符):

var layerText = app.activeDocument.artLayers.getByName('Note').textItem.contents;
layerText = layerText.replace(/\. /g,".\r");
于 2013-04-07T23:44:34.603 回答
3
printAccountSummary: function()
    {return "Welcome!" + "\n" + "Your balance is currently $1000 and your interest rate is 1%."}
};
console.log(savingsAccount.printAccountSummary()); // Method

印刷:

Welcome!
Your balance is currently $1000 and your interest rate is 1%.
于 2018-05-17T02:59:29.123 回答
2

我遇到了用\n\r\n表示换行符的问题。
神奇的是,用于回车的字符\r对我来说就像换行一样。
所以在某些情况下,考虑 \r 也是有用的。

于 2011-02-02T14:01:50.603 回答
1

我相信它是——当您使用 JavaScript 字符串时。

但是,如果您要生成 HTML,则必须使用<br />标签(不是\n,因为您不再处理 JavaScript)。

于 2009-07-20T20:12:28.033 回答
0

一个实际的观察......在我的 Node.js 脚本中,我有以下功能:

function writeToLogFile (message) {
    fs.appendFile('myserverlog.txt', Date() + " " + message + "\r\n", function (err) {
        if (err) 
            throw err;
    });
}

首先,我只有“\n”,但我注意到当我在记事本中打开日志文件时,它会在同一行显示所有条目。另一方面,Notepad++将条目分别显示在自己的行上。将代码更改为“\r\n”后,即使是记事本也会在自己的行上显示每个条目。

于 2019-07-11T13:37:16.297 回答
-3

\n对于我遇到的所有情况都很好。如果您正在使用网络,请使用\n它并且不用担心(除非您遇到任何与换行相关的问题)。

于 2009-09-11T14:53:14.103 回答
-14

您可以使用<br/>and the document.write/and document.writelnone。

于 2013-04-16T23:34:16.907 回答