[英]<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.