Что такое jQuery?
jQuery это библиотека javascript, цель которой «пиши меньше, делай больше». jQuery легко подключить к сайту и начать использовать. С помощью jQuery становится намного проще использовать javascript на вашем сайте.
jQuery устраняет целую прорву строк кода javascript, и позволяет реализовать эту прорву строк всего одним методом.
Что такое AJAX?
AJAX — это асинхронный (т.е. браузер, отослав запрос, может делать что угодно, например, показать сообщение об ожидании ответа, прокручивать страницу, и т.п.) JavaScript и XML. Он используется для создания динамических и быстрых веб-страниц. AJAX позволяет нам обновлять часть веб-страницы без перезагрузки страницы целиком.
Что насчет jQuery и AJAX?
Комбинация jQuery и AJAX обеспечивают мощную функциональность. С помощью jquery и ajax вы можете сделать запрос и получить информацию в различных форматах, включая XML, HTML и даже обычный текст. Для обмена данными можно использовать формат JSON. Данные полученные по ajax запросу мы можем использовать в нашей html странице.
jQuery делает существующий браузерный Ajax API мощнее и проще в использовании. Создавать вызовы ajax обычным способом, используя javascript, немного затруднительно: так как вы должны учитывать, что для различных браузеров требуются разные подходы к созданию объекта XMLHttpRequest
. Кроме того отправлять данные, например, из форм, становится сложнее, если вы используете обычный javascript для вызова ajax.
jQuery обеспечивает простую и мощную функциональность, которая расширяет javascript AJAX методы и обеспечивает более гибкий подход.
В этой небольшой статье я покажу вам, как использовать jQuery и AJAX в простой php форме. Давайте начнем… Чтобы использовать jQuery и AJAX нам потребуются два файла, в первом файле будет находиться код html/php, посредством которого и будет составляться ajax запрос. Во втором файле мы будет обрабатывать ajax запрос и возвращать результат на первую страницу.
Шаг 1. Создайте файл school.php
и вставьте в него следующий код:
В приведенном выше коде мы получаем имя и номер студента и, используя jquery и ajax, отсылаем их в details.php
.
HTML + jQuery
<html> <h.
type="text" name="name" id="name" /><td> </tr> <tr> <td>Roll Number:</td> <td><input type="text" name="rno" id="rno" /><td> </tr> <tr> <td></td> <td><input type="button" name="submit" id="submit" value="submit" onClick = "getdetails()" /></td> </tr> </table> <div id="msg"></div> </body> </html>
Шаг 2: Создайте details.php и расположите в нем следующий код:
PHP
<?php $name = $_POST['fname']; $rno = $_POST['id']; $con = mysql_connect("localhost","root",""); $db= mysql_select_db("school", $con); $sql = "SELECT address from students where name='".$name."' AND rno=".$rno; $result = mysql_query($sql,$con); $row=mysql_fetch_array($result); echo $row['address']; ?>
В приведенном выше коде мы получаем адрес студента с помощью порядкового номера и его имени.
Для данного примера вам понадобится создать базу данных school
и таблицу
students
. Таблица student
содержит поля с именами, порядковым номером и адресом.
Надеюсь, эта статья будет вам полезна.
Источник
dnzl.ru
В эпоху современного веба, большинство сайтов становятся все более интерактивными. Если ранее для получения обновленных данных нам нужно было обновить полностью страницу, то сейчас появились технологии которые позволяют полностью страницу не загружать, а только лишь отдельную ее часть. В свою очередь это предоставляет удобство как пользователям так и владельцам серверов, ведь для пользователя загрузка страницы будет быстрее, так как загружается только отдельная часть страницы, а серверу не нужно каждый раз генерировать страницу и отдавать ее пользователю. Эти возможности просто реализовать при помощи php и ajax.
Сегодня мы разберем небольшой пример для лучшего понимания работы концепции AJAX. Иногда новичкам бывает трудно понять каким же образом взаимодействует между собой php и ajax, много людей ищут примеры того как валидировать формы на лету без перезагрузки всей страницы. Я вам вкратце покажу как это делается, для того, чтобы вы могли понять основы и принципы которые позволят вам в будущем более быстро освоить другие инструменты и писать свои собственные скрипты.
Придумаем небольшое задание себе, будем проверять наличие email адреса в базе данных без перезагрузки страницы используя php и ajax. Такой пример хорошо продемонстрирует как мы можем взаимодействовать с сервером без перезагрузки страницы в браузере, а также, это часто используется при различного рода валидациях пользовательских форм. В корневом каталоге создадим 3 файла с именами index.php
,
email.php
, validate.js
.
Создание страницы
Создадим простую страницу с одной формой, которая содержит только одно поле для ввода email.
Синтаксис файла index.php
<!DOCTYPE html> <html> <title>AJAX Tutorial</title> <script src="https://code.jquery.com/jquery-1.12.3.min.js" integrity="sha256-aaODHAgvwQW1bFOGXMeX+pC4PZIPsvn2h1sArYOhgXQ=" crossorigin="anonymous"></script> <script src="validate.js"></script> <body> <form method="post" action=""> <input type="email" name="email" id="email" placeholder="Ener email"> <span id="message"></span> <input type="button" id="submit" value="Register"> </form> </body> </html>
Самый простой способ работать с AJAX — это подключить фреймворк jQuery, что собственно я и сделал. jQuery предоставляет нам простой в понимании и работе синтаксис для отправки AJAX запросов, почему бы не использовать это преимущество?
Создание js скрипта
Синтаксис файла validate.js
$(document).ready(function(){ var email = ''; $('#email').keyup(function(){ var value = $(this).val(); $.ajax({ type:'POST', url:'email.php', data:'email='+value, success:function(msg){ if(msg == 'valid'){ $('#message').html('<font color="green">Этот Email можно использовать.</font>'); email = value; }else{ $('#message').html('<font color="red">Этот Email уже занят.</font>'); } } }); }); $('#submit').click(function(){ if(email == ''){ alert('Please, put data to all email'); }else{ $.ajax({ type: 'POST', url:'email.php', data:'add_email='+email, success:function(msg){ $('#message').html(msg); } }); } }); });
Обработчик на php
Этот скрипт будет получать POST запрос от клиента, обрабатывать его и возвращать результат. AJAX считывает результат и на его основе принимает решение.
Синтаксис файла email.php
$connection = mysqli_connect("localhost","email","email","email"); if(isset($_POST['email']) && $_POST['email'] != ''){ $email = $_POST['email']; $email = mysqli_real_escape_string($connection,$email); if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ echo 'invalid'; }else{ $sql = "SELECT id FROM .
ror</font>'; } }
В нашем php скрипте, самый обычный код, который обрабатывает post запрос и печатает на странице определенный текст. В результате AJAX отправляет запрос php скрипту, скрипт его обрабатывает и выдает результат, AJAX считывает результат и изменяет страницу в реальном времени.
AJAX передает POST запрос скрипту посредством этого участка кода:
$.ajax({ type:'POST', url:'email.php', data:'email='+value, success:function(msg){ if(msg == 'valid'){ $('#message').html('Этот Email можно использовать.'); email = value; }else{ $('#message').html('Этот Email уже занят.'); } } });
type - Тип запроса, POST или GET. В нашем случае POST;
url - адрес скрипта которому отправляют запрос;
data - данные которые передаются в запросе;
success - что делать в результате успешного выполнения запроса. В нашем случае вызывается функция;
В самом скрипте, проверка наличия email в базе выполняется при каждом вводе символа в поле email. В скрипте за обработку ввода отвечает участок $('#email').keyup(function(){});
, который проверяет нажатие клавиши в поле с id = "email"
.
Как видите, код довольно простой и не требует особо больших навыков для понимания, все завязано на обработке событий keyup() - нажатие клавиши
, click() - клик мышкой по элементу
. Далее следует AJAX запрос и ответ от скрипта. Таким образом используя php и ajax можно можно получить практически безграничные возможности для создания интерактивных страниц.
Данный код не претендует на звание высококачественного, но если развить, добавить правильных валидаций на уровне клиента и сервера, ввести css, то вполне можно использовать в своих проектах.
Если у вас возникли вопросы, не стесняйтесь, пишите комментарии.
Желаю вам хорошего дня и до скорых встреч ?
Файлы примеров.
adminnotes.info
Работа с запросами AJAX на "чистом" JavaScript имеет несколько существенных недостатков:
ü код даже самого простого AJAX запроса получается достаточно громоздким и сложным для понимания без специального ознакомления;
ü необходимо писать строки кода для поддержки каждого старого браузера в отдельности.
В то время как AJAX-запрос, написанный с использованием библиотеки jQuery, занимает всего одну строчку кода и изначально оптимизирован для использования со всеми любыми версиями браузеров.
Синтаксис запроса, написанного с использование jQuery, следующий:

– селектор – это элемент, в котором будет отображаться результат запроса.
– url – адрес, на который будет отправлен AJAX-запрос.
– данные (необязательный параметр) – это данные, передаваемые вместе с запросом.
– функция (необязательный параметр) – это функция, вызываемая после выполнения запроса.
Например, нам требуется переслать значения переменных x и y в скрипт test.php, после чего вернуть результат сложения и отобразить его в блоке с идентификатором #par1.
Сопровождающие функции
Сопровождающие функции позволяют выполнять различный код в зависимости от состояния выполнения AJAX запроса.
Метод .ajaxSend()
Метод .ajaxSend() запускает обработчик Ajax события, когда Ajax-запрос готов к отправке (это происходит в момент перед самой отправкой):
Метод .ajaxSend() подключает функцию обратного вызова ко всем элементам набора jQuery. Возвращаемым значением является набор jQuery.
Рассмотрим параметры метода .ajaxSend():
o handler( [event, XHR, ajaxOptions] ) – функция — обработчик Ajax события готовности запроса к отправке (ajaxSend), которое возникает, когда объект создан и запрос готов к отправке. Методу передаются три параметра:
o event— экземпляр объекта JavaScript, свойство type которого имеет значение ‘ajaxSend’ (название типа произошедшего Ajax события), а свойство target ссылается на текущий DOM элемент;
o XHR — экземпляр объекта XMLHttpRequest;
o ajaxOptions — объект со свойствами — параметрами запроса, которые были использованы функцией $.ajax().
Примечание. Обработчики события ajaxSend всегда вызываются перед отправкой на сервер любого запроса Ajax, независимо от того, какой это был запрос. Различие между параметрами достигается путем изменения значений event, XHR и ajaxOptions, переданных обработчику.
Хотя событие ajaxSend наступает перед отправкой запроса на сервер, отменить отправку запроса в этот момент нельзя.
Метод ajaxComplete()
Метод ajaxComplete выполнит переданный код после выполнения AJAX-запроса, независимо от того, выполнится запрос с ошибкой или нет.

Методы ajaxSuccess и ajaxError
Метод ajaxSuccess выполнит переданный в него код, если выполнение AJAX запроса будет завершено успешно.
Метод ajaxError выполнит переданный в него код, если выполнение AJAX запроса будет завершено с ошибкой.
Пример создания всплывающих подсказок с использованием технологии AJAX
В практической web-разработке одной из самых распространенных задач является задача по организации системы подсказок на сайте. Система подсказок представляет собой аналог живого поиска, разработанного компанией Google.
Подсказки работают следующим образом: каждый введенный пользователем символ сравнивается с содержимым базы поиска и, если будут найдены совпадения, они будут выведены на экран. Выбрав нужное совпадение из списка, пользователь может произвести поиск необходимого совпадения без необходимости дописывать запрос до конца.
Работа с базой данных будет осуществляться с использованием серверного языка программирования php. Подробнее язык php будет рассмотрен позднее в данном учебном пособии. Последовательность действий:
1) создадим экземпляр объекта XMLHttpRequest();
2) отправим запрос с введенным пользователем словом или символом методом GET;
3) выведем результат запроса в блок с идентификатором #res. До тех пор, пока пользователь не начал вводить символы, мы не видим блок с идентификатором #res.
Хотя создание кода с использованием языка php не является предметом изучения в данном разделе, приведем текст файла suggest.php, в котором происходит выборка и обработка данных, отправляемых в формате json и отображаемых в блоке с идентификатором #res:
Библиотека Prototype
Одной из наиболее известных и самых используемых Ajax-библиотек является Prototype. Библиотека Prototype – это независимый проект группы разработчиков с изначально открытым исходным кодом. Библиотека очень быстро подгружается, формируя ядро для построения других библиотек, например, script.aculo.us и Rico.
Prototype — это набор объектов, которые помогают преодолеть некоторые трудности доступа и работы с элементами страницы в различных браузерах. Библиотека Prototype была создана и до сих пор поддерживается Сэмом Стефенсоном (Sam Stephenson), последнюю версию (на момент написания учебного пособия) можно скачать с http://prototypejs.org. На сайте также содержится документация по API библиотеки, а также статьи и учебные пособия по ее эффективному использованию.
Для того, чтобы начать работать с библиотекой Prototype, ее необходимо подключить к страницк уже знакомым нам способом, используя тег script:
Одной из основных особенностей Prototype является наличие нескольких схожих с языком Ruby функций и свойств. Ruby — простой в использовании язык, но в то же время сложный для восприятия, и использование библиотекой Prototype этих функций в JavaScript может вызвать путаницу, особенно если не знать специфических компонентов Prototype.
Ключевыми среди этих компонентов являются функции "доллар" и "доллар F". Функция $() ("доллар"), выдает ссылку на элемент, имя которого передано в функцию:
Элемент идентифицируется с помощью атрибута id:
Это эквивалентно использованию вызова метода DOM:
Помимо возвращения элемента, функция $() также присоединяет несколько специфических свойств Prototype.
Функция $F() возвращает значение поля формы, заданного идентификатором:
Это эквивалентно следующему:
Prototype не столько предоставляет новую функциональность, сколько заново компонует самые необходимые функции в легкодоступные модули.
Другой ключевой компонент Prototype — это объект Enumerable, который добавляет интерактивные возможности для JavaScript.
Создание совокупностей данных, таких, как массивы, всегда было чем-то примитивным в JavaScript, по крайней мере, по сравнению с другими языками. Это также подверглось изменению в новых версиях JavaScript: скажем, в JavaScript 1.6 были добавлены forEach и filter, а в JavaScript 1.7 — итеративность. Однако до тех пор, пока подобные изменения не будут поддерживаться большинством браузеров, использование объекта Enumerable библиотеки Prototype сможет во многом их заменить.
Prototype также предоставляет объекты для управления запросами XMLHttpRequest. Они просты в использовании и упрощают код запроса к веб-сервисам. Основным объектом Ajax является объект со сходным названием Ajax, но большая часть работы выполняется объектом Ajax.Request.
Формирования запроса с помощью этого объекта выглядит следующим образом:
Первый параметр — это URL-адрес запроса к веб-сервису, а второй параметр состоит из объекта, в котором указан метод HTTP-запроса, параметров запроса и функции, вызываемой по окончании запроса.
Ответ запроса XMLHttpRequest заключен в Prototype; и вы не сможете перехватывать различные этапы запроса. Для того, чтобы обработать каждый этап, контролируются события onComplete, onLoading, onLoaded и onInteractive. Однако, для большинства приложений понадобится отслеживать только события onComplete и onSuccess, которые появляются в случае успешного выполнения запроса.
Prototype также предоставляет возможность эмулировать методы HTTP-запроса DELETE и PUT, используя для этого альтернативный POST —подход.
Библиотека также располагает возможностью автоматически анализировать возвращенные данные. Если данные представлены в формате HTML, метод Ajax.Updater может обработать ответ и вставить данные в указанный элемент. Если данные помечены как JSON, Prototype может автоматически их проанализировать и передать как объект в функцию обратного вызова.
Подведем итоги:
В данном разделе мы рассмотрели способы добавления уровня поведений на web-страницу. Узнали синтаксис и основные конструкции языка программирования на стороне браузера JavaScript, ознакомились с объектами языка, свойствами и методами объктов и вариантами их использования для создания интерактивности на веб-странице.
Кроме того, получили представление об объектной модели документа DOM, основных видах DOM, ознакомились с методами и свойствами доступа к объектам HTML через узлы дерева DOM и вариантами их использования в сценариях.
Рассмотрели технологию AJAX, выяснили, какие технологии входят в состав AJAX, познакомились с понятием синхронного и асинхронного запроса. Подробно рассмотрели объект JavaScript XMLHttpRequest(), прошли полный путь от формирования запроса до отображения результатов запроса на странице.
Проверь себя:
1. Назовите способы ввода-вывода данных в JavaScript.
2. Какие операторы для организации циклов имеются в JavaScript?
3. Назовите объекты языка, перечислите из свойства и методы.
4. Что такое DOM?
5. В чем разница между CORE DOM, HTML DOM и XML DOM?
6. Сколько существует уровней DOM?
7. Сколько групп свойств и методов DOM выделяют разработчики?
8. Назовите самый популярный метод доступа к объекту DOM
9. Что такое узлы-элементы и текстовые узлы в DOM?
10. Является ли DOCTYPE объектом DOM?
11. Что такое AJAX?
12. Что такое асинхронный запрос?
13. Что такое XML?
14. Что такое JSON?
15. В чем отличие между форматами JSON и XML?
16. Назовите основные преимущества использования AJAX.
Задания для самостоятельной работы
JavaScript и DOM:
1. Ввести с экранадва числа, сложить их, результат вывести в окно документа.
2. Ввести с экрана значение градусов по Фаренгейту, перевести их в градусы по Цельсию по формуле:
0C=5/9(0F-32)
Оформить результат с помощью таблиц стилей.
3. Ввести с экрана значение градусов по Фаренгейту, перевести их в градусы по Цельсию по формуле:
0C=5/9(0F-32)
Указать в зависимости от получившегося значения, в каком состояии находится вода: лед, холодная вода, теплая вода, горячая вода, пар.
Выполнить решение с помощью условного оператора и оператора выбора.
4. Укажите название месяца в зависимости от его номера в году.
5. Вывести в окно документа таблицу соответствия градусов по Цельсию градусам по Фаренгейту в пределах от -250 до 300 с шагом 10. Пример можно увидеть на рисунке 74. Можно также предусмотреть вариант, когда пределы и шаг вводится пользователем с экрана.
Замечание. Вспомните, что в операторе document.write внутри кавычек можно указывать теги HTML.
6. В получившейся таблице создать фон строк разных цветов: четная строка желтая, нечетная строка красная. Подумайте, как создать три повторяющихся цвета, четыре и т.д.
Замечание. Можно использовать операцию деления по модулю (%).
7. Введите с экрана число, например, 5. Выведите на экран пять строчек, в каждой строке по пять символов.
8. Введите с экрана число, например, 5. Выведите на экран пять строчек, в первой строке одна звездочка, во второй – две, и так далее. В последней — пять звездочек.
9. Введите с экрана число, например, 5. Выведите на экран пять строчек, в первой строке четыре пробела и одна звездочка, во второй – три пробела и две звездочки и т.д. В последней — пять звездочек.
10. Введите с экрана число, например, 5. Выведите на экран пять блоков, в первом блоке одна звездочка; во втором – одна, три; в третьем – одна, три, пять и т.д. (см. рис. 75).
11. Создать в одной функции часы в окне документа в 24-часовом формате,а также вывести текущую дату, указав название месяца на русском языке.
12. Определить, сколько дней осталось до нового учебного года.
13. Напишите код, подсчитывающий сумму элементов массива. Массив введите с экрана, запросив предварительно размерность этого массива. Сумма элементов массива должна вычисляться с помощью функции.
14. Написать функцию, возвращающую максимальное по модулю число в массиве. Если это число отрицательное, не потеряйте знак!
15. Напишите функцию для решения квадратного уравнения. Обратите внимание, что для того, чтобы функция возвращала несколько значений (2 корня), их следует записывать в массив.
16. Доработайте слайд-шоу из примера со страницы 176, добавив кнопку play/stop, при нажатии на которую слайд-шоу либо останавливается, либо воспроизводится. Можно вместо одной кнопки можно создать две отдельные: play и stop.
17. Нарисуйте дерево DOM для следующего документа
<!DOCTYPE html>
<html>
<head>
<title>Главная Страница</title>
</head>
<body>
<p id="id_p_1">Нумерованный список</p>
<ol>
<li> Пункт 1 </li>
</ol>
<p class="p_1">Параграф1</p>
<p class="p_2">Параграф2</p>
<p>Параграф1</p>
<div id="for_div1"> Измените этот текст! </div>
<div id="for_div2"> <em>Измените цвет текста!</em> </div>
</body>
</html>
a. Измените текст внутри блока for_div1.
b. Измените цвет текста внутри блока for_div2.
c. Измените текст и свойства параграфов p_1, p_2.
AJAX и jQuery:
Задание 1
Создайте четыре кнопки и напишите для них код, запрашивающий с помощью AJAX файлы winter.txt, summer.txt, autumn.txt, spring.txt с сервера и отображающий результат на странице.
Задание 2
Скрипт file1.php принимает три аргумента var1, var2, var3 (значения могут быть в диапазоне от 1 до 5). Создайте AJAX запрос для обращения к этому скрипту и подберите такие значения аргументов var1, var2 и var3, чтобы результат выполнения скрипта был равен 8.
Задание 3
Скрипт file2.php принимает три аргумента a, b, c (значения могут быть в диапазоне от 5 до 10). Создайте AJAX запрос для обращения к этому скрипту и подберите такие значения аргументов a, b и c, чтобы результат выполнения скрипта был равен 130.
Задание 4
Запросите файл test.xml из скрипта, примите ответ с помощью responseXML и затем:
— выведите содержимое 3 и 4 тэга name на страницу;
— выведите содержимое 2 и 3 тэга surname на страницу;
— выведите содержимое 1 тэга dept на страницу;
— выведите содержимое всех тэгов surname, которые присутствуют в файле на страницу.
Задание 5
Реализуйте подпункты, перечисленные ниже, путем добавления на страницу соответствующего jQuery кода:
a. Создайте AJAX запросы, которые должны после нажатия на соответствующие кнопки обращаться к файлам autumn.txt, winter.txt, summer.txt, и spring.txt, и затем отображать результат запроса в абзац с id=par1.
b. После нажатия на кнопку с id=but5 элемент span c id=let1 должен содержать первую букву кодового слова, span c id=let2 вторую и т.д.
Задание 6*
Разработайте систему подсказок при введении пользователем города проживания.
lektsia.com
Что такое AJAX ? Пример реализации.
AJAX, или, более длинно, Asynchronous Javascript And Xml — технология для взаимодействия с сервером без перезагрузки страниц.
За счет этого уменьшается время отклика и веб-приложение по интерактивности больше напоминает десктоп.
Например, при нажатии кнопки голосовать — из браузера на сервер будет отправлено сообщение, а сервер ответит браузеру, что голос принят.
Технология AJAX, как указывает первая буква A в ее названии — асинхронна, т.е браузер, отослав запрос, может делать что угодно, например, показать сообщение
об ожидании ответа, прокручивать страницу, и т.п.
Вот код кнопки в примере выше:
<input value="Голосовать!" onclick="vote()" type="button" />
При нажатии она вызывает функцию vote
, которая отправляет запрос на сервер, ждет ответа, а затем показывает сообщение об этом в div
‘е под кнопкой:
<div id="vote_status">Здесь будет ответ сервера</div>
Далее мы разберем, как она работает, более подробно.
Для обмена данными с сервером используется специальный объект XmlHttpRequest
, который умеет отправлять запрос и получать ответ с сервера. Кроссбраузерно создать такой объект можно, например, так:
function getXmlHttp(){ var xmlhttp; try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); } return xmlhttp; }
Более подробно о деталях реализации AJAX с использованием XmlHttpRequest и других транспортов можно почитать в разделе про общение с сервером.
Здесь мы не будем на этом останавливаться и перейдем сразу к функции vote
:
// javascript-код голосования из примера function vote() { // (1) создать объект для запроса к серверу var req = getXmlHttp() // (2) // span рядом с кнопкой // в нем будем отображать ход выполнения var statusElem = document.getElementById('vote_status') req.onreadystatechange = function() { // onreadystatechange активируется при получении ответа сервера if (req.readyState == 4) { // если запрос закончил выполняться statusElem.innerHTML = req.statusText // показать статус (Not Found, ОК..) if(req.status == 200) { // если статус 200 (ОК) - выдать ответ пользователю alert("Ответ сервера: "+req.responseText); } // тут можно добавить else с обработкой ошибок запроса } } // (3) задать адрес подключения req.open('GET', '/ajax_intro/vote.php', true); // объект запроса подготовлен: указан адрес и создана функция onreadystatechange // для обработки ответа сервера // (4) req.send(null); // отослать запрос // (5) statusElem.innerHTML = 'Ожидаю ответа сервера...' }
Поток выполнения, использованный vote, довольно типичен и выглядит так:
- Функция создает объект
XmlHttpRequest
- назначает обработчик ответа сервера
onreadystatechange
- открывает соединение
open
- отправляет запрос вызовом
send
(ответ сервера принимается срабатывающей в асинхронном режиме функциейonreadystatechange
) - показывает посетителю индикатор состояния процесса
Серверный обработчик, к которому обращен AJAX-запрос (в примере это vote.php) по сути ничем не отличается от обычной страницы. AJAX-запрос, отправляемый XmlHttpRequest
, ничем не отличается от обычного запроса.
Просто текст, который возвращает сервер, не показывается как HTML, а читается и обрабатывается функцией onreadystatechange
.
<?php sleep(3); echo 'Ваш голос принят!';
Смысл AJAX — в интеграции технологий
Технология AJAX использует комбинацию:
- (X)HTML, CSS для подачи и стилизации информации
- DOM-модель, операции над которой производятся javascript на стороне клиента, чтобы обеспечить динамическое отображение и взаимодействие с информацией
- XMLHttpRequest для асинхронного обмена данными с веб-сервером. В некоторых AJAX-фреймворках и в некоторых ситуациях, вместо XMLHttpRequest используется IFrame, SCRIPT-тег или другой аналогичный
транспорт
. - JSON часто используется для обмена данными, однако любой формат подойдет, включая форматированный HTML, текст, XML и даже какой-нибудь EBML
Типичное AJAX-приложение состоит как минимум из двух частей.
Первая выполняется в браузере и написана, как правило, на JavaScript, а вторая — находится на сервере и написана, например, на Ruby, Java или PHP .
Между этими двумя частями происходит обмен данными через XMLHttpRequest(или другой транспорт).
Что я могу сделать с помощью AJAX ?
Смысл AJAX — в интерактивности и быстром времени отклика.
Небольшие элементы управления
В первую очередь AJAX полезен для небольших элементов, связанных с элементарными действиями: добавить в корзину, подписаться, и т.п.
![]() |
![]() |
![]() |
Динамическая подгрузка данных с сервера.
Например, дерево, узлы которого подгружаются по мере раскрытия.
Незаметные для пользователя действия.
Например, при редактировании статьи — каждые 10 минут результаты автосохраняются на сервере.
Непрерывная подзагрузка информации с сервера.
Самый типичный пример — чат. В окошко постоянно поступают все новые сообщения, непрерывно подгружаемые с сервера. И, опять же, через AJAX, без перезагрузки страницы, пользователь может
отсылать сообщения на сервер.
Существуют другие предложения подобного рода, например, отображающие биржевые котировки в реальном времени.
Пример. Google suggest.
Google — одна из первых систем, которая предложила «живой поиск», live search. Пользователь печатает поисковую фразу, а система автодополняет ее, получая
список самых вероятных дополнений с сервера.
Код, который это обеспечивает, работает следующим образом.
- Активируется примерно при каждом нажатии клавиши
- Время посылки последнего запроса отслеживается
- Для «обычной» скорости печати — запрос отсылается при каждом нажатии
- Для «программистской» скорости — каждые несколько нажатий
- Создается скрытый DIV, который показывается при начале печати
- DIV заполняется ответом сервера
- Текущий результат подсвечен, можно перемещаться и выбирать
- При нажатии правой стрелки, поиск в подрезультатах
- Результаты кэшируются
- при нажатии на «удалить», обращения к серверу не происходит
- Время на осуществление запроса отслеживается для управления частотой запросов к серверу
- Обычный модем будет обращаться к серверу меньше,
- Подключение по выделенной линии — запросы идут чаще.
Пример. Gmail.
Раз уж взялись за Google — рассмотрим почтовый сервис той же компании, http://gmail.com.
На момент его появления он явился единственным открытым почтовым сервисом, использующим AJAX для следующих фич.
- Проверка ошибок ввода формы ДО сабмита
- «Мгновенная» загрузка
- Автоматическая «доставка» писем в открытую папку
- Автодополнение
Результат: обширная популярность, высокий спрос на account’ы с момента открытия.
Синхронная модель VS Асинхронная модель
В обычном программировании все операции носят синхронный характер, т.е выполняются одна за другой.
Условно говоря, мы действуем так:
- закидываем удочку
- ждем, когда клюнет
- клюнуло — включаем подтяжку спиннинга
При асинхронном подходе мы:
- вешаем на удило специальный детектор клева, задаем ему тянуть спиннинг, когда клюнет
- закидываем удочку
- занимаемся другими делами
- детектор клева срабатывает, запуская подтяжку спиннинга
Т.е, в синхронном случае удочка постоянно приковывает наше внимание. Ловля рыбы — последовательный процесс.
В асинхронном варианте — мы сначала задали программу, что делать при клеве, а затем опустили удочку ловить и занялись другими делами.
Например, поставили еще 5 таких удочек.
Асинхронное программирование сложнее, чем синхронное, и поначалу непривычно, т.к в нем заранее задается то, что сработает после.
Т.е, программу «что делать, когда клюнет» нужно задать до того, как клюнуло, и вообще неизвестно, есть ли в водоеме рыба.
Существуют приемы, облегчающие асинхронное программирование, например, отложенный объект Deferred (Twisted,Dojo,Mochikit), но об этом — в отдельной статье.
Синхронная и асинхронная модель в AJAX
Вернемся к нашим баранам: браузеру, серверу и, скажем, базе данных.
В синхронной модели браузер отправляет запрос на сервер и висит, ждет, пока тот совершит всю необходимую работу. Сервер выполняет запросы к базе данных, заворачивает ответ в необходимый формат и выводит его. Браузер. получив ответ, вызывает функцию показа.
Все процессы выполняются последовательно, один за другим.
Сетевые задержки включены во время ожидания, обозначенное на схеме серым цветом.
Пользователь не может заниматься чем-то другим на этой же странице, пока происходит синхронный обмен данными.
В асинхронной модели запрос отсылается («удочка поставлена»), и можно заняться чем-то другим. Когда запрос выполнился («клюнуло») — запускается заранее
подготовленная программистом функция («подтянуть спиннинг») показа сообщения сервера.
Здесь сервер сразу же уведомляет браузер о том, что запрос принят в обработку и освобождает его для дальнейшей работы. Когда ответ будет готов — сервер перешлет его, и на браузере будет вызвана соответствующая функция показа, но пока этот ответ формируется и пересылается — браузер свободен.
Пользователь может написать комментарии, заполнить и отослать форму и т.п: Могут производиться новые асинхронные запросы.
Асинхронная модель характеризуется почти мгновенной реакцией на действия пользователя, так что создается впечатление удобного и быстрого приложения.
Например, в примере с голосованием выше — кнопка срабатывает сразу, хотя реальный учет голоса происходит позднее, после обработки сообщения сервером.
Из-за такого разрыва между действием и реальным результатом приложение становится гораздо более чувствительно к ошибкам.
Особенно в случае нескольких одновременных асинхронных запросов, нужно заботиться об очередности выполнения и ответа (race-conditions) и, в случае ошибки, оставлять приложение в целостном (consistent) состоянии.
Особенности асинхронной модели
- Сложность в реализации
- Недостаточные возможности браузера (javascript)
- Асинхронная модель сложнее для отладки
- Race conditions
- Неопределена последовательность выполнения
- Можно делать много одновременных задач («удочек»), но задача, начатая первой, может окончиться последней.
- Реакция тут же, но неизвестно, какой будет результат. Усложнена обработка ошибок
- Ошибок коммуникации — разрыв связи, и т.п.
- Пользовательских ошибок — например, не хватило привилегий
- Контроль целостности (bugproof)
- Например, редактор отправил асинхронный запрос на удаление ветки дерева. Добавление в нее нужно отключить, пока не придет ответ сервера. Если вдруг не хватило привилегий, то операция не удалась.
- Интерактивность
- Быстрый интерфейс
Плюсов всего два, зато какие! Овчинка стоит выделки.
Асинхронный drag’n’drop.
Иногда для асинхронных операций необходимо делать различные «финты ушами». Например, хочется сделать drag’n’drop в дереве, т.е перетаскивать статьи из одного раздела в другой мышкой, и чтобы они на сервере в базе данных меняли родителя.
Drag’n’drop — это «взял мышей объект — положил куда надо — готово». Но в асинхронной модели не может быть все прям сразу «готово».
Надо проверить привилегии на сервере, проверить, существует ли еще объект, вдруг его удалил другой пользователь.
Надо как-то показать, что процесс пошел, но результат «ща будет..». А как? В асинхронной модели указатель мыши не может просто так зависнуть над объектом, превратившись в часики.
В таком случае применяют либо синхронные запросы к серверу — и тогда все действительно подвисает, либо оригинальный выход — положить объект, как будто он перенесен, и проинформировать анимированной иконкой об ожидании ответа.
Если ответ отрицателен — обработчик ответа переносит объект обратно.
Stale context, устаревший контекст
В примере с drag’n’drop также затронута проблема «stale context» — устаревшего контекста.
Веб — многопользовательская среда. Если для навигации используется,
скажем, дерево статей, то над ним работают много человек. Один из них может удалить ветку дерева, над которой работает другой: конфликт.
Как правило, для преодоления таких казусов используются следующие средства:
Политика редактирования
Это когда все знают кто чего делает и на уровне деления полномочий и личного общения такие удаления согласовывают. Вариант заведомо небезопасный, но обычно работающий.
Локинг и/или версионный контроль
Локинг — блокирование редактируемых документов.
Версионный контроль — каждый новый документ становится версией, так что изменения никогда не теряются. Версионность влечет за собой конфликты, когда Петя начал редактировать документ раньше Васи, а сохранил — позже. При этом в последней версии изменения Васи оказались потеряны, хотя предпоследняя (Васина) версия в системе обязательно есть.
Более подробно о локинге и версионности можно почитать, например, в документации к системе версионного контроля Subversion.
javascript.ru
Параметр | Описание |
---|---|
url | Строка, содержащая URL адрес, на который отправляется запрос. |
settings | Набор пар ключ/значение, которые настраивают запрос AJAX. Все параметры являются необязательными. Допускается, но не рекомендовано установить значение по умолчанию для любого параметра с использованием метода $.ajaxSetup(). Метод $.ajax() поддерживает следующие параметры:
|
basicweb.ru