[英]<pre> tag loses line breaks when setting innerHTML in IE
我正在使用 Prototype 的 PeriodicalUpdater 用 ajax 调用的结果更新 div。 据我了解,div 是通过设置其innerHTML 来更新的。
div 被包裹在一个<pre>
标签中。 在 Firefox 中, <pre>
格式按预期工作,但在 IE 中,文本都以一行结束。
这是此处找到的一些示例代码,用于说明问题。 在 Firefox 中, abc
与def
位于不同的行; 在 IE 中它在同一行上。
<html>
<head>
<title>IE preformatted text sucks</title>
</head>
<body>
<pre id="test">
a b c
d e f
</pre>
<script type="text/javascript"><!--
var textContent = document.getElementById("test").innerText;
textContent = textContent.replace("a", "<span style=\"color:red;\">a</span>");
document.getElementById("test").style.whiteSpace = "pre";
document.getElementById("test").innerHTML = textContent;
--></script>
</body>
</html>
有人知道解决这个问题的方法吗?
设置innerHTML 会启动一个HTML 解析器,它会忽略包括硬返回在内的多余空格。 如果您将方法更改为在字符串中包含 <pre> 标记,则效果很好,因为 HTML 解析器保留了硬返回。
在运行示例页面后,您可以通过查看生成的源代码来查看此操作:
<PRE id="test" style="WHITE-SPACE: pre"><SPAN style="COLOR: red">a</SPAN> b c d e f </PRE>
你可以在这里看到硬回车不再是 <pre> 标签内容的一部分。
或者你可以
if (el.innerText) {
el.innerText = val;
} else {
el.innerHTML = val;
}
通常,通过使用 DOM 方法构建动态内容,您将获得更一致的结果,尤其是当您关心诸如空白规范化之类的微妙事情时。 但是,如果您为此使用innerHTML,则有一种IE 解决方法,即使用outerHTML
属性并包含封闭标签。
if(test.outerHTML)
test.outerHTML = '<pre id="test">'+textContent+'</pre>';
else
test.innerHTML = textContent;
可以在此处找到此解决方法和更多讨论: Inserting a newline into a pre tag (IE, Javascript)
不知道这之前是否有人建议过,但是我发现在将 innerHTML 插入“pre”标签时保留空格、换行符等的解决方案是在文本中插入另一个“pre”标签:
<pre id="pretag"></pre>
TextToInsert = "lots of text with spaces and newlines";
document.getElementById("pretag").innerHTML = "<pre>" + TextToInsert + "</pre>";
似乎 IE 在执行 innerHTML 之前确实解析了文本。 以上导致解析器将附加“pre”标签内的文本保留为未解析。 这是有道理的,因为这是解析器应该做的。 也适用于 FF。
它也可以重写为“Python 方式”,即:
el.innerText && el.innerText = val || el.innerHTML = val;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.