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

能否在同一HTML文件中同时使用Highlight.js与Prism.js测试并修改配色?

解决Highlight.js与Prism.js共存时保留pre/code标签的问题

我知道这段HTML代码存在安全问题,仅用于测试把Highlight.js的CSS配色改成和Prism.js一致,不会用到正式站点里。我想在同一个HTML文件里测试这两个语法高亮库,所以给每个代码块的外层容器分别加了prismjs和highlightjs类来区分:

<div class="prismjs">
  <pre><code class="language-css">p { color: red }</code></pre>
</div>

<div class="highlightjs">
  <pre><code class="language-html">...</code></pre>
</div>

一开始我用下面的JS代码初始化两个库:

const high = document.querySelectorAll('.higlightjs');

high.forEach(el => 
{
  hljs.highlightElement(el);
});

const prism = document.querySelectorAll('.prismjs');

Prism.highlightElement(prism);

调整脚本顺序后基本能运行,但Highlight.js会把pre和code标签删掉,我得保留这些标签才行。

修正方案

问题出在调用Highlight.js的方法时选错了元素——hljs.highlightElement()应该作用于code标签,而不是外层的.highlightjs容器。同时Prism.js的初始化也需要调整元素选择器和执行顺序,确保能正确找到目标元素。

修正后的完整HTML代码如下:

<!DOCTYPE html>
<html lang="pt">

<head>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/styles/default.min.css" />
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/themes/prism-dark.min.css" />
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Realces de sintaxe</title>
</head>

<body>

  <h1>Highlight.js</h1>

  <div class="highlightjs">
    <pre>
    <code class="language-markdown" aria-hidden="true">
    #### Cabeçalho nível 4 [#](#cabecalho){.anchor}
    Testando `código` em *itálico*
    </code>
  </pre>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/languages/markdown.min.js"></script>
  <script>
    document.addEventListener('DOMContentLoaded', (event) => {
      // 选中每个highlightjs容器内的code元素进行高亮
      document.querySelectorAll('.highlightjs code').forEach((el) => {
        hljs.highlightElement(el);
      });
    });
  </script>

  <h1>Prism.js</h1>

  <div class="prismjs">
    <pre class="demo__pre"><code class="demo-pre language-markdown" aria-hidden="true">
  #### Cabeçalho nível 4 [#](#cabecalho){.anchor}
  
  Testando `código` em *itálico*
  </code></pre>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/prism.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/components/prism-markdown.min.js"></script>
  <script>
    // 选中每个prismjs容器内的code元素进行高亮
    const prismCodes = document.querySelectorAll('.prismjs code');
    prismCodes.forEach(el => {
      Prism.highlightElement(el);
    });
  </script>

</body>

</html>

关键修正点

  • Highlight.js部分:把选择器从.highlightjs改成.highlightjs code,让highlightElement()直接作用于code标签,这样只会对代码内容做高亮处理,不会删除原有的pre和code结构。
  • Prism.js部分:把Prism的代码块移到Prism脚本之前,确保脚本执行时能找到DOM元素;同时用.prismjs code选择目标元素,调用Prism.highlightElement()(而不是Prism.highlight(),后者针对字符串而非DOM元素)完成初始化。

内容的提问来源于stack exchange,提问作者Oo'-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:09:22