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