LoginSignup
3
1

More than 1 year has passed since last update.

MathMLを使って数式をWebに表示して、さらに動的に追加されたDOMのスニペットも数式表示化

Posted at

いま開発中のアプリでどうしても平方根やその他の数式を表示したいので、MathMLというJavascriptライブラリを使う。

↓まずはMathJaxのJavaScriptライブラリを読み込み

quiz.html.erb
<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.0.1/es5/tex-mml-chtml.js"></script>

↓HTMLにべた書きすべき「ルート3」はMathJaxではこのように記述するので・・・

<math><msqrt><mi>3</mi></msqrt></math>

↓これをこんなふうにHTMLにべた書きすると・・・

quiz.html.erb
<div class='answer' id='answer-1'>
    <h3 class='n'></h3>
    <p><math><msqrt><mi>3</mi></msqrt></math></p>
</div>

ふむ、静的に初めからHTMLにべた書きしたスニペットは正しく数式にしてくれているようだった。
スクリーンショット 2022-11-04 12.22.52.png

しかし、ここからJavaScriptを用いて次の問題や解答の選択肢を追加すると、べたの<math><msqrt><mi>3</mi></msqrt></math>が表示されてしまったり、ルート部分が消えてただの「3」になってしまう。
↓ルート3を表示したかったのに・・・
スクリーンショット 2022-11-04 12.20.05.png

今回は問題に対する答えを4択ないし8択で選んで答えるというクイズゲームなので、後から動的に差し替える問題と答えのスニペットもちゃんときれいに数式化してもらわなくちゃ困る訳である。

これはおそらく後から動的に追加したDOMにはイベントハンドラがないというjQueryでよくひっかかる話と似ていて、あとからHTMLに追加されたMathMLスニペットに対してレンダリング処理をかけていないことが理由だろう。そうとしか考えられない。
そこでMathMLのDocumentを漁っているとやっぱり再レンダリングする関数がちゃんとあったので、再レンダリングしたいタイミングで

quiz.js
MathJax.texReset();
MathJax.typeset();

をかけてやると、問題なくすべてのDOMをレンダリングしてくれた。

↓やったー
スクリーンショット 2022-11-04 12.22.22.png

3
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1