Chrome/Edge中脚本加载后执行函数失效,Firefox运行正常如何解决?
问题修复方案
根因分析
- 当前脚本加载逻辑没有严格控制依赖顺序:
popup-withdadobeancode.js依赖createJS提供的cjs对象,现有逻辑没有保证createJS加载完成后再加载执行popup-withdadobeancode.js - Chrome 中动态创建的
script标签默认async = true,脚本加载完成后会立即执行,不按插入顺序触发,导致执行时序和Firefox不一致,出现依赖对象找不到的报错
修复方案
调整脚本加载逻辑,强制按依赖顺序加载,禁用动态脚本的异步加载特性,修改后的核心代码如下:
<script> var canvas, stage, exportRoot, anim_container, dom_overlay_container, fnStartAnimation; function initSol() { canvas = document.getElementById("canvas"); anim_container = document.getElementById("animation_container"); dom_overlay_container = document.getElementById("dom_overlay_container"); var comp=AdobeAn.getComposition("XXXXXX"); var lib=comp.getLibrary(); var loader = new createjs.LoadQueue(false); loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)}); loader.addEventListener("complete", function(evt){handleComplete(evt,comp)}); var lib=comp.getLibrary(); loader.loadManifest(lib.properties.manifest); } function handleFileLoad(evt, comp) { //some stuff } function handleComplete(evt,comp) { //some stuff } function loadJs(src) { return new Promise(function(resolve, reject) { let scrp = document.createElement('script'); scrp.src = src; // 核心修复:禁用异步加载,保证脚本按插入顺序执行 scrp.async = false; scrp.onload = () => resolve(scrp); scrp.onerror = (err) => reject(new Error(`脚本加载失败: ${src}, 错误信息: ${err.message}`)); document.body.append(scrp); }); } // 按依赖顺序加载:先加载createJS,完成后再加载客户侧脚本,全部加载完成后执行业务逻辑 loadJs("https://code.createjs.com/createjs-2015.11.26.min.js") .then(() => loadJs("https://www.customerweb.com/resources/popup-withdadobeancode.js?12345678")) .then(() => initSol()) .catch(err => { // 可自定义加载失败兜底逻辑 console.error(err); }); var urlCheck = "check"; var urlClose = "close"; </script> <div id="animation_container" style="background-color:rgba(255, 255, 255, 0.00); width:910px; height:512px"> <canvas id="canvas" width="910" height="512" style="position: absolute; display: block; background-color:rgba(255, 255, 255, 0.00);"></canvas> <div id="dom_overlay_container" style="pointer-events:none; overflow:hidden; width:910px; height:512px; position: absolute; left: 0px; top: 0px; display: block;"> </div> </div>
修复说明
- 删除了原来静态引入的createJS脚本,统一用
loadJs方法加载,方便控制顺序 - 给动态创建的script标签设置
async=false,让Chrome按插入顺序执行脚本,对齐Firefox的执行逻辑 - 链式调用Promise保证加载顺序:
createJS加载完成 → 客户侧popup-withdadobeancode.js加载完成 → 执行initSol业务逻辑 - 新增错误捕获逻辑,避免加载失败时抛出未捕获异常,可自行扩展重试、兜底展示等逻辑
内容的提问来源于stack exchange,提问作者Raider
相关产品推荐
相关产品推荐

