You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

window.MathJax未定义?MathJax渲染公式报错求助

MathJax window.MathJax未定义错误解决方案

问题描述

在使用MathJax渲染数学公式时,出现window.MathJax未定义的错误,相关代码如下:

HTML引入代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Test</title>
    <link rel="icon" href="/icons/favicon.ico" type="image/x-icon">
    <link rel="shortcut icon" href="/icons/favicon.ico" type="image/x-icon">
    <!-- inject:css -->
    <!-- endinject -->
    <script type="text/x-mathjax-config">
        MathJax = {
          options: {
            renderActions: {
              addMenu: []
            }
          },
        };
        MathJax.Hub.Config({
          tex2jax: {
            inlineMath: [ ['$','$'], ["\\(", "\\)"] ],
            processEscapes: true
          }
        });
    </script>
    <script async type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-svg.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
</head>
<body>
    <div id="application-content">
    </div>
</body>
<!-- inject:js -->
<!-- endinject -->
<script type="application/javascript">
    EMBED.default.init();
</script>
</html>

React组件代码

import React, { Component } from 'react';

export default class MathBlock extends Component {
    constructor(props) {
        super(props);

        this.state = {
            open: false,
        };
    }

    render() {
        const text = this.props.block.getText();
        const latexRegex = /\${2}(.*?)\${2}/;
        const hasLatex = latexRegex.test(this.props.block.getText());

        return (
            <div>
                <div
                    dangerouslySetInnerHTML={{
                        __html: hasLatex
              ? window.MathJax.tex2svg(text.replaceAll('$', '')).innerHTML
              : window.MathJax.mathml2svg(text).innerHTML,
                    }}
                />
            </div>
        );
    }
}

MathBlock.propTypes = {
    block: React.PropTypes.object.isRequired,
};

问题原因及修复步骤

1. 混用MathJax v2和v3 API

你引入的是MathJax 3.x,但配置代码使用了MathJax.Hub.Config——这是MathJax 2.x的专属API,3.x已完全重构,不存在该对象。

修复配置代码:
替换原配置脚本为3.x格式,将TeX配置移到tex字段下:

<script type="text/x-mathjax-config">
    MathJax = {
      options: {
        renderActions: {
          addMenu: []
        }
      },
      tex: {
        inlineMath: [ ['$','$'], ["\\(", "\\)"] ],
        processEscapes: true
      }
    };
</script>

2. Async加载导致组件渲染时MathJax未初始化

加载MathJax的script标签使用了async属性,脚本异步加载执行,但React组件render方法会在挂载时立即执行,此时MathJax可能还未加载完成,导致window.MathJax不存在。

两种修复方式:

  • 方式一:移除async属性
    改为同步加载脚本,确保组件渲染前MathJax已初始化:

    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-svg.js"></script>
    
  • 方式二:监听MathJax加载状态(推荐)
    在React组件中监听MathJax加载完成事件,待加载完成后再渲染公式:

    import React, { Component } from 'react';
    
    export default class MathBlock extends Component {
        constructor(props) {
            super(props);
            this.state = {
                open: false,
                mathJaxReady: false
            };
        }
    
        componentDidMount() {
            if (window.MathJax) {
                this.setState({ mathJaxReady: true });
            } else {
                window.addEventListener('load', () => {
                    this.setState({ mathJaxReady: true });
                });
            }
        }
    
        render() {
            if (!this.state.mathJaxReady) {
                return <div>加载中...</div>;
            }
    
            const text = this.props.block.getText();
            const latexRegex = /\${2}(.*?)\${2}/;
            const hasLatex = latexRegex.test(text);
    
            return (
                <div>
                    <div
                        dangerouslySetInnerHTML={{
                            __html: hasLatex
                                  ? window.MathJax.tex2svg(text.replaceAll('$', '')).innerHTML
                                  : window.MathJax.mathml2svg(text).innerHTML,
                        }}
                    />
                </div>
            );
        }
    }
    
    MathBlock.propTypes = {
        block: React.PropTypes.object.isRequired,
    };
    

3. 确认API使用正确性

MathJax 3.x中tex2svg和mathml2svg是window.MathJax的有效方法,你引入的tex-mml-svg.js包已包含这两个功能,只需确保传入的公式格式合法即可。


内容的提问来源于stack exchange,提问作者ahmedskulj10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:05:23