排版完成时的事件 MathJax 3

You*_*che 1 javascript mathjax

我正在使用 MathJax 3 来渲染数学方程。问题是我需要向数学方程中的一些符号添加一个点击事件,所以我使用\cssId.


        loader: {
          load: ['[tex]/color','[tex]/cancel'],

        },

        tex: {
          packages: {'[+]': ['cancel']},
          inlineMath: [['$', '$'], ['\\(', '\\)']],
        },
    };
    </script>
    <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
     <p id="demo">  ${x^2+4\cssId{someid}{x}+\sum_{s}}$ </p>
    <script>$("#someid").click(function () {
      some code ....
    })
  </script>
Run Code Online (Sandbox Code Playgroud)

点击事件不起作用,因为 id="" 尚未创建。我尝试在 MathJax 排版后使用 promise 像这样。

<script>
$(document).ready(function () {
  MathJax.startup.promise.then(function () {
      $("#someid").click(function () {
  some code ....
})
  })
})
Run Code Online (Sandbox Code Playgroud)

未捕获的类型错误:无法读取未定义的属性“承诺”

我也试过 MathJax.typesetPromise()。它也不起作用。提前致谢。

Dav*_*one 5

这里有几个问题。首先,因为 MathJax 脚本具有该async属性,您不知道它何时会被处理,并且可能在您$(document).ready()调用之后,就像在这种情况下一样(因为MathJax.startup未根据错误消息定义)。其次,$(document).ready()只表示已加载主要文档内容,并不表示MathJax 已完成排版(甚至开始)。在您的情况下,您要求加载多个 TeX 扩展,这导致 MathJax 在开始排版之前必须等待它们到达。The $(document).ready()will 在加载之前运行,因此在排版发生之前,以及在 with 元素someid可用之前运行。

为了正确处理这个问题,您需要改用 MathJax 的就绪函数。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<script>
 MathJax = {
   loader: {
     load: ['[tex]/color','[tex]/cancel']
   },
   tex: {
     packages: {'[+]': ['cancel', 'color']},
     inlineMath: [['$', '$'], ['\\(', '\\)']]
   },
   startup: {
     pageReady() {
       return MathJax.startup.defaultPageReady().then(function () {
          $("#someid").click(function () {
            alert('clicked!');
          }).css('cursor', 'pointer');
       });
     }
   }
 };
</script>

<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>

<p id="demo">  ${x^2+4\cssId{someid}{x}+\sum_{s}}$ </p>
Run Code Online (Sandbox Code Playgroud)

这里我们使用该startup.pageReady()函数调用默认的页面就绪函数(它进行初始排版),并使用它返回的承诺来添加点击事件处理程序。这确保在排版之前已经进行了排版。我还添加了 CSS 以在鼠标移动到可点击数学上时更改指针,以直观地指示可以点击。