Firefox中document.write()的树不平衡



据我所知,这是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内容的特定处理有关(例如,将标签显示为文本,即使像<>这样的特殊字符没有通过像&lt;/&gt;这样的实体转义)。

摆脱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>";

最新更新