css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
14 Фев
В предыдущей статье мы немного познакомились с запросами Ajax, которые позволяет выполнять библиотека jQuery. Теперь рассмотрим события Ajax и примеры обработки этих событий…
ajaxComplete( callback ) – прикрепляет функцию, которая выполняется всякий раз, когда выполненajax-запрос. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.
Пример: показываем сообщение, когда AJAX запрос выполнен.
$("#msg").ajaxComplete(function(request, settings){
$(this).append("<span>Request Complete.</span>");
});
ajaxError( callback ) – прикрепляет функцию, которая выполняется всякий раз, когда какой-либо ajax-запрос неудачен. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе. Третий параметр передается, если при обработке запроса произошла ошибка и эта ошибка определена.
Пример: показываем сообщение, когда AJAX запрос неудачен.
$("#msg").ajaxError(function(event, request, settings){
$(this).append("<span>Error requesting page "
+ settings.url
+ "</span>");
});
ajaxSend( callback ) – прикрепляет функцию, которая выполняется всякий раз, когда какой-либо ajax-запрос отправлен. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.
Пример: показываем сообщение, когда AJAX запрос отправлен.
$("#msg").ajaxSend(function(evt, request, settings){
$(this).append("<span>Starting request at "
+ settings.url
+ "</span>");
});
ajaxStart( callback ) – прикрепляет функцию, которая выполняется всякий раз, когда ajax-запрос начат (и нет выполняющихся запросов).
Пример: показываем сообщение о загрузке.
$("#loading").ajaxStart(function(){
$(this).show();
});
ajaxStop( callback ) – прикрепляет функцию, которая выполняется всякий раз, когда ajax-запросы закончены.
Пример: скрываем сообщение о загрузке после того, как все AJAX-запросы окончены.
$("#loading").ajaxStop(function(){
$(this).hide();
});
ajaxSuccess( callback ) – прикрепляет функцию, которая выполняется всякий раз, когда ajax-запрос выполнен успешно. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.
Пример: показываем сообщени, когда AJAX-запрос выполнен успешно.
$("#msg").ajaxSuccess(function(evt, request, settings){
$(this).append("<span>Successful Request!</span>");
});
Чтобы все это было немного понятнее, придумаем, напишем и испытаем какой-нибудь вполне реальный пример, в котором используем некоторые из перечисленных выше событий. Вот сам пример:
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.
Итак создадим два файла: events.html – где будут размещен элемент (например обычная ссылка), щелчок мышью на которой будет инициировать ajax запрос, и файл events.php – обработчик ajax-запросов.
Понятно, что в раздел HEAD файла events.html необходимо подключить библиотеку jQuery.
<script type="text/javascript" src="js/jquery-1.2.1.js"></script>
Затем простенький HTML-код:
<ul>
<li>
<a href="http://www.linkexchanger.su/wp-admin/#" id="a1">Выполнить Ajax-запрос</a>
<span id="loading">Выполняется Ajax-запрос...</span>
</li>
<li>
<span id="message">Ajax-запрос выполнен.</span>
</li>
</ul>
кусочек из таблицы стилей:
#loading {
display:none;
padding-left:10px;
}
#message {
display:none;
padding-left:10px;
}
и полностью javascript-код:
<script type="text/javascript">
$(document).ready(function(){
$("#a1").click(
function () {
$.ajax({
type: "POST",
data: "n=3",
url: "events.php"
});
});
$("#loading").ajaxStart(function(){
$(this).show();
$("#message").hide();
});
$("#loading").ajaxStop(function(){
$(this).hide();
});
$("#message").ajaxComplete(function(){
$(this).show();
});
});
</script>
Теперь давайте все это попробуем разобрать по шагам и отталкиваться будем от javascript-кода.
По клику на элементе а с идентификатором а1 будет выполнен ajax-запрос к файлу events.php (его код чуть позже). Тип запроса мы определим как POST и в качестве данных передадим некий параметр n=3.
Затем займемся «развешиванием» событий на HTML-элементы. По событию ajaxStart будет показан элемент с идентификатором #loading, изначально скрытый с помощью CSS. Элемент #message по этому же событию будет скрыт (он скрыт и изначально, но мы делаем это для того, чтобы скрыть его, если раньше выполнялись запросы и этот элемент был показан). Далее, по событию ajaxStop надо будет скрыть элемент #loading, а по событию ajaxComplete показать элемент #message.
А теперь приведу код обработчика ajax-запроса – файл events.php
<?php
if($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest') {
if ($_POST) {
for($i=0;$i<count($_POST['n']);$i++) sleep(1);
} else {
echo "Не передан параметр!";
}
}
?>
Для начала мы проверяем существование объекта XMLHttpRequest и выполняем код только в том случае, если он существует. Сам по себе этот код только прогоняет цикл из 3 итераций, каждый раз «засыпая» на секунду (эта задержка сделана для того, чтобы сам процесс запроса можно было «почувствовать»).
Пример получился, естественно простейший, без дальнейшей обработки возвращаемых сервером данных, но его целью было только продемонстрировать работу с событиями Ajax, а для более реальных примеров еще будет время…
Отзывов (25) на «jQuery и Ajax: события»
Сенкс, очень полезная статья
Автору 5++, вот давно рыл подобный материал – все четко разложено по полочками сразу примеры. Будемс ожидать подобных материалов.
Спасибо огромное, искал эту весч
Спасибо, очень интересная статья. Так просто написано, все понял с первого раза.
Хорошая реализация, тоже такую использую на проектах, при ajax’е затемняю блокирующим дивником всю страницу и поверх ещё вывожу бегун. Щас хочу реализовать одну фишку, но не могу сообразить как. Суть вот в чем: на странице есть несколько независимых ajax’ных блоков и нужно реализовать чтобы при выполнении – затемнять-блокировать тот блок из которого был послан запрос а другие оставлять свободными. Кто какие методы для этого использует? или плагин есть уже?
все зашибизь.. но где собственно данные которые должен был вернуть AJAX после того как пообщался с events.php
2des – внимательней читать надо
>Пример получился, естественно простейший, без дальнейшей обработки возвращаемых сервером данных, но его целью было только продемонстрировать работу с событиями Ajax
Спасибо. Очень хорошо и понятно написано!!!
А как реализовать на подобии как сделано у вас в голосовании? Т.е. чтоб div показывался и прятался, используя $.ajax
Вот так у меня не пашет =(
var childs = $.ajax({
type: «GET»,
url: «test.php»,
data: mod,
beforeSend: function(){
ShowWaitWindow();
},
complete: function(){
CloseWaitWindow();
},
async: false
}).responseText;
Легко. Пусть есть вот такая HTML-разметка:
<button>ajax!</button>
<div id=»someId»></div>
примерно такой CSS:
div {
width:100px;
height:100px;
background-color:#F00;
display:none;
}
и JS-код:
$('button').click(function(){ $.ajax({ url: '_code.php', beforeSend: function(){ $('#someId').show(); }, success: function(){ $('#someId').hide(); } }); });ну и конечно на сервере файл _code.php
<?php
if($_SERVER['HTTP_X_REQUESTED_WITH'] == ‘XMLHttpRequest’) {
// чего-то делаем…
}
?>
и все прекрасно работает…
Gennady хотел бы задать такой вопрос
у меня,скажем, есть такой код
<a title=»http://moi_sait.com/test.php»>Save</a>
<a title=»http://moi_sait.com/test.php»>Save</a>
и т.д. , вобщем смысл в том что класс у них у всех одинаковый , написал такой запрос:
jQuery(‘.link_a’).click(function(event) {
var title_link = jQuery(this).attr(‘title’);
jQuery.ajax({
url: title_link,
type:’POST’,
success: function(){
jQuery(«.text»).text(«Saved»)
.fadeOut(3000);
}
});
});
href пришлось перенести в title, чтобы страница после нажатия не обновлялась(просто не знал как сделать чтобы не обновлялась при таком коде
<a href=»http://moi_sait.com/test.php»>Save</a>), но с этим проблем особых нет, а вот при нажатии на ссылку , Ajax запрос выполняется верно, но текст Saved выводит во всех div-ах, а не только в одном, на который я нажал, как решить эту проблему?
Заранее спасибо!
Селекторы, селекторы и еще раз селекторы….
Все Ваши вопросы только из-за неуверенного владения селекторами в jQuery. На самом деле все очень просто и не надо было ничего из атрибута href никуда переносить.
$(‘.link_a’).click(function() {
var title_link = $(this).attr(‘href’);
$.ajax({
url: title_link,
type: ‘POST’,
success: function(){
$(‘.text’).text(‘Saved’).fadeOut(3000);
}
});
// отменяем переход по ссылке
return false;
});
возвращаем false, чтобы отменить стандартные действия браузера по умолчанию, т.е. переход по ссылке.
Что касается вопроса о том, почему во всех div’ах выводится тект Saved, так Вы же сами указали в селекторе .text – т.е. все элементы с классом text, что же Вы хотите? Во все найденные элементы с таким именем класса и добавляется соответствующий текст.
Поэтому учите селекторы, селекторы и еще раз селекторы….
Спасибо Gennady.
Я уже купил книгу по jQuery , но всё равно не всё сразу понятно.
Ваш блог очень помогает !
Gennady, огромное спасибо Вам за сайт! Хорошие статьи, понятно написано и на животрепещущие темы.
Доброго времени суток!
А если несколько ajax запросов, когда вызовется ajaxComplete ?
Как и локальное событие complete, событие ajaxComplete наступает по завершении каждого ajax-запроса. Если нужно отследить завершение всех запросов – используйте ajaxStop. Это событие произойдет, когда завершены все ajax-запросы.
Генадий, решил обратиться к Вам за помощью, так как сам найти решение проблемы не могу.
В JS и jQuery не силен, потому все мои мытарства сводятся к рысканью по документации и методу тыка, но, когда не знаешь, что ищешь, на успех не приходится надеяться
http://test.loc/links/ Здесь простой скрипт. По нажатии на ссылку отправляется запрос на сервер, и рисуется картинка прелоадер. В чем проблема, вы можете увидеть, если понажимаете по ссылкам.
Мне кажется, что callback функции запоминаются и при каждом клике вызывается не только текущая, но и все предыдущие. Это из-за того, что $.ajax() вызывается каждый раз. Понимать понимаю, но вот как внести необходимые правки ума не приложу.
Спасибо вашему блогу за понятную информацию
А как отследить Начало и Заврешние определенного ajax запроса?
По аналогии с глобальным ajaxComplete(callback), можно использовать локальное complete(callback) – это окончание запроса. Начало – можно использовать тоже локальное beforeSend(callback).
Можно на примере двух элементарных запросов, и вызов алерета при завершении , например второго, з запроса.
точнее как сдлеать на каждый из етих двух запросов, свои функции начала и конца запроса.
Пусть на странице планируется использовать несколько ajax-запросов. У всех есть что-то общее – например, все запросы POST и тайм-аут для всех 5 сек. Можно определить это в глобальных настройках:
$.ajaxSetup({ type: "POST", timeout: 5000, ajaxStart: function(){ alert("Пошел какой-то запрос"); }, ajaxStop: function(){ alert("Нет ни одного запроса"); } });для примера заданы ajaxStart и ajaxStop. Как только начнет выполняться какой-либо запрос – отработает ajaxStart, как только все запросы будут завершены – отработает ajaxStop.
А для каждого конкретного ajax-запроса задаем свои настройки:
(этот запрос к someurl1.php, а следующий ajax-запрос идет например к файлу someurl2.php и т.д.)
$.ajax({ url: "someurl1.php", beforeSend: function(){ alert("Перед запросом 1"); }, success: function(){ alert("Запрос 1 выполнен успешно"); }, error: function(){ alert("Ошибка запроса 1"); }, complete: function(){ alert("Запрос 1 завершен"); }, });эти callback’и будут вызываться для каждого запроса.
спасибо большое
Обсуждение статьи можно продолжить на форуме jQuery.