You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过JS模板字面量渲染KaTeX字符串失效问题求助

JavaScript模板字面量中KaTeX无法渲染的问题

问题背景

已在HTML中引入KaTeX核心脚本和auto-render插件:

<script src=@routes.Assets.at("katex/katex.min.js")></script>
<script src=@routes.Assets.at("katex/contrib/auto-render.min.js")></script>

使用Scala Play框架时,服务端模板中的KaTeX语法能正常渲染,但通过JavaScript模板字面量动态生成的内容(如$$10 b^2$$)只会显示原始字符串,无法渲染为公式。相关代码片段:

function getQuestionBodyString(question, conceptInfo) {
    return ` 
      <tr>
        <td> ${question.questionId} </td>
        <td><form class="form-inline">${getStudentQuestionPrompt(question)}</form>
        <td> ${getAnswerColumnForQuestion(question)} </td>
      </tr>
    `
}

function getAnswerColumnForQuestion(question) {
    let answerHTML = `${getAnswerForMCQ(question)}`;
    return answerHTML;
}

function getAnswerForMCQ(question) {
    return "$$10 b^2$$";
}

问题原因

  1. KaTeX的auto-render插件默认只在页面初始加载完成时扫描一次DOM树,渲染其中的KaTeX语法。而JavaScript动态生成的内容是在初始渲染之后才插入DOM的,不会被自动扫描处理。
  2. 直接返回$$10 b^2$$字符串只是普通文本内容,没有触发KaTeX的渲染逻辑,必须主动调用KaTeX的API来处理这些字符串。

解决方案

方案一:动态插入DOM后手动触发渲染

在将生成的HTML插入DOM之后,调用renderMathInElement方法,针对新插入的元素重新扫描渲染:

示例代码:

// 生成HTML字符串
const questionHTML = getQuestionBodyString(question, conceptInfo);
// 插入到页面的目标表格中
const table = document.getElementById('question-table');
table.insertAdjacentHTML('beforeend', questionHTML);

// 针对新插入的<tr>元素触发KaTeX渲染
const newRow = table.lastElementChild;
renderMathInElement(newRow, {
    delimiters: [
        {left: '$$', right: '$$', display: true},
        {left: '$', right: '$', display: false}
    ]
});

方案二:直接生成KaTeX渲染后的HTML字符串

修改getAnswerForMCQ函数,使用KaTeX的renderToStringAPI直接生成渲染好的HTML代码,再返回给模板:

示例代码:

function getAnswerForMCQ(question) {
    try {
        // 直接生成渲染后的HTML
        return katex.renderToString("10 b^2", {
            throwOnError: false, // 忽略渲染错误,避免页面崩溃
            displayMode: true
        });
    } catch (error) {
        // 渲染失败时返回原始字符串作为降级处理
        return "$$10 b^2$$";
    }
}

注意:使用该方案时,无需依赖auto-render插件,仅需核心的katex.min.js即可。

补充说明

Scala Play框架的服务端模板能正常渲染,是因为模板在服务端生成HTML后发送到客户端,页面初始加载时auto-render插件会扫描所有已存在的DOM元素,自然能处理其中的KaTeX语法;而JavaScript动态生成的内容是客户端后续添加的,不在初始扫描范围内,所以需要主动触发渲染。

内容的提问来源于stack exchange,提问作者Maniyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:05:22