Skip to content

fix: MathJax 在页面切换和部分初次加载导致的右键菜单异常 - #50

Closed
bfyes wants to merge 1 commit into
ZJUSCT:mainfrom
bfyes:fix/mathjax-instant-menu
Closed

fix: MathJax 在页面切换和部分初次加载导致的右键菜单异常#50
bfyes wants to merge 1 commit into
ZJUSCT:mainfrom
bfyes:fix/mathjax-instant-menu

Conversation

@bfyes

@bfyes bfyes commented Aug 16, 2026

Copy link
Copy Markdown

fix: MathJax 在页面切换和部分初次加载导致的右键菜单异常

您好,感谢文档仓库的精心编写!我在自己的个人 Zensical 文档站中解决了上述问题,所以来提PR,希望能解决该站点同样的问题。

问题概述

在使用过程中,我发现 MathJax 右键菜单在页面切换和部分初次加载时出现异常。具体体现在菜单部分加载,页面被强制定位到顶部,且在多平台的浏览器中稳定触发,截图如下

1Capture 2026-08-17 01 09 29 1Capture 2026-08-17 01 11 39 1Capture 2026-08-17 01 10 06 1Capture 2026-08-17 01 16 57

触发方式

页面被强制定位可能会影响阅读体验。该异常的触发方式包括:

  1. 打开含有公式的页面,右键公式;
  2. 刷新后正常,左侧目录中跳转另一篇含有公式的页面,右键公式。

问题分析

toml 配置文件中引入了 instant 特性,它们带来了浏览体验上的提升,同时带来了组件加载不全的问题。

原因在于 navigation.instant 通过 fetch 替换 DOM 而非整页加载,MathJax 的菜单状态(posted 标志)在 DOM 替换后失效,导致菜单 frame 无法正确挂载。

features = [
    "navigation.instant",
    "navigation.instant.prefetch",
    "navigation.instant.progress",
]

方案选择

理论上采用重新加载的手段需要慎重,但实测发现加入以下温和手段无效:

MathJax.typesetPromise().then(() => {
    const menu = MathJax.startup.document.menu;
    if (menu && menu.menu) {
        menu.menu.posted = false;
    }
});

我实际加入的代码均经过多次构建测试与部署测试(在我的主页仓库中测试, 同样采用MathJax)。

最终方案:每次 document$ 事件触发时,拷贝一份干净的 MathJax 配置,移除旧 script 标签后重新插入。同时从 zensical.tomlextra_javascript 中移除 MathJax 的静态 CDN 引用,改由 mathjax.js 动态创建,避免首次加载时重复初始化。

浏览器有 CDN 缓存,不会重复下载。实测无卡顿等异常现象发生。

@bfyes

bfyes commented Aug 16, 2026

Copy link
Copy Markdown
Author

补充:预期/正常时的右键菜单样式,此时不会跳转到页面顶部。

image

@bowling233 bowling233 closed this Aug 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants