MutationObserver 实战:Claude Counter 如何让界面在 SPA 导航与 DOM 重建中永不丢失
MutationObserver 实战Claude Counter 如何让界面在 SPA 导航与 DOM 重建中永不丢失【免费下载链接】claude-counterA minimal browser extension that shows token count, cache timer, and usage bars on claude.ai.项目地址: https://gitcode.com/gh_mirrors/cl/claude-counterClaude Counter 是一款 claude.ai 浏览器扩展在聊天界面实时显示 token 计数、缓存计时器和用量进度条。但 claude.ai 是典型的 SPA 单页应用切换会话、重建组件时会大面积重绘 DOM任何注入的 UI 都可能被冲掉。本文以这个项目为例讲清楚如何用 MutationObserver 实现注入即挂载、丢失即重挂让界面元素永不丢失。为什么注入的 UI 会失踪传统多页站点里把元素追加到页面即可一劳永逸。但 SPA 的每次跳转都不刷新页面框架会卸载并重建整块 DOM你注入的节点一旦被从文档树移除引用还在节点却已经死了。Claude Counter 的解法是三步走只创建一次所有 UI 节点头部计数区、用量条只创建一次保存在类实例字段里不随页面重建而丢弃监听锚点UI 挂在页面的稳定锚点旁如data-testid选择器锚点出现就挂载监听丢失DOM 观察者持续检测我的节点还在文档里吗不在了就等锚点重现后再挂回去。具体实现见 ui.js。waitForElementMutationObserver 等待元素出现轮询setInterval 反复 querySelector会白白消耗性能。项目封装了一个基于 MutationObserver 的等待函数 waitForElement核心思路先查一次元素已存在则直接返回否则用观察者监听document.body的子树变化一旦元素出现立刻disconnect()并返回支持超时参数超时自动断开避免观察器泄漏。它在每次路由切换后被调用等待两个锚点出现模型选择器和聊天菜单按钮选择器定义在 constants.js最长等 60 秒。自动重新挂载_observeDom 的丢失检测模式核心逻辑在 CounterUI._observeDom一个长驻的 MutationObserver 监听整个body的子树变化每次触发时检查两个事实用量条是否还在文档里、头部容器是否还在发现丢失且没有进行中的重挂任务时调用waitForElement等锚点出现然后重新把同一个节点挂回去——数据状态原封不动只是换了个位置。usageReattachPending/headerReattachPending两个标志位保证不会重复触发重挂。这是 MutationObserver 最实用的丢失检测套路不关心页面怎么重建只关心我的东西还在不在。SPA 导航感知劫持 history 与分支按钮main.js 的 observeUrlChanges 通过cc:urlchange自定义事件和popstate感知 URL 变化后退/前进按钮也能覆盖。事件是谁发的是页面主世界里的桥接脚本 bridge.js它抢在框架缓存之前包装了history.pushState/replaceState每次调用后派发cc:urlchange。这也是 SPA 监测的经典手法——原生事件无法感知 URL 静默变化只能自己埋桩。更细节处main.js 还会监听上一条/下一条分支切换按钮点击后用一个一次性MutationObserver 盯着分支指示器的文本文本一变就刷新会话数据60 秒无变化自动清理。观察者用完即断是防止泄漏的关键习惯。主题同步监听属性变化的第三种用法第三个观察器专门盯html的data-mode属性见 _observeTheme用户切换明暗主题时观察者被触发进度条的描边、填充、标记颜色随之重刷。属性监听attributesattributeFilter是 MutationObserver 的第三种典型用法比轮询dataset精确得多。安装体验3 步跑起来Chrome / Edge / Chromium下载发行版 zip打开chrome://extensions开启开发者模式把 zip 拖入页面即可Firefox下载 xpi 文件拖入任意 Firefox 窗口点击添加Tampermonkey 用户脚本直接安装 claude-counter.user.js。扩展只在 claude.ai 页面激活manifest.json 中的content_scripts配置全部数据本地处理无外部服务器、无追踪。小结MutationObserver 三大套路套路用途项目出处等待元素出现锚点就绪后挂载 UImain.js丢失检测 重挂DOM 重建后 UI 自愈ui.js属性/文本变化监听主题同步、分支切换ui.js一句话总结节点只建一次、挂在锚点旁、观察者负责找回它再配合用完即断的清理就能让注入式 UI 在 SPA 的 DOM 翻涌中稳如磐石。更多原理与许可说明可阅读 README.md 与 THIRD_PARTY_NOTICES.md。【免费下载链接】claude-counterA minimal browser extension that shows token count, cache timer, and usage bars on claude.ai.项目地址: https://gitcode.com/gh_mirrors/cl/claude-counter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Easel路线图与贡献指南:开源AI社媒智能体的Windows适配、多Agent Harness之后还有什么

Easel路线图与贡献指南:开源AI社媒智能体的Windows适配、多Agent Harness之后还有什么

Easel路线图与贡献指南:开源AI社媒智能体的Windows适配、多Agent Harness之后还有什么 【免费下载链接】Easel An open-source AI agent for social media — discover trends, create content, publish everywhere, and learn what works across Xiaohongshu, Douy…

2026/10/5 13:54:54 阅读更多 →
Julia 1的3种决策类型:choice、score与noul完整实战指南

Julia 1的3种决策类型:choice、score与noul完整实战指南

Julia 1的3种决策类型:choice、score与noul完整实战指南 【免费下载链接】Julia-1 项目地址: https://ai.gitcode.com/hf_mirrors/SupersonicLabs/Julia-1 Julia 1 是 Supersonic Labs 推出的 144.3M 参数决策模型:给它一段上下文状态&#xff0…

2026/10/4 4:20:13 阅读更多 →
YOLOv8实战:623张仓库工人图像训练安全检测模型

YOLOv8实战:623张仓库工人图像训练安全检测模型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 4:20:13 阅读更多 →

最新新闻

BranchIP:自适应等变计算驱动的原子间势能建模新范式

BranchIP:自适应等变计算驱动的原子间势能建模新范式

1. 项目概述:为什么“自适应等变计算”正在重构原子间势能建模的底层逻辑BranchIP这个名字乍看像某个冷门开源库的代号,但拆开来看——Branch(分支)、IP(Interatomic Potential,原子间势能)——…

2026/10/5 13:59:21 阅读更多 →
自己动手,三分之一预算:开源驾驶舱openrig铝型材DIY全攻略

自己动手,三分之一预算:开源驾驶舱openrig铝型材DIY全攻略

你有没有算过一笔账:一套像样的模拟赛车驾驶舱,成品买下来普遍要8000到20000元,好一点的直接奔着5万去了。但如果自己动手,用开源图纸和铝型材拼一台,成本可以压到三分之一以下,刚性还不输成品。这就是open…

2026/10/5 13:59:21 阅读更多 →
OpenRig开源开放式机架:从设计到组装,打造高效散热DIY工作站

OpenRig开源开放式机架:从设计到组装,打造高效散热DIY工作站

OpenRig 这名字拆开看就是 Open Rig,开放式机架。我做这个项目从画第一张草图到实机点亮,前后折腾了两个多月,期间推翻了三次结构方案,废掉一版亚克力切割件,最后才定下来现在这套既兼顾散热、又方便维护、还能随意扩…

2026/10/5 13:59:21 阅读更多 →
CARM:LLM强化学习中取消响应的精准掩码方案

CARM:LLM强化学习中取消响应的精准掩码方案

1. 项目概述:为什么在LLM强化学习中,“取消响应”会成为训练灾难的隐形推手?最近在做几个数学推理和代码生成类任务的RLHF微调时,我反复遇到一个特别诡异的现象:模型明明在监督微调(SFT)阶段表现…

2026/10/5 13:59:21 阅读更多 →
OpenShell实战:让大模型通过自然语言驱动本地Shell执行代码

OpenShell实战:让大模型通过自然语言驱动本地Shell执行代码

1. 项目概述1.1 它到底是什么OpenShell这个名字,乍一听像是个终端模拟器,或者某个开源Shell的变体。但实际上,它做的事比“Shell”这两个字所暗示的要大得多——它是一套把自然语言转换成可执行代码,并在本地环境中直接运行的开源…

2026/10/5 13:59:21 阅读更多 →
落地页文案的10个转化技巧:用ai-design-skills写好标题公式与CTA

落地页文案的10个转化技巧:用ai-design-skills写好标题公式与CTA

落地页文案的10个转化技巧:用ai-design-skills写好标题公式与CTA 【免费下载链接】ai-design-skills 项目地址: https://gitcode.com/gh_mirrors/ai/ai-design-skills ai-design-skills 是一套面向 Claude Code、Cursor 等 AI 编程工具的落地页设计技能库&a…

2026/10/5 13:58:20 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →