Обработка ошибок в jQuery.getScript - PullRequest
7 голосов
/ 10 сентября 2009

Функция jQuery getScript , похоже, не поддерживает функцию обратного вызова с ошибкой. Я не могу использовать глобальный код обработки ошибок AJAX, локальная функция ошибок была бы идеальной.

Документация о том, что обратный вызов получает data / textStatus, кажется неправильной - обратный вызов не получает ни того, ни другого.

Есть ли какие-либо предложения по обнаружению сбоя вызова getScript (например, сервер недоступен)?

РЕДАКТИРОВАТЬ: только что посмотрел на источник, и кажется, что обратный вызов вызывается только при успехе, с данными всегда установлено в null и textStatus не определено (так как это, я полагаю, только для успешного вызова) Документация очень некорректна для этой функции.

Ответы [ 5 ]

30 голосов
/ 04 марта 2012

Начиная с jQuery 1.5 вы можете добавить .fail к вашему вызову getScript.

$.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

17 голосов
/ 31 июля 2012

Для междоменных тегов сценария событие успеха срабатывает, а событие ошибки - нет; независимо от того, какой синтаксис вы используете. Вы можете попробовать этот подход:

  1. Создайте обработчик ошибок и установите его для запуска через несколько секунд, используя handle = window.setTimeout
  2. Внутри функции обратного вызова успешно отмените таймаут, используя 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);
});
6 голосов
/ 21 сентября 2011

Будет работать глобальный 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/.

4 голосов
/ 24 октября 2013

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');
        }
    });
0 голосов
/ 10 сентября 2009

Это что-то вроде хака, но ..

Вы можете объявить переменную внутри скриптов, которые вы загружаете, и проверить ее после загрузки скрипта (при условии, что функция complete все еще срабатывает):

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");
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...