javascript - getScript 创建 ReferenceError

标签 javascript jquery referenceerror getscript

在开始其余代码之前,我将一些 js 脚本加载到我的 main.js 中。然而,在测试过程中,我注意到有时它会产生以下引用错误(8 个页面加载中有 1 个或类似错误)。

ReferenceError: createContainer is not defined

现在,我能想到的出现此错误的唯一原因是当我执行 startScript() 函数时,并非我的所有文件都已加载或完全可访问。

现在,也许我将其他 .js 文件包含到我的 main.js 中是错误的,所以我想听听您对此的看法。

ma​​in.js 看起来像这样:

$(document).ready(function() {

    //sets and array of files that should be loaded before anything every happens
    var arrFilesToLoad = [  'scripts/global/variables.js',
                            'scripts/global/objects.js',
                            'scripts/global/classes.js'];
    var _error;

    //walks through the array of items that should be loaded and checks for fails
    $.each(arrFilesToLoad , function (key) {
        $.getScript(arrFilesToLoad[key])
            //when a file is loaded with succes
            .done(function () {
                //on default send a message to the console
                console.log(arrFilesToLoad[key] + 'loaded succesfully');
                //if every item is loaded start the script
                if(key == (arrFilesToLoad.length - 1)){
                    startScript();
                }
            })
            //when a file fails to load
            .fail(function () {
                //add the file that failed to load to a string message
                _error += arrFilesToLoad[key] + " - failed to load. \n";
                //show an alert with what file failed to load
                if(key == (arrFilesToLoad.length - 1)){
                    alert(_error);
                }
            });
    });

    function startScript () {
        //set a variable which contains a function that returns a DIV with styling
        var oContainer = createContainer();
        var oMainMenu = new Menu(arrMainMenu);
        $(oContainer).append(createMenu(oMainMenu));
        $('body').append(oContainer);
    }

});

最佳答案

问题是因为您正在加载 3 个脚本,并且大概只有其中一个包含 createContainer() 函数,但您在加载最后一个请求时执行代码。这意味着你有一个竞争条件。最后一个请求不能保证是最后一个完成的。如果在完成最终请求时仍在加载其他脚本,您将看到此错误。

您可以修改您的逻辑,以便仅在所有脚本都加载后才执行回调。试试这个:

var requests = [];
$.each(arrFilesToLoad , function (key) {
    requests.push($.getScript(arrFilesToLoad[key]));
});

$.when.apply(this, requests)
    .done(startScript)
    .fail(function() {
        console.log('one or more scripts failed to load');
    });

function startScript() {
    var oContainer = createContainer();
    var oMainMenu = new Menu(arrMainMenu);
    $(oContainer).append(createMenu(oMainMenu));
    $('body').append(oContainer);
}

关于javascript - getScript 创建 ReferenceError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31472088/

相关文章:

javascript - 数组等于自身加数字 = NaN

javascript - 如何在给出提示后将函数的结果输出到同一个 HTML 页面?

javascript - 获取可 View 像区域的坐标

javascript - 为什么重新分配导入的对象会抛出 ReferenceError?

javascript - 浏览器语言检测 : inconsistency between user agent and window. navigator.language

Javascript、Jquery 在本地主机中工作正常,但在部署的站点中却不行?

javascript - Angular 指令与 jquery 事件仅触发一次

javascript - 仅针对链接行中的特定 <td> 禁用链接

Javascript:基本 for 循环不起作用

google-apps-script - 消除Ref#引用不存在的问题