div 中的 MathJax 高度不正确
MathJax in div incorrect height
我想弄清楚为什么 MathJax 渲染块给我 div 的错误高度。密码是
<div class="text-field" id='inner-text'>\(\sqrt{b^{a}\frac{\partial y}{\partial x}}\)</div>
和CSS
.text-field {
display: inline-block;
overflow: hidden;
max-width: 15em;
}
当下面的JS片段是运行
MathJax.typeset();
let text = document.getElementById("inner-text");
console.log(text.clientHeight,
text.offsetHeight,
text.getBoundingClientRect().height,
window.getComputedStyle(text).getPropertyValue('height'));
控制台给出
41 41 41.25 "41.25px"
但是,在检查元素中:
实际高度与可通过 JS 访问的任何高度选项都不一致。这是怎么回事,应该怎样才能得到准确的高度值?
问题是创建可视化需要 MathJax 时间。我提出的解决方案的想法是给 MathJax 一些时间,当它准备好时,我们就采用元素的大小。
我做了两个版本的代码。两者都可以在 Firefox、Chrome、Edge...等中正常工作
选项 1:
脚本等待 MathJax 加载,然后再给它 100 毫秒来完成,然后获取 inner-text
的大小
var checkEx = setInterval(function () {
let wrap = document.getElementById("inner-text");
var text = wrap.getElementsByClassName('MathJax')[0];
if (text) {
setTimeout(() => {
console.log(wrap.getBoundingClientRect().height, wrap.getBoundingClientRect().width);
}, 100);
clearInterval(checkEx);
}
}, 100);
.text-field {
display: inline-block;
overflow: hidden;
max-width: 15em;
}
<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/tex-mml-chtml.js"></script>
<div class="text-field" id='inner-text'>\(\sqrt{b^{a}\frac{\partial y}{\partial x}}\)</div>
选项 2
脚本等待 MathJax 加载然后开始获取元素的大小。当尺寸停止变化时... return inner-text
的尺寸
var elhg;
var elwg;
var checkEx = setInterval(function () {
let wrap = document.getElementById("inner-text");
var text = wrap.getElementsByClassName('MathJax')[0];
if (text) {
elHeight = wrap.getBoundingClientRect().height;
elWidth = wrap.getBoundingClientRect().width;
if (elhg === elHeight && elwg === elWidth) {
console.log(elHeight, elWidth);
clearInterval(checkEx);
}
elhg = elHeight;
elwg = elWidth;
}
}, 100);
.text-field {
display: inline-block;
overflow: hidden;
max-width: 15em;
}
<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/tex-mml-chtml.js"></script>
<div class="text-field" id='inner-text'>\(\sqrt{b^{a}\frac{\partial y}{\partial x}}\)</div>
我想弄清楚为什么 MathJax 渲染块给我 div 的错误高度。密码是
<div class="text-field" id='inner-text'>\(\sqrt{b^{a}\frac{\partial y}{\partial x}}\)</div>
和CSS
.text-field {
display: inline-block;
overflow: hidden;
max-width: 15em;
}
当下面的JS片段是运行
MathJax.typeset();
let text = document.getElementById("inner-text");
console.log(text.clientHeight,
text.offsetHeight,
text.getBoundingClientRect().height,
window.getComputedStyle(text).getPropertyValue('height'));
控制台给出
41 41 41.25 "41.25px"
但是,在检查元素中:
实际高度与可通过 JS 访问的任何高度选项都不一致。这是怎么回事,应该怎样才能得到准确的高度值?
问题是创建可视化需要 MathJax 时间。我提出的解决方案的想法是给 MathJax 一些时间,当它准备好时,我们就采用元素的大小。
我做了两个版本的代码。两者都可以在 Firefox、Chrome、Edge...等中正常工作
选项 1:
脚本等待 MathJax 加载,然后再给它 100 毫秒来完成,然后获取 inner-text
var checkEx = setInterval(function () {
let wrap = document.getElementById("inner-text");
var text = wrap.getElementsByClassName('MathJax')[0];
if (text) {
setTimeout(() => {
console.log(wrap.getBoundingClientRect().height, wrap.getBoundingClientRect().width);
}, 100);
clearInterval(checkEx);
}
}, 100);
.text-field {
display: inline-block;
overflow: hidden;
max-width: 15em;
}
<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/tex-mml-chtml.js"></script>
<div class="text-field" id='inner-text'>\(\sqrt{b^{a}\frac{\partial y}{\partial x}}\)</div>
选项 2
脚本等待 MathJax 加载然后开始获取元素的大小。当尺寸停止变化时... return inner-text
var elhg;
var elwg;
var checkEx = setInterval(function () {
let wrap = document.getElementById("inner-text");
var text = wrap.getElementsByClassName('MathJax')[0];
if (text) {
elHeight = wrap.getBoundingClientRect().height;
elWidth = wrap.getBoundingClientRect().width;
if (elhg === elHeight && elwg === elWidth) {
console.log(elHeight, elWidth);
clearInterval(checkEx);
}
elhg = elHeight;
elwg = elWidth;
}
}, 100);
.text-field {
display: inline-block;
overflow: hidden;
max-width: 15em;
}
<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/tex-mml-chtml.js"></script>
<div class="text-field" id='inner-text'>\(\sqrt{b^{a}\frac{\partial y}{\partial x}}\)</div>