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

使用hx-get加载bar_chart.html时JavaScript无法执行的问题

问题原因

当用{% include %}引入模板时,脚本是服务器端渲染后页面初始HTML的一部分,浏览器加载页面时会自动解析执行所有脚本;而htmx异步加载HTML内容时,出于安全考量默认不会执行其中的<script>标签,因此图表初始化代码无法运行,导致图表不显示。

解决办法

以下是几种可行的方案,按推荐程度排序:

方案1:提取初始化逻辑为全局函数,通过htmx事件触发

  1. 在主模板(如base.html)中定义全局的图表初始化函数,把bar_chart.html里的脚本逻辑移到这里:
function initBarChart() {
  // 替换为你实际的图表初始化代码(比如Chart.js的配置)
  const ctx = document.getElementById('bar-chart').getContext('2d');
  // 先销毁已有实例,避免重复创建报错
  if (window.barChartInstance) {
    window.barChartInstance.destroy();
  }
  window.barChartInstance = new Chart(ctx, {
    type: 'bar',
    data: { /* 数据配置 */ },
    options: { /* 选项配置 */ }
  });
}
  1. 修改bar_chart.html,只保留HTML结构(比如<canvas id="bar-chart"></canvas>),移除内部的脚本。
  2. 在发起hx-get请求的元素上,添加htmx的after-request事件监听,触发初始化函数:
<button hx-get="{% url 'your_bar_chart_view' %}" 
        hx-target="#chart-container" 
        hx-on::after-request="initBarChart()">
  加载柱状图
</button>

方案2:让htmx执行加载的脚本(谨慎使用)

如果你的异步加载内容完全可控,没有XSS风险,可以通过hx-process-scripts属性让htmx执行返回HTML中的脚本:

<div hx-get="{% url 'your_bar_chart_view' %}" 
     hx-target="#chart-container" 
     hx-process-scripts="true">
</div>

或者在bar_chart.html的<script>标签上添加data-htmx-eval="true":

<script data-htmx-eval="true">
  // 你的图表初始化代码
</script>

方案3:通过自定义事件触发初始化

  1. 在bar_chart.html的脚本中,监听一个自定义事件:
document.addEventListener('triggerBarChartInit', function() {
  // 图表初始化逻辑
});
  1. 在发起请求的元素上,加载完成后触发该事件:
<div hx-get="{% url 'your_bar_chart_view' %}" 
     hx-target="#chart-container" 
     hx-on::after-request="document.dispatchEvent(new Event('triggerBarChartInit'))">
</div>
注意事项
  • 确保图表容器(如canvas)的ID唯一,避免多个实例冲突。
  • 每次初始化前销毁已有图表实例,防止内存泄漏或渲染异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:31:31