Bootstrap 弹出窗口中的 MathJax 未正确显示

MathJax in Bootstrap Popover doesn't show up properly

我在 Bootstrap 弹出窗口中显示 MathJax 方程时遇到问题。

在 DOM 中插入弹出窗口后,我设法渲染了 Tex 方程。但它会在一瞬间改变方程式的大小,这也会将整个弹出窗口向右移动一点。

除了烦人之外,这显然不是预期的结果。此外,虽然这在我的笔记本电脑上有效 "fine",但生产环境中的相同代码 运行 首先会显示格式化的方程式,但是 "size changing thing" 会使它在那里消失。

这是代码:

$('span[data-toggle="popover"]').popover({
  trigger: 'hover',
  placement: 'bottom',
});

$('span').on("inserted.bs.popover", function() {

  var popover = $(this).data("bs.popover");

  if (popover)
    MathJax.Hub.Queue(["Typeset", MathJax.Hub], popover);

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML"></script>

Hover the help icon
<span class="glyphicon glyphicon-question-sign" data-toggle="popover" data-content="$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$"></span>

这种尺寸变化效果是由于指定的 fast preview extension that is part of the combined configuration file

您可以禁用它(见下文)。

$('span[data-toggle="popover"]').popover({
  trigger: 'hover',
  placement: 'bottom',
});

$('span').on("inserted.bs.popover", function() {

  var popover = $(this).data("bs.popover");

  if (popover)
    MathJax.Hub.Queue(["Typeset", MathJax.Hub], popover);

});
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  "fast-preview": {
    disabled: true
  }
});
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML"></script>

Hover the help icon
<span class="glyphicon glyphicon-question-sign" data-toggle="popover" data-content="$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$"></span>

"disappearing" 效果看起来像一个更复杂的问题,因为当 MathJax 的输出出现时容器大小发生(不可避免的)变化并且 pop-over;似乎这会将光标推出检测区域,从而再次删除弹出窗口。

避免这种情况的一种方法是 pre-render data-content(server-side 或将其移动到某处的不可见元素)并将其替换为(CommonHTML 或 SVG)输出.

我注意到这似乎并不能完全解决问题,所以这里可能存在一般性 pop-over 问题。

$('span[data-toggle="popover"]').popover({
  trigger: 'hover',
  placement: 'bottom',
});

const popovers = document.querySelectorAll('span[data-toggle="popover"]');
for (let popover of popovers){
  const div = document.createElement('div');
  div.setAttribute('style', 'position: absolute; top: 0, left:0; width:0, height:0, overflow: hidden; visibility: hidden;'); // display:none works as well but then MathJax will just create anothe div with this style
  div.innerHTML = popover.getAttribute('data-content');
  document.body.appendChild(div);
  MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
  MathJax.Hub.Queue(function(){
    popover.setAttribute('data-content', div.querySelector('.mjx-chtml').outerHTML);
  })
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML"></script>

Hover the help icon
<span class="glyphicon glyphicon-question-sign" data-toggle="popover" data-html="true" data-content="$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$"></span>