【问题标题】:Including MathJax script in headers of Blazor app does not render MathML在 Blazor 应用程序的标头中包含 MathJax 脚本不会呈现 MathML
【发布时间】:2020-01-28 00:46:15
【问题描述】:

我正在尝试使用 MathJax 显示 MathML 方程。我在头部包含了 MathML 的脚本参考。对于 Razor 页面应用程序,正确呈现 MathML。在 Blazor(服务器端应用程序)中,它显示为纯线性文本。

当我刷新页面时,它似乎正确呈现了 MathML,但很快又恢复为纯文本。

我正在使用 .NET Core 3.0。我也在 .NET Core 2.2 上尝试过,但也不起作用。 使用下面的脚本不起作用...

<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/mml-svg.js"></script>

但如果我改用这个,

<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML"></script>

在手动刷新页面后才起作用。

<p>
    <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
        <mi>x</mi> <mo>=</mo>
        <mrow>
            <mfrac>
                <mrow>
                    <mo>&#x2212;</mo>
                    <mi>b</mi>
                    <mo>&#x00B1;</mo>
                    <msqrt>
                        <msup><mi>b</mi><mn>2</mn></msup>
                        <mo>&#x2212;</mo>
                        <mn>4</mn><mi>a</mi><mi>c</mi>
                    </msqrt>
                </mrow>
                <mrow>
                    <mn>2</mn><mi>a</mi>
                </mrow>
            </mfrac>
        </mrow>
        <mtext>.</mtext>
    </math>
</p>

它不显示二次方程的 x 值,而是显示“x = - b ± b2 - 4ac 2a ”。省略所有数学符号/格式。

如果我刷新页面,则 MathML 格式会正确呈现。如果我导航到其他页面并返回到使用 MathML 的页面,则必须刷新页面才能看到正确的呈现。

【问题讨论】:

  • 在使用 MathJax 3 是否成功?
  • 不,同样的问题仍然存在。
  • 从那时起,我已经找到了一些将 MathJax 与 Blazor 结合使用的关键...请参阅此处:github.com/limefrogyank/MathJaxBlazor

标签: mathjax blazor


【解决方案1】:

基本的答案是使用这种方式的 MathJax 在 Blazor 中不起作用。任何修改 DOM 的东西都会与 Blazor 发生冲突。

一旦发生 Blazor 重新渲染,Blazor 就会想知道 MathJax 删除的标签发生了什么变化。

要么:

  1. 您需要将此作为组件的一部分呈现,其中 MathML 不是 DOM 的一部分,而是组件的字符串参数。
  2. 对于每次重新渲染,您需要撤消 MathJax 对页面所做的操作,让它重新渲染,然后重新执行 MathJax 的操作。

我已经为 Tex 和 MathML 完成了 #1。对于#2,我只用 Tex 格式完成了这个......我还不能让它与 MathML 一起工作。在我的 repo 中查看方法或尝试 Nuget 包。

https://github.com/limefrogyank/MathJaxBlazor

【讨论】:

  • 我在简单的 Razor 页面中尝试了 mathml 语法,但它不起作用。您是说问题是 Razor 页面正在呈现,并且以某种方式取消了 mathml 标记并使它们成为纯文本。因此,如果我在文档准备好并完全加载后将 mathml 文本放入 html 组件中,它会起作用吗?
  • 不完全是。 Blazor 跟踪已呈现的内容,并将在该组件或任何父组件中的任何参数更改时重新呈现组件。因此,如果您使用 MathJax 的标准方式来渲染 mathml(即等到页面加载,然后查找 $$ 或您设置的任何标记),则创建的任何 mathml 都将被 Blazor 的下一次渲染传递清除。因此,您必须手动呈现 mathML 作为 Blazor 生命周期的一部分。这就是我的图书馆打算做的。 (虽然它需要更新到最新版本的 Blazor)
  • 仅供参考,我更新了上面提到的库,以便该演示适用于最新版本的 Blazor,并且不需要其他组件(删除 BlazorFabric 的东西)yellow-grass-06f48d51e.azurestaticapps.net
  • 感谢您的解释。我已经下载了演示项目并了解了这个解决方案。
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多