排版完成时的事件 MathJax 3
Event when typesetting is done MathJax 3
我正在使用 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>
点击事件无效,因为 id="" 尚未创建。我试过像这样在 MathJax 排版后使用 promises。
<script>
$(document).ready(function () {
MathJax.startup.promise.then(function () {
$("#someid").click(function () {
some code ....
})
})
})
Uncaught TypeError: Cannot read property 'promise' of undefined
我也试过 MathJax.typesetPromise()。它也没有用。
提前致谢。
这里有几个问题。首先,因为 MathJax 脚本有 async
属性,你不知道它什么时候会被处理,它可能在你的 $(document).ready()
调用之后,因为它看起来是在这个大小写(因为 MathJax.startup
未根据错误消息定义)。其次, $(document).ready()
仅表示主要文档内容已加载,而不表示 MathJax 已完成排版(甚至开始排版)。在你的情况下,你已经要求加载几个 TeX 扩展,这导致 MathJax 在开始排版之前必须等待它们到达。 $(document).ready()
将 运行 在加载之前,因此在排版发生之前,因此在带有 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>
这里我们使用 startup.pageReady()
函数来调用默认的页面准备函数(它进行初始排版),并使用 returns 的承诺来添加点击事件处理程序.这可确保在执行此操作之前已进行排版。我还添加了 CSS 以在鼠标移到可点击的数学上时更改指针,以显示可以点击的视觉指示。
我正在使用 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>
点击事件无效,因为 id="" 尚未创建。我试过像这样在 MathJax 排版后使用 promises。
<script>
$(document).ready(function () {
MathJax.startup.promise.then(function () {
$("#someid").click(function () {
some code ....
})
})
})
Uncaught TypeError: Cannot read property 'promise' of undefined
我也试过 MathJax.typesetPromise()。它也没有用。 提前致谢。
这里有几个问题。首先,因为 MathJax 脚本有 async
属性,你不知道它什么时候会被处理,它可能在你的 $(document).ready()
调用之后,因为它看起来是在这个大小写(因为 MathJax.startup
未根据错误消息定义)。其次, $(document).ready()
仅表示主要文档内容已加载,而不表示 MathJax 已完成排版(甚至开始排版)。在你的情况下,你已经要求加载几个 TeX 扩展,这导致 MathJax 在开始排版之前必须等待它们到达。 $(document).ready()
将 运行 在加载之前,因此在排版发生之前,因此在带有 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>
这里我们使用 startup.pageReady()
函数来调用默认的页面准备函数(它进行初始排版),并使用 returns 的承诺来添加点击事件处理程序.这可确保在执行此操作之前已进行排版。我还添加了 CSS 以在鼠标移到可点击的数学上时更改指针,以显示可以点击的视觉指示。