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

jQuery load加载的HTML内容中GlslCanvas脚本无法识别canvas元素问题咨询

问题根本原因

你遇到的是异步DOM加载和脚本初始化时序不匹配的问题:

  • jQuery.load()是异步请求,$(document).ready触发时,你的博文内容还在请求中,并未插入到页面DOM里
  • GlslCanvas默认只会在自身脚本加载完成时,扫描当前页面已存在的.glslCanvas元素做初始化,后续动态插入的canvas不会被自动识别

修复方案

你只需要修改load.js的逻辑,在每块博文内容加载完成后,手动触发对应canvas的GlslCanvas初始化即可,具体改法如下:

步骤1:修改load.js的加载逻辑

利用jQuery.load()的回调函数,等内容插入DOM完成后,再初始化新增的GlslCanvas元素:

$(document).ready(function () {
    // 公共组件加载
    $('#header').load("./Includes/include_header.html");
    $('#footer').load("./Includes/include_footer.html");
    $('#navbar').load("./Includes/include_navbar.html");

    // 封装博文加载+初始化逻辑,避免重复代码
    function loadPost(containerId, postPath) {
        $(containerId).load(postPath, function() {
            // 内容加载完成后,遍历当前容器内所有.glslCanvas元素手动初始化
            $(this).find('.glslCanvas').each(function() {
                new GlslCanvas(this);
            });
        });
    }

    // 加载博文
    loadPost('#post3', "./Posts/2021-11-16-Starting-Book-of-Shaders.html");
    loadPost('#post2', "./Posts/2021-11-12-Lecture-1.html");
    loadPost('#post1', "./Posts/2021-11-12-Start.html");
});

步骤2:调整GlslCanvas引入顺序

调整head里的引入顺序,保证GlslCanvas在load.js之前加载完成,避免调用时找不到对象:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- 先加载GlslCanvas,保证load.js里调用时构造函数已存在 -->
<script type="text/javascript" src="https://rawgit.com/patriciogonzalezvivo/glslCanvas/master/dist/GlslCanvas.js"></script>
<script src="/Includes/load.js"></script>

建议移除原引入的defer属性,避免异步加载带来的时序问题。

验证方式

改完后刷新页面,动态加载的博文中的canvas就会被正常识别渲染,不需要再把GlslCanvas引入放到单独的博文页面里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:15:03