Javascript 处理jQuery.getScript中的错误

Javascript 处理jQuery.getScript中的错误,javascript,jquery,ajax,Javascript,Jquery,Ajax,jQuery的函数似乎不支持错误回调函数。我不能在这里使用全局ajax错误处理代码,本地错误函数将是理想的 说明回调获取数据/textStatus的文档似乎不正确-回调既不获取数据也不获取文本 关于如何检测对getScript的调用失败(例如,服务器不可用)有什么建议吗 编辑:只查看源代码,似乎只有在成功时才会调用回调,数据总是设置为null,textStatus未定义(因为我认为这是一个仅成功的回调)。此函数的文档非常不正确。这有点像黑客,但是 您可以在加载的脚本中声明一个变量,并在加载脚本后

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

说明回调获取数据/textStatus的文档似乎不正确-回调既不获取数据也不获取文本

关于如何检测对getScript的调用失败(例如,服务器不可用)有什么建议吗


编辑:只查看源代码,似乎只有在成功时才会调用回调,数据总是设置为null,textStatus未定义(因为我认为这是一个仅成功的回调)。此函数的文档非常不正确。

这有点像黑客,但是

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

脚本_test.js:

var script_test = true;
(function ()
{
    scriptLoaded("script_test.js");
})();
然后:

$.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");
脚本_test.js:

var script_test = true;
(function ()
{
    scriptLoaded("script_test.js");
})();

全局jQueryAjax错误处理程序可以工作

在$.getScript调用设置之前,请使用错误处理程序缓存错误

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

如JQuery手册中所述:.

从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());
    }
})

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

  • 创建一个错误处理程序,并使用
    handle=window.setTimeout
  • 在成功回调函数中,使用
    窗口取消超时。clearTimeout(句柄)
  • 示例代码:

    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);
    });
    

    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');
            }
        });
    

    除非您不使用jQuery 2.0+
    $。否则getScript
    似乎是错误的选择,因为它在进行跨域请求时不提供任何错误处理功能。所有这些:
    失败
    完成
    错误
    状态码
    都不起作用。我已经用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';
    
    $.delerred
    结合使用,提供了构建复杂装载机的可靠方法

    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
    );
    

    是的,这就是我目前正在做的,但就像你说的,这有点像黑客。顺便说一句,代码应该是
    if(typeof script_test!=“undefined”)是的,这是一个黑客。你考虑过我的第二个例子吗?和。。我相信你不需要接线员的类型。谢谢你的第二个建议。另外,除非我真的发疯了,否则如果var还没有在任何地方定义,您将需要typeof。尝试在脚本中运行下面的函数(之前不要提到foo)。您会注意到js控制台中的一个错误:function test(){if(foo==undefined)alert(“Yay!”);}如果脚本是跨域url,
    fail
    回调似乎不起作用(无论是
    总是
    回调还是全局
    ajaxrerror
    处理程序,
    fail
    回调在jQuery 2.0+中都可以处理跨域URL起初,这似乎是一个相当丑陋的解决方案,但它是唯一一个真正可以与AdBlocker一起工作的解决方案。因此,谢谢你!我很想知道这是否在更新版本中得到解决jQuery的版本。我注意到了这一点,我正在使用jQuery 1.8.3。但是,我注意到两个回调都没有被调用。在这种情况下,我正在使用的jsonp服务返回一个400头。当我使用jQuery时,我无法在客户端找到任何方法来处理它。@Anthony:jQuery 2.x现在支持错误处理程序(1.x仍然没有)优雅的解决方案:)。即使之前的解决方案已在“处理错误”一节的官方文件中报告,也优先于上述解决方案。