DOMParser

一、DOMParser 到底是啥?

一句话:
DOMParser 就是一个"翻译官",它能把一段纯文本(HTML/XML/SVG 字符串)翻译成浏览器能看懂的 DOM 树,这样你就能像操作普通网页一样去增删改查节点。

二、核心 API 只有一个

js 复制代码
const parser = new DOMParser();          // 1. 造个翻译官
const doc  = parser.parseFromString(str, type); // 2. 让他翻译
// str:要翻译的字符串
// type:告诉翻译官这是哪种语言
//   • text/html     (最常用)
//   • text/xml
//   • application/xml
//   • image/svg+xml
// 返回值 doc 就是一个真正的 Document 对象

三、常用场景 + 逐行代码演示

下面 3 个场景覆盖了 90% 以上的实际开发需求。

────────────────

场景 1:把富文本字符串变成真正的 DOM,再安全地插入页面

(富文本来自后端、用户输入,用 innerHTML 容易 XSS)

html 复制代码
<textarea id="raw" rows="5">
  <h2>标题</h2>
  <p><img src="cat.png" onerror="alert('XSS')"> 这是一只猫</p>
</textarea>
<button id="btn">预览</button>
<div id="view"></div>

<script>
btn.onclick = () => {
  const htmlStr = raw.value;                // 1. 拿到字符串
  const parser = new DOMParser();           // 2. 造翻译官
  const doc = parser.parseFromString(htmlStr, 'text/html'); // 3. 翻译
  const body = doc.body;                    // 4. 取到 <body> 里的节点

  // 5. 安全过滤:把危险的 onerror 等属性干掉
  body.querySelectorAll('*').forEach(n => {
    [...n.attributes].forEach(attr => {
      if (attr.name.startsWith('on')) n.removeAttribute(attr.name);
    });
  });

  // 6. 把干净的节点放到页面
  view.innerHTML = '';              // 清空旧内容
  view.append(...body.childNodes);  // 插进去
};
</script>

逐行解释

  • 第 3 步:parseFromString 返回完整的 document,包含 <html><body>...
  • 第 5 步:用 DOM 方法遍历节点、删除危险属性,比正则安全 100 倍。
  • 第 6 步:append(...body.childNodes) 把节点"搬家"到当前页面。

────────────────

场景 2:前端抓取并解析远端 HTML 片段

(例如:抓取 GitHub Trending 列表)

js 复制代码
async function loadTrending() {
  const res   = await fetch('https://github.com/trending'); // 1. 拉 html
  const html  = await res.text();
  const doc   = new DOMParser().parseFromString(html, 'text/html'); // 2. 翻译

  // 3. 用 querySelector 直接筛选节点,像在真正的页面里一样
  const repos = [...doc.querySelectorAll('article.Box-row')].map(box => ({
    title: box.querySelector('h2 a')?.textContent.trim(),
    url:   'https://github.com' + box.querySelector('h2 a')?.getAttribute('href')
  }));

  console.table(repos); // 打印表格
}
loadTrending();

逐行解释

  • fetch 拿到的是纯文本 HTML;DOMParser 让它秒变可操作 DOM。
  • 后面就是熟悉的味道:querySelector / map / trim 一套带走。

────────────────

场景 3:纯前端解析 XML 配置 / RSS 订阅

(不需要任何后端,浏览器里直接搞定)

js 复制代码
const rssString = `
<rss>
  <channel>
    <title>科技快讯</title>
    <item><title>苹果发布新芯片</title></item>
    <item><title>谷歌推出 AI 搜索</title></item>
  </channel>
</rss>`;

const doc = new DOMParser().parseFromString(rssString, 'text/xml');

// 处理解析错误
if (doc.querySelector('parsererror')) {
  console.error('XML 格式错误');
} else {
  const items = [...doc.querySelectorAll('item title')].map(n => n.textContent);
  console.log(items); // ["苹果发布新芯片", "谷歌推出 AI 搜索"]
}

逐行解释

  • text/xml 作为 type;如果字符串不是合法 XML,浏览器会插入 <parsererror> 节点。
  • 直接 querySelectorAll 就能遍历任意层级的 XML 节点,比传统 XML API 简单很多。

────────────────

四、小结

  1. DOMParser = 字符串 → DOM 的桥梁,浏览器自带,无需任何库。
  2. 只有一个方法 parseFromString,记住 text/html / text/xml 两个常用类型即可。
  3. 典型用途:富文本安全渲染、抓取并解析外部页面、纯前端解析 XML/RSS/SVG。
相关推荐
北京_宏哥4 分钟前
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-33-JavaScript的调用执行-上篇 (详细教程)
java·前端·javascript
张志鹏PHP全栈4 分钟前
Vue3第十三天,Vue3种如何自定义hook
前端·vue.js
Dignity_呱6 分钟前
为什么一定要有微任务,直接一个宏任务不行吗
前端·javascript·面试
Cache技术分享12 分钟前
156. Java Lambda 表达式 - 从 Lambda 到方法引用:深入理解 Java 的未绑定实例方法调用
前端·后端
teeeeeeemo17 分钟前
JS实现数组扁平化
开发语言·前端·javascript·笔记·算法
原则猫17 分钟前
waterfall 妙用
前端
Mintopia18 分钟前
Next.js 组件库搭建指南:Shadcn UI 与 Radix UI 的优雅实践
前端·javascript·next.js
e黑子19 分钟前
GPT 让我效率提升 10 倍,但也差点毁了我的职业生涯
前端·程序员
一滩21 分钟前
使用LLM 实现一个可编辑PPT Agent
前端
sophie旭25 分钟前
《深入浅出react》总结之 11. 2. 2 renderWithHooks 执行函数
前端·react.js·源码