据我所知,这是Firefox中推测性执行的问题。这是整个html演示文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Foo</title>
</head>
<body>
<script language="JavaScript" type="text/javascript">
document.write("<table>")
document.write("<tbody>")
document.write("<tr>")
document.write("<td>")
document.write("<textarea rows='10' cols='12'>")
document.write("</textarea>")
document.write("</td>")
document.write("</tr>")
document.write("</tbody>")
document.write("</table>")
</script>
</body>
</html>
当加载到Firefox时,我在控制台上收到以下消息:
An unbalanced tree was written using document.write() causing data from the network to be reparsed. For more information https://developer.mozilla.org/en/Optimizing_Your_Pages_for_Speculative_Parsing1 bug.html:22:0
我不相信我在写一棵不平衡的树。有人能提出一个简单的方法来避免这种情况吗?
看起来这是一个特殊情况,与table
中的textarea
完全相关。
单独的table
不会引起问题,div
中的textarea
也不会,不在table
中的textarea
也不会。
可能在某种程度上与textarea
内容的特定处理有关(例如,将标签显示为文本,即使像<
和>
这样的特殊字符没有通过像<
/>
这样的实体转义)。
摆脱document.write()
调用的一个相对简单的方法是在使用document.write()
的代码之前创建一个数组(e. g.parts
),并用parts.push()
替换所有document.write()
调用,然后将parts.join('')
分配给整个容器的innerHTML
属性。
为什么不只调用document.write一次?像这样:
document.write("<table><tbody><tr><td><textarea rows='10' cols='12'></textarea></td></tr></tbody></table>");
或者,如果你想保留特征线,你可以使用反斜杠:
document.write("<table>
<tbody>
<tr>
<td>
<textarea rows='10' cols='12'>
</textarea>
</td>
</tr>
</tbody>
</table>");
编辑:以上解决方案不能解决问题,所以如果你只把它放进你的身体:
document.documentElement.innerHTML = "<table>
<tbody>
<tr>
<td>
<textarea rows='10' cols='12'>
</textarea>
</td>
</tr>
</tbody>
</table>";