jQuery的getScript函数似乎不支持错误回调函数。我不能在这里使用全局ajax错误处理代码,本地错误函数将是理想的。
回调获取data / textStatus的文档似乎不正确 - 回调函数都没有。
关于我如何检测到对getScript的调用失败的任何建议(例如服务器不可用)?
编辑:只看源代码,似乎只在成功时调用回调,数据总是设置为null而textStatus没有定义(因为它是一个成功的回调,我猜)。该功能的文档非常不正确。答案 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());
}
})
答案 1 :(得分:17)
对于跨域脚本标记,成功事件将触发,但错误事件不会触发;无论你使用什么语法。您可以尝试这种方法:
handle = window.setTimeout
window.clearTimeout(handle)
示例代码:
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
,否则似乎是错误的选择,因为它在进行跨域请求时不提供任何错误处理功能。这些都不起作用:fail
,complete
,error
,statusCode
将不起作用。我已经使用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");
})();