AJAX. Основы.AJAX (аякс) - это web технология, позволяющая взаимодействовать с сервером без перезагрузки страницы. Примерами применения служат проверка имени пользователя на занятость при регистрации, отправка товара в корзину без перезагрузки, google suggest и т.д. AJAX базируется на объекте XMLHttpRequest. Как видно из названия он задумывался для работы с XML, что, впрочем, не мешает использовать его и в других целях.Принцип работы следующий: скрипт состоит из двух частей
Этапы написания клиентской части:
Создание объекта XMLHttpRequest отличается для Internet Explorer и других обозревателей, поэтому для совместимости эту операцию приходиться дублировать разными способами:
var req;
if (window.XMLHttpRequest) // normal browser
req = new XMLHttpRequest();
else if (window.ActiveXObject) { //IE
try {
req = new ActiveXObject('Msxml2.XMLHTTP'); // IE разных версий
} catch (e){} // может создавать
try { // объект по разному
req = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e){}
}
Использование метода GET, установка обработчика события onreadystatechange и отправка запроса:
req.open("GET", url, true);
req.onreadystatechange = function() {
if (req.readyState == 4) { обработка результатов }
};
req.send(null); //отправка запроса без параметров, т.к. они установлены в url
В обработчике события onreadystatechange необходимо обязательно проверить
условие req.readyState == 4, которое говорит о том, что данные загружены.
Дополнительно можно также проверять req.status == 200. См. таблицы ниже.При использование объекта XMLHttpRequest с методом POST требуется дополнительно отправлять header:
req.open("POST", url, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.onreadystatechange = function() {
if (req.readyState == 4) { обработка результатов }
};
req.send('param1=1¶m2=0'); //теперь параметры передаются здесь
Несколько параметров разделяются амперсандами.Полный пример:
var req;
if (window.XMLHttpRequest) req = new XMLHttpRequest();
else if (window.ActiveXObject) {
try {
req = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e){}
try {
req = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e){}
}
if (req) {
req.onreadystatechange = function() {
if (req.readyState == 4 && req.status == 200) { alert(req.responseText); }
};
req.open("POST", 'xmlhttp.php', true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send('param=1&ajax=1');
}
else alert("Браузер не поддерживает AJAX");
Серверная часть (url в req.open) может быть написана на чем угодно, лишь бы
понимала запросы GET/POST. Возращаемое значение (req.responseText) формируется
стандартным выводом.
Пример серверной части на php:
if(isset($_POST['param'])) echo ($_SERVER['REMOTE_ADDR'])?"Your IP ".$_SERVER['REMOTE_ADDR']:"IP неизвестен"; Немного справочных материалов: Методы класса XMLHttpRequest
Свойства класса XMLHttpRequest
Комментарии:Evgen 18.06.08 в 16:23 Привет! Alek Veritov 18.06.08 в 21:48 Да, спасибо за своевременный сигнал. Исправил. Прим Палвер 26.06.08 в 02:27 Спасибо. Буду дерзать. После бездарной книжки начал-было склоняться к мысли, что я слабоумен, так там замечательно описано было... Dimko 26.06.08 в 19:32 Просто и понятно. Спасибо! Прим Палвер 28.06.08 в 15:10 Привет! Alek Veritov 28.06.08 в 19:26 использование responseText до открытия и отправки параметров не имеет смысла, поскольку responseText это ответ серверной части на ajax запрос, поэтому до отправки параметров он не определен Прим Палвер 28.06.08 в 21:02 Ну так и я об этом: Alek Veritov 29.06.08 в 01:41 В строках, приведенных вами выше, назначается функция-обработчик события. Это событие и есть ответ сервера, т.е. responseText до открытия и отправки параметров не используется Прим Палвер 30.06.08 в 16:34 То есть, onreadystatechange следит за состоянием всё время, и неважно, где он стоит? И всё же, почему не поставить обработчик после отправки? Спасибо. Alek Veritov 30.06.08 в 17:15 Он не все время следит, а вызывается только после совершения события. Это как onclick или onmouseover. Если его поставить после отправки, то получится, что событие не знает какая функция должна его обработать... Александр 02.08.08 в 01:40 Читаю и ничего не могу понять, посоветуйте какие нибудь книги по этому делу @KIMMI 05.08.08 в 20:54 Огромное спасибо, вот по этой статье я научился Ajax... anonymous 07.10.08 18:40 Ogromnoe spasibo ochen poleznaya infa... iz Yerevana.. ll 07.10.08 21:00 Немогу понять вчем дело ( У меня Linux + Firefox 3.0.3 (пробовал так же 3.0) Данный пример в нем УЖЕ не работает ( У меня собственный кусок кода на аякс, в опере и второй Лисе - порядок. А с 3ей версии начал выдеылываться. немогу понять вчем проблема. У меня должна отправляться форма на сервер, но увы.. ( wzonnet 15.02.09 22:28 Для меня так проще jqueryвский .ajax(). Неохота на низкий уровень лезть. KVANT 20.02.09 19:38 Статья действительно хорошая, однако не раскрывает некоторые моменты, о которых более подробно написано тут http://www.ibm.com/developerworks/ru/library/wa-ajaxintro1/#code7 nik0g0r 04.03.09 20:59 великое cпасибо за азы... bushstas 13.08.09 21:29 Здравствуйте Автор! Я 08.11.09 23:52 Интересно. Опять Я 08.11.09 23:54 За статью Спасибо Polo 03.12.09 21:07 Спасибо за материал! А я-то поступил именно так, как вы описали здесь: http://easywebscripts.net/ajax/ajax_books.php и даже скачал именно ту самую книжищу. И реакция у меня примерно такая же была: "зачем столько воды???" vova 05.12.09 00:21 я как неплохой програмист гипер текст и свойства обект не чего не понял и понимать не хотел мне кажется написано запутано Ринат 09.01.10 18:49 Спасибо огромное отличная статья и сайт! silver_11 13.02.10 17:08 Огромное спасибо за статью. Сберегли мне уйму времени! Kuli 14.03.10 15:07 ///// mov 26.03.10 03:00 to Kuli serg 15.04.10 15:56 Подскажите, возможно ли получить от сервера несколько ответов, то есть : Алекс 19.11.10 12:29 Хорошо пишете, конечно, но непонятно, как это вообще запускать, ничего на примере не работает. Как сделать, чтобы аякс запускался по кнопке, функция почему-то выводит хедеры страницы, с которой запускается! Euphoria 21.11.10 20:17 Можно вопрос? к автору Алекс 22.11.10 11:14 Я использую innerHTML для отображения. Euphoria 22.11.10 14:08 хедеры тоже выводились по началу) Euphoria 22.11.10 14:31 Алекс, а как вы используете это с innerHTML? Алекс 24.11.10 21:50 Добавляю в скрипт строку типа dummy n00b 06.12.10 00:46 Рад что нашол ваш сайт! Очень толково все расписано и как раз, то чего я хотел, но боялся спросить )) Отключил нахер Адблок+ и нажал на ссылку )) Спасибо! Дмитрий 31.05.11 09:04 Если все написано на php, то как передать параметр из php кода в req.send('param=1&ajax=1'); вместо param=1, param=(например $id). alta1r 03.06.11 11:00 Так вот он, великий и ужасный AJAX... пишем обращение из джаваскрипта к пхп скрипту и получаем ответ, вот и всё, а я-то думал! Спасибо автору большое Anonymous 20.11.11 11:08 Замечательная статья. Автору респект. Лекс 29.01.12 18:05 в вин 7 хоме едитионе в интернут эксплорере выдается ошибка - отказано в доступе. в вин7 ультимате уак я отключил и ноу трабл. как решить проблему? Иван 02.03.12 16:26 Автор, спасибо, я прозрел! Напишите, пожалуйста, можно ли передавать массивы методом POST, и как передавать картинки? Как только получить информацию, без передачи конкретных параметров? Если вам помогла или просто понравилась эта статья вы можете отблагодарить автора кликнув по рекламе. Спасибо! комментировать:
прежде чем писать комментарий убедитесь, пожалуйста, что он не попадает в нижеследующие категории:
прямые оскорбления кого бы то ни было будут удалятся! от кого: |


