document.write详解

JavaScript 中 document.write 详解

document.write() 是 JavaScript 中一个古老且原始的 DOM 操作方法,用于直接向文档流中写入 HTML 内容或文本。它属于早期 DOM Level 0 的特性,现在已被视为不推荐使用的方法。

基本语法

document.write(markup);
  • markup:字符串,可以是纯文本、HTML 标签、脚本等。
  • 可以调用多次,每次写入都会追加到当前文档流。

示例

<!DOCTYPE html>
<html>
<head>
    <title>document.write 示例</title>
</head>
<body>
    <script>
        document.write("<h1>欢迎来到我的网站!</h1>");
        document.write("<p>这是通过 document.write 写入的内容。</p>");
        document.write("<script>alert('Hello!')<\/script>"); // 注意转义 </script>
    </script>
</body>
</html>

页面加载时会直接输出:

<h1>欢迎来到我的网站!</h1>
<p>这是通过 document.write 写入的内容。</p>

并弹出 alert。

关键特性与行为

  1. 在页面加载阶段(文档流开放时)使用
  • 如果在 HTML 解析过程中调用(如在 <script> 中直接调用),它会追加内容到当前文档流。
  • 这是它最“正常”的使用场景。
  1. 在页面加载完成后(文档流关闭后)使用
  • 一旦文档加载完成(load 事件触发后),再次调用 document.write()隐式调用 document.open()
  • 这会导致清空整个当前页面(包括所有内容、脚本、样式),然后重新开始写入新内容。
  • 这是一个破坏性操作,极易导致页面空白或丢失数据。 危险示例
   window.onload = function() {
       document.write("太晚了!页面被清空了。");
   };
   // 结果:整个页面只剩下这句话,原有内容全没了!
  1. 性能问题
  • document.write同步阻塞的,会暂停页面解析和渲染,直到写入完成。
  • 大量使用会严重影响页面加载速度。
  1. 安全性问题
  • 直接写入用户输入内容容易导致 XSS 跨站脚本攻击
   document.write(userInput); // 如果 userInput 包含 <script>恶意代码</script>,直接执行!

为什么现在几乎不用 document.write

问题说明
破坏性行为页面加载后调用会清空整个页面
阻塞渲染同步操作,拖慢页面加载
不符合现代开发规范违反内容与行为分离原则
安全性差易引发 XSS
已被主流框架抛弃React、Vue、Angular 等都不使用这种方式操作 DOM

推荐的现代替代方案

需求推荐方法
动态插入 HTML 内容element.innerHTML = '内容'
更安全地插入内容element.textContent = '内容'(纯文本)
创建新元素document.createElement() + appendChild()
插入到特定位置insertAdjacentHTML()
响应式更新内容使用现代框架(React、Vue 等)

最佳实践示例

// 代替 document.write
const container = document.getElementById('output');
container.innerHTML = "<h1>欢迎来到我的网站!</h1><p>现代方式插入内容</p>";

// 或更安全的方式
container.insertAdjacentHTML('beforeend', '<p>新内容</p>');

特殊注意:广告脚本中的使用

你可能还在一些老旧广告代码中看到:

<script>
    document.write('<script src="http://ads.example.com/ad.js"></script>');
</script>

这是历史遗留问题,现代广告联盟已基本放弃这种方式,改用异步加载。

总结

项目评价
功能强大(可直接写入任意内容)
易用性高(语法简单)
安全性低(易 XSS)
性能差(阻塞渲染)
现代兼容性差(不推荐)
是否应继续使用强烈不推荐,仅用于学习或极特殊场景

结论
document.write 是 JavaScript 历史的产物,除非你在维护非常老的代码或进行教学演示,否则永远不要在生产环境中使用它。使用现代 DOM 操作方法才是正确选择。

文章已创建 3572

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部