javascript - 在执行脚本之前等待 Jinja 完全完成页面渲染
问题描述
是否可以在执行某个脚本之前等待Jinja2完成插入所有模板元素?我正在尝试在页面上使用KaTeX呈现一些数学,该页面还包含一堆模板块。但是,数学是在所有模板块都由 Jinja2 渲染之前渲染的,因此所述块中的任何数学都不会渲染。
我可以设置一个超时时间,比如说 5 秒,然后执行渲染脚本(这可行),但我宁愿使用更优雅的解决方案。按照此处的说明在标签defer
内使用没有任何作用,也没有<script>
<script>
document.addEventListener("DOMContentLoaded", function() {
renderMathInElement(document.body, {
// ...options...
});
});
</script>
是什么event
告诉浏览器一个模板引擎如 Jinja2 已经完成了它的工作?当然不是DOMContentLoaded
,根据上面的。
编辑
这是使用A+ LMS实施的示例课程。麻烦的模板可以在文件夹中找到_templates
。默认模板使用 MathJax,但由于那个特定的库有一些烦人的特性,比如在需要渲染大量数学时速度很慢,所以我决定改用 KaTeX。这是我的模板版本:
{% extends "aplus/layout.html" %}
{% block extrahead %}
<!-- MathJax (LaTex math)
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML" data-aplus></script>
-->
<!-- KaTeX (LaTeX math) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/katex.min.css" integrity="sha384-yFRtMMDnQtDRO8rLpMIKrtPCD5jdktao2TV19YiZYWMDkUR5GQZR/NOVTdquEx1j" crossorigin="anonymous" data-aplus>
<script defer type="text/javascript" src="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/katex.min.js" integrity="sha384-9Nhn55MVVN0/4OFx7EE5kpFBPsEMZxKTCnA+4fqDmg12eCTqGi6+BB2LjY8brQxJ" crossorigin="anonymous" onload="console.log('Hello, this is KaTeX!');" data-aplus></script>
<script data-aplus>
function render_katex() {
if (window.katex) {
renderMathInElement(document.body,{delimiters: [
{left: "\\[", right: "\\]", display: true},
{left: "\\(", right: "\\)", display: false}]}
);
console.log("Math rendered.");
} else {
console.log("KaTeX not loaded.")
};
};
</script>
<script defer type="text/javascript" src="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/contrib/auto-render.min.js" integrity="sha384-kWPLUVMOks5AQFrykwIup5lo0m3iMkkHrD0uJ4H5cjeGihAutqP0yW0J6dpFiVkI" crossorigin="anonymous" onload="setTimeout(render_katex,300);" data-aplus></script>
<!-- Custom course styles -->
<link rel="stylesheet"
href="{{ pathto('_static/course.css', 1) }}"
type="text/css"
data-aplus />
<link rel="stylesheet"
href="{{ pathto('_static/active_element.css', 1) }}"
type="text/css"
data-aplus />
{% endblock %}
编辑 2
指向Pastebin 页面完整源代码的链接。
解决方案
好的,所以我得出结论,最好的选择是简单地等待模板通过 Jinja2。一个人应该等多久?好吧,这取决于一页上有多少练习:
<!-- KaTeX (LaTeX math) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/katex.min.css" integrity="sha384-yFRtMMDnQtDRO8rLpMIKrtPCD5jdktao2TV19YiZYWMDkUR5GQZR/NOVTdquEx1j" crossorigin="anonymous" data-aplus>
<script defer type="text/javascript" src="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/katex.min.js" integrity="sha384-9Nhn55MVVN0/4OFx7EE5kpFBPsEMZxKTCnA+4fqDmg12eCTqGi6+BB2LjY8brQxJ" crossorigin="anonymous" onload="console.log('Hello, this is KaTeX!');" data-aplus></script>
<script defer type="text/javascript" src="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/contrib/auto-render.min.js" integrity="sha384-kWPLUVMOks5AQFrykwIup5lo0m3iMkkHrD0uJ4H5cjeGihAutqP0yW0J6dpFiVkI" crossorigin="anonymous" data-aplus></script>
<script data-aplus>
document.addEventListener("DOMContentLoaded", function() {
const n_of_exercises = $(".exercise").length;
// Using "let" here so that math would render also the first time a page is loaded
const ms = 300;
const render_time = n_of_exercises * ms;
const minimum_render_time = 1200;
if (render_time >= minimum_render_time) {
setTimeout(function() {
renderMathInElement(document.body,{delimiters: [
{left: "\\[", right: "\\]", display: true},
{left: "\\(", right: "\\)", display: false}]}
);
}, render_time);
} else {
setTimeout(function() {
renderMathInElement(document.body,{delimiters: [
{left: "\\[", right: "\\]", display: true},
{left: "\\(", right: "\\)", display: false}]}
);
}, minimum_render_time);
};
console.log("Number of .exercise divs:" + n_of_exercises);
console.log("Render time:" + render_time);
});
</script>
事实证明,无论页面上有多少练习,事情发生仍然需要一些最少的时间。这就是为什么有一个minimum_render_time
指定的。这仅在此特定页面上进行了测试,因此将来可能需要稍微移动值。
推荐阅读
- flutter - firebase 项目所有者更改后未反映在 Flutter Web 部署上的更改
- c - 基于另一个变量对一个值执行 MPI 的所有减少的有效方法?
- python - 将 bytearray.translate() 与表一起使用
- javascript - 在 MongoDB 中检查并将文档项添加到集合的问题
- prolog - Prolog 过程 si(A) 不存在
- matrix - CLAPACK f2c vs MKL:矩阵乘法性能问题
- sql - 用于配对网络活动参与者的关系数据库架构和查询
- css - CSS 根据屏幕大小将边距缩小为零
- filesystems - 如何为并非始终连接的远程驱动器的所有文件名创建可搜索备份?
- pandas - 熊猫将索引复制到新列