14

在 IE 中,当我将文本插入<pre>标签时,会忽略换行符:

<pre id="putItHere"></pre>

<script>
function putText() {
   document.getElementById("putItHere").innerHTML = "first line\nsecond line";
}
</script>

使用\r\n而不是平原\n是行不通的。

<br/>确实有效,但在 FF 中插入了一个额外的空白行,这对我的目的来说是不可接受的。

4

11 回答 11

12

这些关于 Internet Explorer 的 innerHTML 行为的quirksmode.org 错误报告和评论可能会有所帮助:

" IE 将HTML 规范化应用于分配给 innerHTML 属性的数据。这会导致在应该保留格式的元素中不正确地显示空白,例如 <pre> 和 <textarea>。 "

于 2008-10-12T11:46:31.503 回答
6

这在IE中有效吗?

document.getElementById("putItHere")
    .appendChild(document.createTextNode("first line\nsecond line"));

我用 Firefox 测试了它,它可以工作。:-)

于 2008-10-12T11:49:46.367 回答
5

解决方法可以在已接受答案中链接到的页面中找到。为了便于使用,这里是:

if (elem.tagName == "PRE" && "outerHTML" in elem)
{
    elem.outerHTML = "<PRE>" + str + "</PRE>";
}
else
{
    elem.innerHTML = str;
}
于 2008-12-12T16:05:49.603 回答
4

<br/>应该在所有浏览器中只输出一行。当然也删除 \n ,代码应该是:

document.getElementById("putItHere").innerHTML = "first line<br/>second line";
于 2008-10-12T11:33:59.097 回答
4

标签内的内容<pre>不应被视为 HTML。

事实上,<pre>标签的意义在于它确实显示了格式化的文本。

使用 innerText 属性是修改<pre>标签内容的正确方法。

document.getElementById("putItHere").innerText = "first line\nsecond line";
于 2008-10-12T12:04:55.493 回答
2

IE9不像它的前辈那样标准化空白。

您应该测试支持而不是针对任何特定的浏览器。例如..

var t = document.createElement(elem.tagName);
t.innerHTML = "\n";

if( t.innerHTML === "\n" ){
    elem.innerHTML = str;
}
else if("outerHTML" in elem)
{
    elem.outerHTML = "<"+elem.tagName+">" + str + "</"+elem.tagName+">";
}
else {
    // fallback of your choice, probably do the first one.
}
于 2011-03-10T17:12:45.293 回答
1

我估计这个。

我发现 IE 正在使用 \r\n 而 Fx(others) 正在使用 \n

var newline;
if ( document.all ) newline = '\r\n';
else newline = '\n';

var data = 'firstline' + newline + 'second line';
document.getElementById("putItHere").appendChild(document.createTextNode(data));

对于我曾经制作的 TinyMCE(所见即所得编辑器)插件,我最终使用了 BR i 编辑模式并在提交等时对其进行了清理。

此代码循环遍历 PRE 元素内的所有 BR 元素,并将 BR 替换为换行符。

请注意,代码依赖于 TinyMCE API,但可以使用标准 Javascript 轻松编写。

清理:

        var br = ed.dom.select('pre br');
        for (var i = 0; i < br.length; i++) {
          var nlChar;
          if (tinymce.isIE)
            nlChar = '\r\n';
          else
            nlChar = '\n';

          var nl = ed.getDoc().createTextNode(nlChar);
          ed.dom.insertAfter(nl, br[i]);
          ed.dom.remove(br[i]);
        }

祝你好运!

于 2008-10-12T12:12:35.460 回答
1

我发现 innerHTML 在应用于元素之前已被处理,因此 <br> 成为换行符并删除了多个空格。

例如,要保留原始文本,您必须使用 nodeValue;

document.getElementById('pre_id').firstChild.nodeValue='    white space \r\n ad new line';
于 2009-05-05T14:23:34.933 回答
1

如果您不想使用 outerHTML,您也可以对 IE 执行以下操作,前提是额外的 pre 标签不是问题:

 if(isIE)
     document.getElementById("putItHere").innerHTML = "<pre>" + content+"</pre>";
 else
     document.getElementById("putItHere").innerHTML = content;
于 2010-04-27T10:32:11.550 回答
1

这是对 Edward Wilde 答案的一个非常小的调整,它保留了 <pre> 标签上的属性。

if (elem.tagName == "PRE" && "outerHTML" in elem) {
    var outer = elem.outerHTML;
    elem.outerHTML = outer.substring(0, outer.indexOf('>') + 1) + str + "</PRE>";
}
else {
    elem.innerHTML = str;
}
于 2011-12-06T15:13:00.993 回答
0
if (typeof div2.innerText == 'undefined')
    div2.innerHTML = value;
else
    div2.innerText = value;

这对我有用。

于 2009-03-05T04:14:01.960 回答