Skip to content

Latest commit

 

History

History
64 lines (52 loc) · 4.76 KB

ajax-handlers.md

File metadata and controls

64 lines (52 loc) · 4.76 KB

Обработчики событий

Для удобства разработки AJAX-запросы бросают несколько событий, и их, естественно, можно и нужно обрабатывать. jQuery позволяет обрабатывать эти события для каждого AJAX-запроса и в отдельности и глобально. Приведу схемку, на которой наглядно виден порядок возникновения событий в jQuery:

AJAX Events

Вот и полный список событий с небольшими ремарками:

событиеописание
ajaxStartданное событие возникает в случае, когда побежал первый AJAX-запрос, и при этом других активных AJAX-запросов в данный момент нет
beforeSendвозникает до отправки запроса, и позволяет редактировать XMLHttpRequest, локальное событие
ajaxSendвозникает до отправки запроса, как и beforeSend
successвозникает по возвращении ответа, когда в нём нет ошибок, локальное событие
ajaxSuccessвозникает по возвращении ответа, аналогично событию success
errorвозникает в случае ошибки, локальное событие
ajaxErrorвозникает в случае ошибки
completeвозникает по завершении текущего AJAX-запроса при любом раскладе, локальное событие
ajaxCompleteглобальное событие, аналогичное complete
ajaxStopданное событие возникает в случае, когда больше нет активных AJAX-запросов

Пример для отображения элемента с id="loading" во время выполнения любого AJAX-запроса (т.е. мы обрабатываем глобальное событие):

$(document).on("ajaxSend", function() {
    $("#loading").show(); // показываем элемент
}).on("ajaxStop", function(){
    $("#loading").hide(); // скрываем элемент
});

{% hint style="warning" %} Это задачка по юзабилити – мы всегда должны держать пользователя сайта в курсе дела о происходящем на странице и отправка AJAX-запроса тоже попадает под разряд «must know». Подобное решение у вас будет практически на любом сайте, где ходит AJAX. {% endhint %}

Для локальных событий – вносим изменения в опции метода ajax():

$.ajax({
    beforeSend: function() {
        // данный обработчик будет вызван перед отправкой данного AJAX-запроса
    },
    success: function() {
        // а этот при удачном завершении
    },
    error: function() {
        // этот при возникновении ошибки
    },
    complete: function() {
        // и по завершении запроса (удачном или нет)
    }
});

Можно глобальные обработчики отключить принудительно, используя флаг «global». Для этого выставляем его на false и пишем функционал в обход событий ajaxStart и ajaxStop:

$.ajax({
    global: false,
    beforeSend: function() {
        // ...
    },
    success: function() {
        // ...
    },
    error: function() {
        // ...
    },
    complete: function() {
        // ...
    }
});

Данная опция частенько помогает избежать конфликтов при работе с AJAX-запросами, но не стоит ей злоупотреблять.