【问题标题】:loading script files asynchronously异步加载脚本文件
【发布时间】:2014-06-02 10:04:05
【问题描述】:

我正在使用 $.getScript 加载脚本文件,这很好用。如果我在浏览器中检查网络选项卡,则文件确实下载成功。但是,当我尝试使用脚本文件中的函数时,它们是未定义的。 HTML 中也没有新的 script 标签。

新脚本文件下载后如何使用?

注意:该文件在下载后也不会显示在开发工具的资源选项卡中。

编辑:在下面添加代码和更多信息

正在加载的脚本文件:

var STUD = function () {
return {
    STUDLoaded: function () {
            alert('Working!');
        }
    }
}

function foo()
{
    alert('bar!');
}

js 下载脚本文件并调用函数。

$.getScript(gSiteRoot + 'Scripts/Views/' + ControllerName + '.js')
              .done(function (script, textStatus) {
                  debugger;
                  foo();
                  if ($('#hdnJSClass') != undefined)
                    window[$('#hdnJSClass').val()][$('#hdnJSClassFunc').val()]();
              })
              .fail(function (jqxhr, settings, exception) {
                  GEN._displayNotification('Error', 'There was an error loading the page, please retry', true);
              });

在异步加载后调用函数 foo 会正确触发。所以问题出在窗口调用上,这个调用适用于我的其他 js 函数,但不适用于动态加载的函数。

【问题讨论】:

  • getScript 旨在从服务器检索脚本并立即执行。它不应该用作“包含”。
  • 检查文档,使用成功回调:api.jquery.com/jquery.getscript 然后调用外部脚本内部定义的方法
  • $.getScript 通过 AJAX 下载脚本并在本地对其进行评估。您既不会看到<script> 标签,也不会将其视为资源。如果它不起作用,那么您可能在脚本中的某处有错误。由于它是下载 js 的自定义方式,因此很难调试它。向我们展示代码。
  • 一个关于你如何使用它以及你所期望的例子可能也很有用。
  • window[$('#hdnJSClass').val()] 对象存储在哪里?如果foo() 有效,那么.getScript() 也有效。问题在于存储在您正在寻找的对象(或对象)中的函数

标签: jquery getscript


【解决方案1】:

使用.getScript() 所以:

$.getScript('path/to/file.js', function(data, ts, jqxhr){
    if( jqxhr.status == 200 ){
        // do stuff
    }
    else{
        // failed retrieving file
    }
});

【讨论】:

  • 我正在做这个,见上文。
  • 抱歉,我发帖时没有加载版本。看着它
【解决方案2】:

我发现了问题,STUD 对象中存在语法错误,导致其内容无效。我忘了加上右括号:

var STUD = function () {
return {
    STUDLoaded: function () {
            alert('Working!');
        }
    }
}(); // <-- forgot those

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 2016-07-09
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2019-06-29
    相关资源
    最近更新 更多