Технология AJAX – это способ обмена данными клиента (компьютера пользователя) с сервером для обновления частей веб-страницы без перезагрузки всей страницы. Для выполнения AJAX-запросов в нативном JavaScript существует специальный объект XMLHTTPRequest. Библиотека jQuery предоставляет для работы с AJAX набор методов, которые имеет смысл использовать в различных ситуациях в зависимости от типа запроса и вида передаваемых данных.
Виды методов jQuery для выполнения AJAX-запросов
В следующей таблице перечислены все AJAX-методы. доступные в библиотеке jQuery, причем, если в первой колонке вы видите ссылку на метод, то на сайте есть статья, которая ему посвящена:
Метод | Описание |
---|---|
$.ajax() | Выполняет асинхронный AJAX-запрос |
$.ajaxPrefilter() | Обработка пользовательских Ajax -параметров или изменение существующих параметров перед отправкой каждого запроса и до того, как они будут обработаны методом $.ajax() |
$.ajaxSetup() | Устанавливает значения по умолчанию для будущих AJAX-запросов |
$.ajaxTransport() | Создает объект, который обрабатывает фактическую передачу данных Ajax |
$.get() | Загружает данные с сервера с помощью AJAX-запроса методом GET |
$.getJSON() | Загружает данные в кодировке JSON с сервера с помощью HTTP-запроса GET. |
$.parseJSON() | Принимает правильно сформированную строку JSON и возвращает полученное значение JavaScript. Не рекомендуется в версии 3.0, используйте вместо этого метод JSON.parse(). |
$.getScript() | Загружает (и выполняет) JavaScript с сервера с помощью AJAX и GET-запроса |
$.param() | Создает сериализованное представление массива или объекта (может использоваться как строка запроса URL для запросов AJAX) |
$.post() | Загружает данные с сервера с помощью HTTP POST-запроса |
ajaxComplete() | Задает функцию, запускаемую после завершения AJAX-запроса |
ajaxError() | Задает функцию, запускаемую, когда AJAX-запрос завершается с ошибкой |
ajaxSend() | Задает функцию, запускаемую перед отправкой AJAX-запроса |
ajaxStart() | Задает функцию, запускаемую при первом AJAX-запросе |
ajaxStop() | Определяет функцию, запускаемую, когда все запросы AJAX завершены |
ajaxSuccess() | Задает функцию, запускаемую при успешном завершении AJAX-запроса |
load() | Загружает данные с сервера и помещает возвращенные данные в выбранный элемент |
serialize() | Кодирует набор элементов формы как строку для отправки данных в виде пар “имя1=значение1&имя2=значение2” |
serializeArray() | Кодирует набор элементов формы как массив имен и значений |
Каждый из этих методов может употребляться в зависимости от ситуации, но, пожалуй, самым универсальным из них является метод $.ajax
, практическое использование которого мы рассмотрим в этой статье.
Метод $.ajax
Прежде,чем мы будем применять метод $.ajax
в JavaScript, давайте определимся с практической задачей. Она достаточно простая – пользователь должен заполнить простую форму, а после этого мы отправим ее на сервер и получим все заполненные данные в виде таблицы. В форме нужно будет указать имя (логин), email и набор знаний в виде отмеченных флажков (чекбоксов).
HTML-разметка
Давайте посмотрим на разметку формы в html-файле:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<form action=“php/test-ajax.php” class=“small-form” id=“testForm”>
<p><label for=“username”>Ваше имя</label>
<input type=“text” id=“username” name=“username” required></p>
<p><label for=“useremail”>Ваш email</label>
<input type=“email” id=“useremail” name=“useremail” required></p>
<p class=“col-2”><label>Знания:</label></p>
<div class=“row”>
<div>
<label><input type=“checkbox” name=“skills[]” value=“HTML”> HTML</label>
<label><input type=“checkbox” name=“skills[]” value=“CSS”> CSS</label>
</div>
<div>
<label><input type=“checkbox” name=“skills[]” value=“JavaScript”> JavaScript</label>
<label><input type=“checkbox” name=“skills[]” value=“PHP”> PHP</label>
</div>
</div>
<button id=“send” class=“btn btn-info”>Отправить</button>
</form>
<div class=“loader” style=“display: none”>
<div id=“loader-1”>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
<table class=“small-width”>
<thead>
<tr>
<th>Данные</th>
<th>Значение</th>
</tr>
</thead>
<tbody></tbody>
</table>
<script src=“js/jquery-3.5.1.min.js”></script>
<script src=“js/jquery-ajax.js”></script>
|
Обратите внимание на name="skills[]"
– мы даем одинаковые имена нескольким чекбоксам (флажкам), чтобы собрать затем все отмеченные пользователем значения в массив.
Кроме того, в самой форме (тег <form>
) есть атрибут action
, который нам понадобится в скрипте.
JavaScript
Метод – $.ajax
позволяет передать ряд параметров внутри функции. Например, это url файла, который будет обрабатывать данные, – он передается в параметре url. В параметре type указывается метод передачи данных: чаще всего ‘POST’, т.к. он позволяет передавать бОльшие объемы данных, но также может быть ‘GET’, особенно, когда данные нужно получать, а не передавать.
В параметре data указываются те данные, которые нужно отправить на сервер в виде пар “имя_переменной: значение”. Очень удобно использовать для этой цели метод jQuery serialize()
, который собирает все данные формы в строку "переменная1=значение1&переменная2=значение2&переменная3=значение3"
и т.д.
Функция success позволит нам вставить полученное ею значение (параметр ) в нужное место html-разметки. Код, представленный ниже нужно разместить в файле jquery-ajax.js, который в разметке мы подключим после подключения jQuery нужной вам версии.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
$(document).ready(function() {
let testForm = $(‘#testForm’);
testForm.submit(function() {
if ($(‘#username’).val().length < 5) {
alert(“Введите не менее 5 символов!”);
$(‘#username’).focus();
return false;
}
if ($(‘#useremail’).val().length < 5) {
alert(“Введите не менее 5 символов!”);
$(‘#useremail’).focus();
return false;
}
if ($(‘input[name=”skills[]”]:checked’).length == 0) {
alert(“Выберите хотя бы один пункт!”);
return false;
}
$.ajax({
url: testForm.attr(‘action’),
type: ‘POST’,
data: testForm.serialize(),
dataType: ‘html’,
beforeSend: function(){
$(‘.loader’).show();
},
success: function(result) {
$(“.small-width tbody”).html(result);
},
complete: function(){
$(‘.loader’).hide();
}
});
return false;
});
});
|
Обратите внимание, что мы обрабатываем событие submit
для формы. Сначала мы проверяем правильность заполнения всех полей, и только в случае, если все верно заполнено пользователем, переходим к методу $.ajax
.
При отправке AJAX-запроса указываем в параметре url данные из атрибута action
нашей формы. В нашем примере это файл test-ajax.php, который размещен в папке php, являющейся дочерней для каталога с нашим html-файлом.
Использование предзагрузчика
Как правило, для того чтобы данные ушли на сервер, и файл на сервере вернул ответ, нужно некоторое время. Чем проще передаваемые данные и меньше их объем, а также больше скорость Интернета, тем меньше времени требуется для выполнения этих действий. Чтобы показать пользоваелю, что процесс идет, обычно используют предзагрузчик – gif-изображение или код HTML+CSS. Мы используем второй вариант – для этого перед таблицей в html-разметке у нас есть <div class="loader" style="display: none">
. Здесь сразу явно указано, что первоначально этот блок скрыт. Вы можете сделать это в css-файле – здесь код css приводить не будем.
В JavaScript при отправке запроса методом $.ajax
можно использовать функцию beforeSend
для отображения предзагрузчика и функцию complete
для его скрытия.
1
2
3
4
5
6
7
|
beforeSend: function(){
$(‘.loader’).show();
},
...,
complete: function(){
$(‘.loader’).hide();
}
|
Если у вас хорошая скорость Интернета, то вы можете не заметить появления предзагрузчика. Если же вы смотрите работу кода через мобильный Интернет, то скорей всего увидите его. Кроме того, в Chrome можно эмулировать соединение через 3G, выбрав соответствующую настройку на вкладке Сеть.
Код PHP-файла
Код PHP-файла test-ajax.php тоже простой. Мы сделаем проверку на наличие нужных переменных, а затем соберем их значения в виде строк таблицы:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php
if(!isset($_POST[‘username’])|| !isset($_POST[‘useremail’]) ||
!isset($_POST[‘skills’]) ) die(‘Нет нужных данных’);
$res = ”;
foreach($_POST as $key=>$value){
if($key == ‘username’) $first = ‘Имя (Логин)’;
if($key == ‘useremail’) $first = ‘Email’;
if($key == ‘skills’) {
$first = ‘Знания:’;
if(is_array ($value))$value = implode(‘, ‘, $value);
}
$res .= “<tr><td>$first</td><td>$value</td></tr>”;
}
echo $res;
die();
|
Давайте проверим код в действии (открыть пример в новой вкладке).
Работаем с Инспектором свойств браузера
Заголовки AJAX-запроса
Помимо того, что мы видим работу запроса в виде таблицы в html-файле, мы можем также проверить наш XHR запрос на вкладке Сеть (Network) в Инструментах разработчика (F12, или CTRL +SHIFT + I) в Chrome или Mozilla Firefox, так как все передаваемые нами данные уходят с помощью специальных заголовков.
Слева мы видим php-файл, который получил запрос и как-то на него ответил. Справа – данные самого запроса. На скриншоте выше это те отправленные данные, которые заполнил (отметил) в форме пользователь в виде пар имя_переменной: значение
.
В случае, когда пользователь отметил 1, 2 и более чекбокса, мы видим, что в Google Chrome передаются данные массива.
В инспекторе свойств браузера Firefox подобная картина, хоть и несколько иначе отображаемая.
Ответ сервера
В той же вкладке Сеть (Network) Инспектора свойств вы найдете и ответ сервера, который был сформирован нашим php-файлом. И в Chrome, и в Firefox мы можем видеть строки таблицы с отправленными данными.
Ошибки при AJAX-запросах
К сожалению, не все бывает так радужно с первого раза. Довольно часто в консоли вы можете наблюдать 500-ю ошибку (Internal Server Error). Как правило, она возникает тогда, когда есть ошибки в PHP-коде.
Например, эта возникла, когда в 4-й строке вместо знака =>
стоял знак =
в записи foreach($_POST as $key=>$value
) . Не хватало всего-навсего угловой скобки, но это та синтаксическая ошибка, которая не дает выполнить скрипт.
Узнать подробнее об ошибках вы можете из файла error_log, который автоматически формируется на сервере в той папке, где произошла ошибка.
1
|
PHP Parse error: syntax error, unexpected ‘=’, expecting :: (T_PAAMAYIM_NEKUDOTAYIM) in /ajax/php/test–ajax.php on line 4
|
Кроме того, у вас может возникнуть 403 ошибка в том случае, если доступ к каким-то файлам или папкам на сервере у вас ограничен.
Особенности AJAX-запросов в jQuery 3-й версии
В официальной документации по методу jQuery.ajax() вы найдете информацию о том, что функции success()
, error()
и complete()
заменены на done()
, fail()
и always()
.
Однако, код, приведенный выше с использованием функций success()
и complete()
вполне работоспособный: запрос отправляется и ответ от сервера возвращается. Происходит это потому, что данные функции являются свойствами объекта $.ajax
, а не его методами. Deprecated (устаревшими) являются методы изменения состояния AJAX .success
, .error
и .complete
для объекта JQuery XML HTTP Request (jqXHR), которые действительно устарели.
Тем не менее, вы можете перейти к рекомендуемым функциям и несколько переделать код js-файла таким образом:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
$(document).ready(function() {
let testForm = $(‘#testForm’);
testForm.submit(function() {
if ($(‘#username’).val().length < 5) {
alert(“Введите не менее 5 символов!”);
$(‘#username’).focus();
return false;
}
if ($(‘#useremail’).val().length < 5) {
alert(“Введите не менее 5 символов!”);
$(‘#useremail’).focus();
return false;
}
if ($(‘input[name=”skills[]”]:checked’).length == 0) {
alert(“Выберите хотя бы один пункт!”);
return false;
}
$.ajax({
url: testForm.attr(‘action’),
type: ‘POST’,
data: testForm.serialize(),
dataType: ‘html’,
beforeSend: function() {
$(‘.loader’).show();
}
}).done(function(result) {
$(“.small-width tbody”).html(result);
}).always(function() {
$(‘.loader’).hide();
});
return false;
});
})
|
Второй пример с использованием функций done()
и always()
(открыть в новой вкладке):
Обратите внимание, что синтаксис этих функция несколько иной, т.к. используется технология промисов, которая позволяет назначать несколько обратных вызовов для одного запроса, например, так:
1
2
3
|
var somerequest = $.ajax({ ... });
somerequest.done(function(data) { /* Код 1 */ });
somerequest.done(function(data) { /* Код 2 */ });
|
Так что выбор способа описания функций остается за вами.
Еще один пример использования метода jQuery $.ajax
вы можете найти в статье “Ajax-запросы с помощью jQuery 3-й версии и модального окна Bootstrap 4”.