绝不要使用在文档加载之后使用 document.write()。这会覆盖该文档

本文探讨了JavaScript中document.write方法的使用场景及其特点。文章指出,在HTML文档流中使用此方法不会覆盖原有内容,但若在文档加载完成后使用,则会重写整个文档。通过示例展示了不同情况下document.write的具体行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

W3school-javascript第一部分,关于使用document.write()写入HTML文档流。教程后面有一行提示:您只能在 HTML 输出中使用 document.write。如果您在文档加载后使用该方法,会覆盖整个文档。 但是从给出的示例来看document.write()写入的东西并没有覆盖原有的输出,例如:

<!DOCTYPE html>
<html>
<body>
helloworld!

<script>
document.write(Date());
</script>

</body>
</html>

输出为:

helloworld! Mon Nov 16 2015 19:55:45 GMT+0800

查了下网上的资料发现所谓的‘在文档加载后使用该方法’的含义并不是在文本后使用script标签进行文档内容写入,而是通过按钮响应等方式在全部页面加载完毕之后进行文本写入,例如:

<html> 
<body> 
<p>helloworld</p> 
<a onclick='javascript:myFunction()'>hello</a>
<script> 
function myFunction(){ 
    document.write('这下应该会清除了吧?'); 
} 
</script> 
</body> 
</html>

结果为:

helloworld
Hello

此时再点击hello页面会变化为:

这下应该会清除了吧?


<think>我们被要求回答关于document.write使用限制问题。根据提供的引用,可以总结出以下几点: 1. document.write只能在HTML输出流中使用。这意味着在文档加载过程中,当脚本在HTML文档中直接出现(而不是在函数中)时,它可以向文档中写入内容。 2. 如果在文档加载完成后调用document.write(例如在函数中调用),它会覆盖整个文档,即清除已有的HTML内容,然后写入新的内容。 3. 使用document.write时,可以输出HTML标签和CSS样式,但需要注意书写格式和引号转义。 根据这些信息,我们可以组织回答如下: 首先,解释document.write在HTML输出流中的使用:当文档正在加载时,使用document.write写入的内容会直接追加到文档中。然后,解释在文档加载使用document.write的后果:它会覆盖整个文档。 我们还可以引用提供的示例代码(引用[4]中的代码)来说明这两种情况。 最后,根据要求生成相关问题。 注意:回答中需要引用引用内容,并在引用处添加引用标识。 由于用户要求使用中文,并且要求结构清晰,我们逐步解释。</think>### document.write 在 HTML 中的使用限制及影响 #### 1. HTML 输出流中的使用(安全场景) 当文档处于 **加载过程** 中时,`document.write()` 会直接将内容**追加**到文档流末尾。这是其设计初衷的使用方式: ```html <script> // 文档加载中执行 → 正常追加内容 document.write("<p>这是追加的内容</p>"); </script> ``` 此时内容会按顺序插入到脚本所在位置,不会破坏现有文档结构。这种行为被称为 "HTML 输出流模式" [^1][^3]。 #### 2. 文档加载后的使用(危险场景) 当文档**已完成加载**(如通过事件触发或在函数中调用)时,`document.write()` 会**清空整个 DOM** 并重新写入: ```html <button onclick="rewritePage()">点击重写</button> <script> function rewritePage() { // 文档加载后执行 → 覆盖整个页面 document.write("<h1>页面已被覆盖!</h1>"); } </script> ``` 点击按钮后,原页面所有内容(包括按钮本身)都会被替换[^1][^4]。 #### ⚠️ 核心限制与风险 | 场景 | 行为 | 后果 | |---------------------|--------------------------|--------------------------| | **文档加载过程中** | 追加内容到当前位置 | 安全 | | **文档加载完成后** | 覆盖整个文档 | 页面内容完全丢失[^1][^4] | | **异步脚本中** | 多数浏览器会忽略 | 内容不显示或报错 | #### 3. 特殊注意事项 - **动态资源加载**:可用来注入脚本标签,但会阻塞渲染 ```javascript document.write('<script src="analytics.js"></script>'); ``` - **样式输出**:需注意 CSS 转义 ```javascript document.write('<style>body { background: #f00; }</style>'); ``` - **现代替代方案**: ```javascript // 更安全的 DOM 操作方式 document.body.insertAdjacentHTML('beforeend', '<p>新内容</p>') ``` > **根本原因**:文档加载时浏览器处于流式解析状态,此时 `document.write()` 追加到当前解析位置;文档关闭后调用会触发新的文档写入流程,导致覆盖[^3][^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值