Я пытаюсь настроить общий обработчик успеха / ошибки AJAX с помощью jQuery, который я могу использовать в нескольких проектах.Моя причина для этого - из-за ряда возможных «ошибок», которые могут произойти во время запроса AJAX.Вот те, которые я обработал до сих пор, и номер статуса:
- 0: неизвестная ошибка
- 1: успешная
- 2: не авторизована
- 3: истекло время ожидания
- 4: не разрешено (на основе разрешений)
- 404 Ошибка
Для первых 5 ошибок япришлось обращаться с ними вручную.Для этого единственный способ, который я смог найти, - это запустить метод cl4.process_ajax
внутри функции успеха вызова AJAX с использованием ключа состояния / свойства в данных JSON, чтобы определить, каково состояние.Для ошибки 404 или какой-либо другой ошибки AJAX (т. Е. Непарсируемого JSON) я использовал глобальный обработчик событий ajaxError()
в jQuery.
Основная идея заключается в том, что ошибка будет отображаться в верхней частиЭкран внутри #ajax_errors
при возникновении ошибки сдвигается вниз, чтобы он выглядел «красиво».На каждую из ошибок можно нажать, чтобы скрыть их.
Вот пример того, как я использовал его.cl4.process_ajax
также может быть вставлено в условие if, позволяющее коду выполняться только в том случае, если он был успешным.
$.getJSON('/path/to/page?c_ajax=1', function(return_data) {
cl4.process_ajax(return_data);
if (return_data !== null && typeof return_data == 'object' && typeof return_data.html != 'undefined') {
$('#div').html(return_data.html);
} else {
$('#div').html('');
}
});
Параметр запроса c_ajax
сообщает логину и проверке разрешения на возвращение массива JSON вместоперенаправление пользователя на страницу входа или отсутствия доступа, как обычно.
Отображаемые сообщения можно легко настроить на сервере, просто добавив ключ / свойство error_msg.Это облегчит работу с такими вещами, как перевод, а также сделает код более гибким.Я включил возможность отображения сообщения отладки в режиме отладки, поэтому во время разработки легко определить, в чем заключалась ошибка (против общего пользовательского сообщения).
Массив, закодированный в формате JSON, должен выглядеть примерно так:
array(
status => the status using the constants in AJAX
error_msg => message to be displayed the user at the top of the page
debug_msg => message to be displayed in debug mode
html => the html to display
... any other data for that request
)
Ниже приведен код обработки ошибки:
// setup the cl4 object and the debug flag
// these are typically else where and cl4 has other stuff in it
var cl4 = {};
var cl4_in_debug = TRUE; // probably default to false, but for this makes it easier to test
cl4.default_error_msg = 'There was a error loading some of the content on this page.<br>Try reloading the page or contacting an administrator.';
/**
* attach an AJAX error hander to the ajax_error element
*/
$('#ajax_errors').ajaxError(function() {
cl4.add_ajax_error(cl4.default_error_msg);
});
/**
* Call within a ajax success function to deal with the response of an ajax call
*/
cl4.process_ajax = function(return_data) {
if (typeof return_data != 'object' || return_data === null) {
cl4.add_default_ajax_error(return_data);
return false;
}
if (cl4.in_debug && typeof return_data.debug_msg != 'undefined'/* && return_data.debug_msg != ''*/) {
cl4.add_ajax_error(return_data.debug_msg);
}
// check to see if we've received the status, because we need it for the rest
if (typeof return_data.status == 'undefined') {
return;
}
switch (return_data.status) {
// successful
case 1 :
return true;
break;
// not logged in
case 2 :
cl4.add_default_ajax_error(return_data, 'You are no longer logged in. <a href="/login">Click here to login.</a>');
return false;
break;
// timed out
case 3 :
cl4.add_default_ajax_error(return_data, 'Your login has timed out. To continue using your current login, <a href="/login/timedout">click here to enter your password.</a>');
return false;
break;
// not allowed (permissions)
case 4 :
cl4.add_default_ajax_error(return_data, 'You do not have the necessary permissions to access some of the functionality on this page.');
return false;
break;
// unknown error
case 0 :
default :
cl4.add_default_ajax_error(return_data);
return false;
}
};
/**
* ajax error function, will show a red div at the top of the page if there is a problem with any of the ajax on the page
*/
cl4.add_ajax_error = function(error) {
$('#ajax_errors').append('<div>' + error + '</div>');
$('#ajax_errors div').click(function() {
$(this).slideUp(function() {
$(this).remove();
});
}).slideDown();
};
/**
* Adds a default message if there is no error_msg in the return_data object
*/
cl4.add_default_ajax_error = function(return_data, default_msg) {
if (arguments.length == 1) {
default_msg = cl4.default_error_msg;
}
if (return_data !== null && typeof return_data == 'object' && typeof return_data.error_msg != 'undefined' && return_data.error_msg != '') {
cl4.add_ajax_error(return_data.error_msg);
} else {
cl4.add_ajax_error(default_msg);
}
};
Есть мысли по этому поводу?Есть ли лучший метод?Я не нашел много информации о «ошибках» AJAX, кроме данных, которые не могут быть проанализированы, или 404 (или подобных) ошибок.Кроме того, есть ли лучший способ справиться с этими типами ошибок в JQuery.(Я пытался использовать обработчики успеха, но, похоже, все они запускаются после обработчика успеха для текущего запроса.)
Извините за объем кода ... Хотелось бы, чтобы он был короче, но
Кстати, я хотел установить это как вики сообщества, но у меня почему-то нет флажка.