处理jQuery.getScript中的错误

时间:2009-09-10 17:08:31

标签: javascript jquery ajax

jQuery的getScript函数似乎不支持错误回调函数。我不能在这里使用全局ajax错误处理代码,本地错误函数将是理想的。

回调获取data / textStatus的文档似乎不正确 - 回调函数都没有。

关于我如何检测到对getScript的调用失败的任何建议(例如服务器不可用)?

编辑:只看源代码,似乎只在成功时调用回调,数据总是设置为null而textStatus没有定义(因为它是一个成功的回调,我猜)。该功能的文档非常不正确。

6 个答案:

答案 0 :(得分:30)

从jQuery 1.5开始,你可以在调用getScript时添加.fail。

$.getScript('foo.js', function(){
    //script loaded and parsed
}).fail(function(){
    if(arguments[0].readyState==0){
        //script failed to load
    }else{
        //script loaded but failed to parse
        alert(arguments[2].toString());
    }
})

http://api.jquery.com/jQuery.getScript/#handling-errors

答案 1 :(得分:17)

对于跨域脚本标记,成功事件将触发,但错误事件不会触发;无论你使用什么语法。您可以尝试这种方法:

  1. 使用handle = window.setTimeout
  2. 创建错误处理程序并在几秒钟后将其设置为触发
  3. 在成功回调函数中,使用window.clearTimeout(handle)
  4. 取消超时

    示例代码:

    var timeoutId; // timeout id is a global variable
    timeoutId = window.setTimeout(function() {
        alert("Error");
    }, 5000);
    $.getScript("http://other-domain.com/script.js", function(){
        window.clearTimeout(timeoutId);
    });
    

答案 2 :(得分:6)

全局JQuery Ajax-ErrorHandler将起作用!

在$ .getScript-Call之前设置错误处理程序来缓存错误。

$(document).ajaxError(function(e, xhr, settings, exception) {
    alert('error in: ' + settings.url + ' \n'+'error:\n' + exception );
});

如JQuery手册中所述:http://api.jquery.com/ajaxError/

答案 3 :(得分:4)

jquery.ajax有另一种处理错误的方法

jQuery.ajax({
        type: "GET",
        url: 'http://www.example.com/script_test.js',
        dataType: "script",
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log('error ', errorThrown);
        },
        success:function(){
            console.log('success');
        }
    });

答案 4 :(得分:0)

除非您不使用jQuery 2.0+ $.getScript,否则似乎是错误的选择,因为它在进行跨域请求时不提供任何错误处理功能。这些都不起作用:failcompleteerrorstatusCode将不起作用。我已经使用jQuery 1.11.2进行了检查
如果必须在第一个脚本失败时加载后备脚本,则setTimeout的解决方案将太慢。
在这种情况下,script.onerror回调似乎是最干净的方法。

var script = document.createElement('script');
document.head.appendChild(script);
script.onload = function () {
    // loaded
};
script.onerror = function () {
    // failed
};
script.src = 'https://example.com/main.js';

$.Deferrred结合使用可提供可靠的方法来构建复杂的加载程序。

var libLoaded = $.Deferred();
var script = document.createElement('script');
document.head.appendChild(script);
script.onload = libLoaded.resolve;
script.onerror = function () {
    // load fallback script, no error handling
    $.getScript('/fallbackLib.js')
        .done(libLoaded.resolve)
};
script.src = 'https://example.com/lib.js';

$.when(libLoaded).then(
    // fanally I can use my lib safly
);

答案 5 :(得分:-1)

这有点像黑客,但是......

您可以在加载的脚本中声明一个变量,并在加载脚本后检查它(假设完整函数仍然会触发):

script_test.js:

var script_test = true;

然后:

$.getScript("script_test.js", function ()
{
    if (typeof script_test !== undefined) alert("script has been loaded!");
});

或者您可以尝试查看脚本中是否有任何内容,实际存在 - 函数,变量,对象等。


更通用的方法是在要加载的脚本中添加一个自执行函数,并使它们在“主”脚本中执行一个函数:

main_script.js:

function scriptLoaded(scriptName)
{
    alert(scriptName + " loaded!");
}

$.getScript("script_test.js");

script_test.js:

(function ()
{
    scriptLoaded("script_test.js");
})();