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

点击按钮修改div内容时插入的script脚本无法执行如何解决

问题根因

通过innerHTML插入的<script>标签不会被浏览器解析执行,这是浏览器内置的安全策略,目的是防范恶意脚本注入攻击。仅页面初始加载时解析到的、或是通过document.createElement标准DOM API动态创建插入的script标签才会被正常加载执行。
另外补充说明:你原有写法中将script标签嵌套在canvas标签内部的写法本身不规范,canvas标签内部的内容仅作为浏览器不支持canvas特性时的降级展示内容,仅初始加载时浏览器会额外解析内部的script,动态插入时该写法也会进一步导致逻辑异常。

修复方案

方案1:拆分插入逻辑(适配单按钮场景)

先插入canvas元素,再单独创建script标签插入DOM,代码如下:

document.querySelector(".grafica-today").addEventListener("click", function() {
    const container = document.querySelector(".grafica-recipiente");
    // 插入canvas元素
    container.innerHTML = "<canvas id='graficaDiaria'></canvas>";
    // 手动创建script标签
    const dynamicScript = document.createElement('script');
    dynamicScript.src = 'js/graficDiaria.js';
    container.appendChild(dynamicScript);
});

方案2:封装通用方法(适配多按钮切换场景)

如果有多个按钮对应不同的图表渲染需求,可以封装通用逻辑减少重复代码:

/**
 * 向容器插入canvas和对应渲染脚本
 * @param {string} canvasId canvas元素的ID
 * @param {string} scriptPath 对应渲染脚本的路径
 */
function loadGrafica(canvasId, scriptPath) {
    const container = document.querySelector(".grafica-recipiente");
    // 清空原有内容
    container.innerHTML = '';
    // 创建并插入canvas
    const canvas = document.createElement('canvas');
    canvas.id = canvasId;
    container.appendChild(canvas);
    // 创建并插入渲染脚本
    const script = document.createElement('script');
    script.src = scriptPath;
    container.appendChild(script);
}

// 绑定不同按钮的点击事件
document.querySelector(".grafica-today").addEventListener("click", () => {
    loadGrafica('graficaDiaria', 'js/graficDiaria.js');
});
document.querySelector(".grafica-global").addEventListener("click", () => {
    loadGrafica('graficaMundial', 'js/graficaMundial.js');
});
注意事项
  • 插入顺序保证canvas先进入DOM,再加载执行渲染脚本,避免脚本执行时获取不到canvas元素的问题
  • 如果需要避免同一脚本重复加载,可以自行添加脚本加载状态的缓存判断逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:06:03