MathJax — оптимизация производительности при множественном наборе

Я пытаюсь реализовать частичный рендеринг в моем редакторе Markdown, конвертируя Markdown/Tex только в измененных абзацах. Итак, у меня есть элемент #preview, который содержит несколько элементов .preview_section, содержащих преобразованные абзацы HTML. Когда я обновляю один или несколько элементов .preview_section, я хочу, чтобы MathJax обрабатывал только эти элементы.

Я пробовал разные подходы:

  • Передать список измененных элементов .preview_section в качестве параметра набора. Это худшее решение с точки зрения производительности. При передаче более 1 элемента время рендеринга почти умножается на количество элементов.
  • Передайте элемент #preview в качестве параметра набора. Проблема с этим решением заключается в том, что MathJax снова визуализирует уже визуализированный script[type="math/tex; mode=display"]. Я попытался установить конфигурацию tex2jax ignoreClass: "tex2jax_ignore" и добавить .tex2jax_ignore как к немодифицированным элементам .preview_section, так и к уже отрендеренным элементам script, но это не имеет никакого эффекта, так как не обрабатывается препроцессором tex2jax (я полагаю).
  • Передайте элемент #preview в качестве параметра набора, но после удаления всех script[type="math/tex; mode=display"] из предварительного просмотра. Это наиболее эффективно, но я не очень люблю убирать эти скрипты из предварительного просмотра.

Есть ли способ сказать MathJax не обрабатывать эти элементы script? Или любые идеи, прежде чем я погрузимся в исходный код... Спасибо.


person benweet    schedule 26.07.2013    source источник


Ответы (1)


Хорошо, я только что нашел свою проблему. MathJax хранит объект JavaScript в каждом элементе script[type="math/tex"] в DOM. Этот объект, фактически хранящийся в element.MathJax, содержит:

checked: 1
elementJax: Object
preview: span.MathJax_Preview
startNumber: 0
state: 2

где state — состояние предварительного просмотра (2 означает ОБРАБОТАНО). Таким образом, TypeSet не отображает предварительный просмотр снова, если он уже был обработан, если вы не переписываете тег скрипта в DOM (это то, что я делал), в этом случае вы теряете объект MathJax и состояние предварительного просмотра. Вот почему MathJax постоянно перерисовывал все мои сценарии.

person benweet    schedule 27.07.2013
comment
У меня точно такая же проблема. Я могу использовать только некоторые внешние файлы javascript для mathjax, и очень сложно настроить предварительный просмотр. Я использую код chatjax. Вот мой jsfiddle: jsfiddle.net/Zky72/71 Знаете ли вы, можно ли использовать chatjax, чтобы предварительный просмотр был красивым? - person Kasper; 25.09.2013
comment
вы могли бы просто вызвать MathJax.Hub.Queue(["Typeset", MathJax.Hub, element]); для каждого элемента, который необходимо обновить...? - person Mike 'Pomax' Kamermans; 16.04.2014
comment
Это первый подход, но он очень медленный. - person benweet; 16.04.2014