快速结论:该问题发生在 Open WebUI 的笔记(Notes)功能中,当笔记内包含指向自身标题的锚点链接(例如目录)时,点击链接不会滚动到对应标题位置,而是新开一个浏览器标签页并停留在笔记顶部。优先排查方向是确认笔记编辑器中的标题是否带有可被识别的 id,以及链接的锚点格式是否与标题经过 slugify 后的结果匹配。
适用环境:Open WebUI(笔记功能),涉及编辑器界面、只读笔记和版本视图。该 Issue 属于功能增强请求(enhancement),并非崩溃类 Bug,因此未提供 Python、CUDA、显卡等运行环境信息。
最快修复方案:暂无确认的一步修复方案。截至 Issue 关闭时,该功能仍属于待开发状态,官方尚未在正式版本中实现笔记标题锚点跳转。Issue 作者提供了一个参考实现分支(feat/note-anchor-links),但该方案未被合并,也未经过官方完整验证。
注意事项:任何尝试修复此问题的方法都属于实验性改动,建议在开发分支或测试环境中进行。参考分支的匹配规则仍存在两个已知边界情况:以 emoji 开头的标题中 slug 会带有前导连字符,且单独的 #- 锚点可能前缀匹配到这类标题;此外,匹配逻辑会忽略空锚点。
问题场景
在 Open WebUI 的笔记功能中,当用户打开一篇包含目录(Table of Contents)或任何指向笔记内标题的链接时,点击这些链接无法实现页面内跳转。具体表现为:点击目录条目(例如“Forward Propagation”)会在新的浏览器标签页中重新打开该笔记,地址栏带有锚点,但页面始终停留在笔记顶部,不会滚动到目标章节。即使直接打开一个携带锚点的笔记 URL,或刷新、分享此类链接,也同样停留在顶部。
此问题不仅影响编辑状态的笔记,同样影响只读笔记和版本视图。对于长笔记来说,目录完全失效,用户只能通过手动滚动来查找内容。
报错原文
Clicking an entry such as `Forward Propagation` opens the same note in a new browser tab, with the anchor in the address bar, and lands at the top of the note. Nothing scrolls to the section, in the tab you were in or in the new one.
Opening a note URL that already carries an anchor, whether pasted, shared, or reloaded, also lands at the top.
So the one thing a table of contents exists to do, take you to the section, does not happen anywhere in Notes today.
feat: make links to headings inside a note jump to the heading
原因分析
根据 Issue 中的分析和作者提供的参考实现说明,此问题的根源主要有两方面:
- 链接默认行为:Open WebUI 笔记中的链接扩展,其默认点击行为是在新标签页中打开解析后的 URL。这意味着指向笔记内部标题的链接,并不会触发页面内的平滑滚动,而是被当作普通外部链接处理,在新标签页中打开同一篇笔记。
- 标题元素缺少 id 属性:笔记编辑器中的标题(Heading)并未带有可用于定位的 id 标识。即使 URL 中携带了正确的锚点(hash),浏览器也找不到对应的 DOM 元素进行滚动定位。当笔记内容通过协作同步(collaboration sync)加载完成后,也没有任何机制去检测 URL 中的 hash 并滚动到相应位置。
综合以上两点,笔记内的目录链接无法完成章节导航,这是当前版本的功能缺失,而非用户操作错误或环境配置问题。
环境排查
- 确认使用的 Open WebUI 版本是否为最新稳定版或 dev 分支(该 Issue 提出时基于 dev 分支的 85b11a4f3 提交)。建议在 GitHub Issues 中搜索是否已有针对该功能的合并请求或更新。
- 检查笔记是否为只读状态或版本历史视图,该问题在编辑、只读及版本视图中均存在。
- 验证锚点链接的书写格式:建议按 GitHub 和 Open WebUI 的 slugify 规则生成锚点。例如:标题 “2. Forward Propagation” 对应的锚点为
#forward-propagation;标题 “Training & Evaluation” 对应#training--evaluation或#training-evaluation。如果标题以 emoji 开头,slug 会带有前导连字符。
解决步骤
目前该功能尚未合并到 Open WebUI 主线版本,以下方案均来自 Issue 讨论和作者提供的参考实现,属于可优先尝试的实验性方法:
- 方案一:使用作者参考实现分支:如果希望在本地验证功能效果,可以切换到 Issue 作者提供的参考分支
feat/note-anchor-links(其基础上一次提交为85b11a4f3)。该分支通过新增一个点击事件处理器,在链接默认行为触发前,将锚点与文档中所有标题进行 slug 匹配,并滚动到对应位置;同时,在页面加载完成后,如果 URL 带 hash,也会执行同样的匹配逻辑。该分支仅修改了一个文件,共新增 83 行代码,对外暴露了一个新的导出方法,遵循了组件中已有的 focus 和 setContent 模式。 - 方案二:关注官方后续更新:此功能在关闭时仍处于 enhancement 状态,尚未标记为已解决。建议持续关注 Open WebUI 的 Release Notes 和 dev 分支的更新日志,等待官方将类似功能合入主线。在功能正式发布前,暂无替代的官方配置方式。
- 创建本地补丁(高风险):具备前端开发能力的用户,可参考作者分支的 diff(对比视图见 Issue 原文),自行修改笔记组件的链接点击处理和加载 hook。需注意,该方法涉及对核心组件源码的改动,后续升级 Open WebUI 时可能造成冲突。
验证方法
在采用方案一或自行打补丁后,可通过以下步骤验证问题是否解决:
- 打开一篇包含多级标题的笔记,在笔记开头插入带锚点链接的目录(例如指向 “Forward Propagation” 章节的链接)。
- 点击目录条目,确认页面没有新开标签页,而是平滑滚动到对应标题位置,且地址栏 URL 会更新为携带对应锚点的地址。
- 复制携带锚点的 URL,粘贴到新标签页中打开,确认笔记加载完成后自动滚动到对应标题,而非停留在顶部。
- 测试边界场景:创建以 emoji 开头的标题,或带编号(如 “2. xxx”)和特殊字符(如 &、-)的标题,检查锚点匹配是否与预期一致。根据作者的描述,匹配规则依次为:精确 slug → 去掉列表编号后的精确 slug → 以锚点为前缀的首个标题 slug。连字符在两侧均会折叠。已知限制:以 emoji 开头的标题 slug 会带前导连字符(与 GitHub 行为一致),若锚点为
#launch-plan则无法命中该类标题;单独使用#-作为锚点则可能误匹配到这类标题。
参考来源
open-webui/open-webui #29713 feat: make links to headings inside a note jump to the heading
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


