Я постепенно улучшаю ajax-tivity (TM) своего сайта и недавно добавил в некоторые довольно простые обработки ошибок. Мои вызовы выполняются с помощью метода jquery .ajax(), и я отображаю ошибки пользователю с помощью функции show_error_box (message) . Я обрабатываю все мои ajax, возвращая скрипты, поэтому проверка на стороне сервера была простой - я просто отправляю назад вызов show_error_box. Для других ошибок, я просто поместить следующий код в моем .ajax вызовКак лучше всего обрабатывать ошибки во время jquery ajax-вызовов, вызванных щелчком пользователем ссылок
error: function(xhr, status, error) {
show_error_box("There has been an error communicating with the server<br/>The field has not been updated<br/>Please check your internet connection");
}
Я обнаружил, что это дело хорошо с большинством вопросов (без подключения, тайм-аут, и т.д.), но это дело плохо с ситуацией, когда пользователь нажимает на ссылку, пока вызов ajax все еще продолжается. Появится окно с ошибкой, после чего пользователь будет удален на новую страницу.
Каков наилучший способ справиться с этой ситуацией? В идеале мне бы хотелось, чтобы отображалось неинтрузивное сообщение об ошибке (например, «дождитесь завершения обновления»), и щелчок по ссылке игнорируется. Любые предложения о том, как наилучшим образом достичь этого?
EDIT:
Я решил это временно отключить все ссылки, то повторное включение их как так;
$.ajaxSetup({
beforeSend: function() {disable_links()},
complete: function() {enable_links()},
timeout: 15000
});
function disable_links() {
$('a').each(function() {
if ($(this).attr('href')) {
$(this).data('href', $(this).attr('href')).removeAttr('href');
}
})
}
function enable_links() {
$('a').each(function() {
$(this).attr('href', $(this).data('href'));
})
}
См [JQuery $ .ajax вызывает обработчик успеха, если запрос не удается из-за браузера перегрузки] (http://stackoverflow.com/questions/4553124/jquery-ajax-calls-success-handler-when-request-fail-why-of-browser-reload? rq = 1), где предлагается обработчик 'beforeunload'. Помните, что 'beforeunload' не работает на iOS/Mobile Safari. –