在浏览器中,如何确定哪种换行符适合操作系统?

时间:2011-05-27 05:58:44

标签: javascript dom cross-browser

换句话说,

\n\r\n(甚至\r)。我很想避免嗅探用户代理字符串。

首次尝试:

var osLineBreak = (function () {
  var p = document.createElement('p');
  p.innerHTML = '<br>';
  return p.innerText;
}());

不幸的是,Firefox不提供innerTexttextContent在这种情况下返回空字符串。

第二次尝试:

var osLineBreak = (function () {
  var
    lineBreak,
    body = document.body,
    range = document.createRange(),
    selection = window.getSelection(),
    p = document.createElement('p');

  // we cannot make a selection unless `p` is in the DOM,
  // so ensure that it is not visible when we insert it
  p.style.position = 'absolute';
  p.style.left = '-9999px';
  // Firefox returns the empty string if `innerHTML` is
  // set to "<br>", so include leading and trailing
  // characters
  p.innerHTML = '%<br>%';
  body.appendChild(p);
  // wrap `p` in `range`
  range.selectNodeContents(p);
  // make a selection from `range`
  selection.addRange(range);
  // see how the line break is treated in the selection
  // (provide a sane fallback in case we get the empty string)
  lineBreak = /%(.*)%/.exec(selection.toString())[1] || '\n';
  // revert our fiddlings
  selection.removeAllRanges();
  body.removeChild(p);
  return lineBreak;
}());

我忽略了一种不太复杂的技巧吗?

3 个答案:

答案 0 :(得分:4)

2015年更新:从下面可以看出,即使在2011年,Chrome和Firefox也在所有平台上使用\n。 Opera和IE在Windows上使用\r\n。从那时起,Opera已经像Chrome一样切换到WebKit,因此可能会使用\n。 IE8是在textareas中使用\r\n的最后一个IE;从IE9开始,IE也只使用\n。尚未测试移动浏览器。


来到派对的时间相当晚,但是如果你真的想知道浏览器在textarea s等中使用的行分隔符(这可能会在浏览器中有所不同)即使在同一个操作系统上,你也可以找到一个偷偷摸摸的技巧:

function getLineBreakSequence() {
    var div, ta, text;

    div = document.createElement("div");
    div.innerHTML = "<textarea>one\ntwo</textarea>";
    ta = div.firstChild;
    text = ta.value;
    return text.indexOf("\r") >= 0 ? "\r\n" : "\n";
}

这是有效的,因为在解析HTML字符串时,使用\r\n 的浏览器会即时转换 \n。这是一个live running copy,您可以使用自己喜欢的浏览器自己尝试。在IE和Opera中(甚至在* nix上运行的Opera),你会发现它是\r\n。在Chrome,Firefox和Safari(甚至在Windows上运行)上,您会发现它是\n

那就是说,我的经验是插入\n(例如,在分配给value属性时,而不是上面的HTML字符串位),即使在通常使用{{1 }}。但这并不意味着没有边缘情况,我不得不承认我不这样做(在\r\n s中插入换行符)有任何规律性,所以如果有问题我真的应该在某些浏览器上使用textarea,我可能还没有找到它们。

答案 1 :(得分:1)

在网页上,换行符的味道在操作系统中无关紧要。在网页上显示时不会考虑换行符。您需要BR元素或块元素来执行此操作,那些是跨平台的,并且在所有浏览器上都受支持。

请参阅this page以获得简单的解释。

更新:

因此需要格式化文本框,并且换行很重要。抱歉误解了我的英语有点蹩脚。

首先检测用户的操作系统,类似于:

 var OSName="Unknown OS";

 if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
 if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
 if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
 if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";

document.write('Your OS: '+OSName);

many different implementations这个,但我保持它简单,它仍然可以像150行版本一样工作。

接下来,根据返回的操作系统,在一个变量中设置行结尾,并从中构建字符串。即:

if (navigator.appVersion.indexOf("Win")!=-1){
    OSName="Windows";
    linebreak = "\r\n";
} // etc ...

答案 2 :(得分:0)

如果你真的想要break元素出于某种原因,为什么不呢:

var br=document.createElement('br');