动态加载jQuery偶尔抛出jQuery是未定义的错误

时间:2014-01-27 16:21:56

标签: jquery dynamic

我们有动态加载的jQuery。这是因为我们有遗留代码没有母版页,当我们决定开始使用jQuery时,所有这些遗留代码都已经引用了一个公共的js文件。因此,我们不是添加对数百个文件的引用,而是更新现有文件以执行以下操作:

function loadjscssfile(filename) {
    var fileref = document.createElement('script')
    fileref.setAttribute("type", "text/javascript")
    fileref.setAttribute("src", filename)

    if (typeof fileref != "undefined")
        document.getElementsByTagName("head")[0].appendChild(fileref)
}
function getRelPath() {
    for (var t = "", n = 0, n = 0; n < document.location.pathname.split("/").length - 3; n++) t += "../";
    return (t)
}

loadjscssfile(getRelPath() + "JavaScript/jquery-1.10.1.js");
loadjscssfile(getRelPath() + "JavaScript/jquery.formatCurrency.js");
loadjscssfile(getRelPath() + "DataValidationFunctions2.js"); 

现在我们已经实现了这一点,我们偶尔会得到“jQuery is undefined”错误,通常来自jquery.formatCurrency.js。当我们没有得到那个错误时,jQuery工作正常,当我们这样做时,它根本不起作用。这是从同一个浏览器(IE10)零星到下一个零星的零星。由于动态代码以正确的顺序加载jquery-1.10.1.js~和~jquery.formatCurrency.js,我认为代码必须在后者之前成功上载前者。

我们还更新了IIS以关闭jQuery所在的JavaScript文件夹上的动态和静态内容压缩,因为我在某处可能会导致此问题。我清除了所有缓存,仍然有问题。

2 个答案:

答案 0 :(得分:0)

您正在异步加载脚本,因此无法保证它们将按所需顺序加载。因此,您应该添加回调功能,以便确保脚本在下一次开始之前已完成加载。

function loadjscssfile(filename, callback) {
    var fileref = document.createElement('script');
    fileref.onreadystatechange = fileref.onload = function () {

        var state = fileref.readyState;

        if (!callback.done && (!state || /loaded|complete/.test(state))) {
            callback.done = true;
            callback();
        }
    };
    fileref.setAttribute("type", "text/javascript");
    fileref.setAttribute("src", filename);

    if (typeof fileref != "undefined") document.getElementsByTagName("head")[0].appendChild(fileref);

}

function getRelPath() {
    for (var t = "", n = 0, n = 0; n < document.location.pathname.split("/").length - 3; n++) t += "../";
    return (t)
}

loadjscssfile(getRelPath() + "JavaScript/jquery-1.10.1.js",function(){
    loadjscssfile(getRelPath() + "JavaScript/jquery.formatCurrency.js",function(){        
        loadjscssfile(getRelPath() + "DataValidationFunctions2.js");
    });
});

答案 1 :(得分:0)

为什么不等到你确定加载了jQuery,例如

loadjscssfile(getRelPath() + "JavaScript/jquery-1.10.1.js");

setTimeout(function() {    
    if (jQuery === undefined) {
        console.log("jQuery not loaded. Checking again.")
        setTimeout(arguments.callee, 40);
        return;
    }

    console.log("jQuery is loaded. Continue");
    // Code that depends on jQuery
    loadjscssfile(getRelPath() + "JavaScript/jquery.formatCurrency.js");
    loadjscssfile(getRelPath() + "DataValidationFunctions2.js");    
}, 40);