Библиотека Jquery имеет богатый функционал, который значительно упрощает жизнь разработчикам. Однако всегда можно упростить жизнь еще больше. Сегодня я приведу пример небольшого расширения стандартного метода $.ajax который может показывать или скрывать индикатор ajax loader.
Имея данную заготовку Вы вполне сможете дореализовать, например, автоматическое создание индикатора запроса. Давайте создадим файл extension.js со следующим кодом.
jQuery.extend({
ajaxWithWaiter: function(params) {
var waiterAction = function(selector, action) {
var $waiterElement = null;
if(typeof(selector) == 'string') {
$waiterElement = $(selector);
}
if($waiterElement != null && $waiterElement.length > 0) {
action = action || 'toggle';
switch(action) {
case 'show':
$waiterElement.show();
break;
case 'toggle':
$waiterElement.toggle();
break;
case 'hide':
default:
$waiterElement.hide();
break;
}
}
}
params = params || {};
var fComplete = null;
if(typeof(params.complete) == 'function') {
fComplete = params.complete;
}
params.complete = function(jqXHR, status) {
waiterAction(params.waiter, 'hide');
if(fComplete != null) {
fComplete(jqXHR, status);
}
}
waiterAction(params.waiter, 'show');
$.ajax(params);
}
});
Если вкратце, то данный код расширяет библиотеку JQuery функцией ajaxWithWaiter, которая по сути является аналогом функции ajax. Отличае данной фунеции, что она имеет дополнительный параметр waiter — селектор элемента, который нужно показать перед отправкой запроса и скрыть после срабатывания его завершения.
Пример использования:
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="extension.js"></script>
</head>
<body>
<script>
var sendAjax = function() {
$.ajaxWithWaiter({
url: 'ajax.php',
data: {
foo: 'bar'
},
type: 'post',
waiter: '#ajax-loader', //Новый параметр - селектор нашего индикатора
success: function(answer) {
alert('Success');
},
error: function(jqXHR, status, error) {
alert('Error');
}
});
}
</script>
<input type="button" value="Ajax" onclick="sendAjax();" />
<img src="http://cdn.osxdaily.com/wp-content/uploads/2013/07/dancing-banana.gif" id="ajax-loader" style="display:none;" />
</body>
</html>