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

使用Prism.js动态加载Haskell代码无法高亮的问题求助

我来帮你排查下问题哈,核心是Prism.js的高亮机制和动态内容的适配问题,下面给你拆解原因和对应的解决办法:

问题根源

Prism.js 默认是在页面初次加载完成后,自动扫描所有带language-*类的元素并完成语法高亮。但你通过AJAX动态替换代码内容后,Prism不会自动识别新更新的内容;而你尝试的data-src方法,也需要满足特定条件才能生效。

解决方案一:动态加载后手动触发高亮

修改你的load_code函数,在设置好代码内容和语言类名后,手动调用Prism的highlightElement方法来触发高亮。注意几个细节:

  • 不需要同时加language-haskell和language-markup,只保留language-haskell就够了
  • 要确保Prism核心已经加载完成后再调用方法

修改后的JS代码:

function load_code(probname) {
    var url = 'https://rawgit.com/tuxian-root/hackerrank-solutions/master/' + probname + '.hs';
    var txtFile = new XMLHttpRequest();
    var codeElement = document.getElementById("codecontent");
    
    txtFile.open("GET", url, true);
    txtFile.onreadystatechange = function() {
        if (txtFile.readyState === 4) {
            if (txtFile.status === 200) {
                codeElement.textContent = txtFile.responseText;
                // 设置正确的语言类名
                codeElement.setAttribute("class", "language-haskell");
                // 手动触发Prism高亮当前元素
                Prism.highlightElement(codeElement);
            }
        }
    }
    txtFile.send(null);
}
解决方案二:用Prism的File Highlight插件实现自动加载(对应data-src)

如果想用data-src直接加载远程代码,得满足两个关键条件:

  1. 必须引入Prism的File Highlight插件(Prism核心默认不带这个功能,需要单独下载引入)
  2. data-src必须指向代码的原始纯文本链接,不能是GitHub的网页链接(GitHub网页是HTML格式,不是纯代码)

举个正确的例子:

<!-- 先引入Prism核心,再引入File Highlight插件 -->
<script src="prism.js"></script>
<script src="prism-file-highlight.js"></script>

<!-- 使用raw格式的代码链接,而非GitHub页面链接 -->
<pre><code class="language-haskell" data-src="https://raw.githubusercontent.com/tuxian-root/hackerrank-solutions/master/algorithms/implementation/3d-surface-area.hs"></code></pre>

另外要注意跨域问题:raw.githubusercontent.com一般允许跨域请求,但如果你的页面所在域名有特殊限制,可能需要调整CORS设置。

额外小贴士
  • 确保Prism核心、Haskell语言插件、File Highlight插件(如果用的话)的加载顺序正确:核心→语言插件→功能插件
  • 动态设置代码内容时,用textContent是对的,它会把内容当作纯文本处理,避免HTML解析带来的安全问题和格式错乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:37:42