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

IE无法使用动态加载脚本中的JS类问题求助

解决IE11动态加载脚本后无法实例化BasicMask的问题

问题描述

我尝试用jQuery的$.getScript动态加载脚本并实例化其中的BasicMask类,代码如下:

$("#Volumenberechnung").click(function(){ 
    if($(".highlight").length){ 
        var markierteElemente=$( ".highlight" ).toArray(); 
        var mask; 
        //zuerst das Script der BasisMaske anfragen 
        var filename="globalMask.js"; 
        var dirname="/static/scripts/maskenScripte/" 
        var uri="/getScript/"+filename+dirname; 
        $.getScript(uri).done(function(script, text){ 
            mask=new BasicMask(450,700,300,600,xmlKontext); 
            mask.setAdditionalMetadata(markierteElemente); 
            $.post("/getMask/sendungVolumenberechnung.html").done(function(doc){ 
                mask.fillWithHTML(doc); 
            }); 
        }); 
    }else{ 
        alert("Es wurde kein Element ausgewählt!"); 
    } 
}); 

通过IE调试器确认脚本已成功加载,但IE11始终提示BasicMask是未知类型,Firefox和Chrome则完全正常。另外,我用Flask做开发服务器,另一处使用$.getScript但不实例化对象的场景运行没问题。


解决方案

针对IE11的兼容性特性,这几个方法应该能解决你的问题:

1. 强制将BasicMask暴露到全局作用域

IE11对动态加载脚本的局部作用域处理非常严格,如果globalMask.js里的BasicMask是普通函数或ES6类,默认可能不会挂载到全局。你可以在脚本末尾手动把它绑定到window对象:

// 在globalMask.js的最后添加这行
window.BasicMask = BasicMask;

这样在$.getScript的回调里就能直接访问到全局的BasicMask了。

2. 给脚本URL添加防缓存参数

IE11的缓存机制经常会搞事情——可能你加载的是旧版本的脚本(里面还没定义BasicMask)。给URL加个时间戳参数,强制浏览器拉取最新版本:

var filename="globalMask.js";
var dirname="/static/scripts/maskenScripte/";
// 添加时间戳参数
var timestamp = new Date().getTime();
var uri="/getScript/"+filename+dirname+"?t="+timestamp;
$.getScript(uri).done(function(script, text){
    // 你的原有代码
});

3. 改用原生动态脚本加载方式

有时候jQuery的$.getScript在IE11里的执行时机不如原生API可靠,试试用原生的脚本创建方法:

$("#Volumenberechnung").click(function(){
    if($(".highlight").length){
        var markierteElemente=$( ".highlight" ).toArray();
        var mask;
        var filename="globalMask.js";
        var dirname="/static/scripts/maskenScripte/";
        
        var script = document.createElement('script');
        script.src = "/getScript/"+filename+dirname;
        // 监听加载完成事件
        script.onload = function() {
            // 这里肯定能访问到BasicMask了
            mask=new BasicMask(450,700,300,600,xmlKontext);
            mask.setAdditionalMetadata(markierteElemente);
            $.post("/getMask/sendungVolumenberechnung.html").done(function(doc){
                mask.fillWithHTML(doc);
            });
        };
        // 处理加载失败的情况
        script.onerror = function() {
            alert("脚本加载失败,请检查路径!");
        };
        document.head.appendChild(script);
    }else{
        alert("Es wurde kein Element ausgewählt!");
    }
});

4. 检查是否有未转译的ES6语法

如果BasicMask是用ES6的class关键字定义的,IE11完全不支持原生ES6类,必须用Babel之类的工具把代码转译成ES5语法,否则即使脚本加载了,IE11也识别不了这个类。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:30:37