如果要向文档附加内容,应该只在<script>块解析阶段调用document.write()
。
如果您在执行操作的上下文之外(例如在事件处理程序中)调用document.write
,则不会进行解析,因此字符串'foo'
无处可去。
根据原始JavaScript参考文献的规定:
事件处理程序在原始文档关闭后执行,因此如果您在事件处理程序中未显式发出document.open
方法,则write方法会隐式打开一个mimeType为text/html的新文档。
也就是说,它假设您犯了一个错误并且意味着执行:
document.open('text/html');
document.write(html);
这会用新内容替换整个文档。同时你会注意到,因为你没有调用以下方法完成相关操作:
document.close();
在Firefox中,“loading”动画仍在旋转,期望会有更多的内容被写入文档(但实际上没有)。
在这种情况下,您正在使用document.write()
向文档写入字符串:
Hello bobince! How are you today?
这明显不是一个有效的HTML文档。Chrome(和表现相同的Safari)试图将其解析为HTML文档,但由于在文档元素(<html>)之外存在非空格文本内容,因此失败了,这是不被允许的。如果在名称输入中添加一些标记:
Hello <em>bobince</em>! How are you today?
你会看到<em>元素外的所有内容都被丢弃。Firefox和IE成功地应用了他们的“修复在任何元素外部的文本”破损HTML规则来帮助你,但Chrome不行。
如果你想用document.write()
编写新文档,请确保它确实是一个完整的文档:
<html><head><title>Greetings</title><body><p>Hello bobince! How are you today?</p></body></html>
或者,如果你想要用 document.write()
输出文本字符串,理论上应该调用:
document.open('text/plain');
在 write() 函数之前。但是请注意,Chrome 或 Safari 不支持 mimetype 参数;它们会始终将您编写的内容视为 HTML。
无论如何,您可能不想使用这种方法。如果您想要添加或更改现有页面,通常应该使用 DOM 方法,例如在状态输出 div 上设置文本,或使用 innerHTML 替换 body 内容。
document.write()
在某些情况下是必需的(特别是当您从头创建新窗口或帧时),但除此之外,它通常是错误的,应受到怀疑。