\n
或\r\n
(甚至\r
)。我很想避免嗅探用户代理字符串。
首次尝试:
var osLineBreak = (function () {
var p = document.createElement('p');
p.innerHTML = '<br>';
return p.innerText;
}());
不幸的是,Firefox不提供innerText
,textContent
在这种情况下返回空字符串。
第二次尝试:
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;
}());
我忽略了一种不太复杂的技巧吗?
答案 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');