jQuery - отправка данных AJAX. Примеры.
- GET запрос через AJAX
- POST запрос через AJAX
- Отправка формы через AJAX
- Работа с JSON
- Выполнение JS загруженного через AJAX
- Дождаться выполнения AJAX запроса
- Отправка HTTP заголовков
- Ajax - Обработка ошибок
Сегодня технология AJAX используется практически на всех ресурсах интернета. Спектр её применения необычайно широк и технологичен. Основная задача AJAX это обмен данными между сайтом и сервером без традиционной перезагрузки страницы.
GET запрос через AJAX
Например, нам нужно обратиться к файлу test.php с парамертром "testdata" и значением "test" и получить ответ сервера, что данные приняты, но без перезагрузки страницы в от личии от традиционного GET запроса как а браузерной строке "https://site.ru?testdata=test" с перезагрузкой. При удачном запросе в ответе получаем сообщение: "Успешное получение данных".
$.ajax({ url: '/test.php', /* Куда пойдет запрос */ method: 'get', /* Метод передачи (post или get) */ dataType: 'html', /* Тип данных в ответе (xml, json, script, html). */ data: {testdata: 'test'}, /* Параметры передаваемые в запросе. */ success: function(data){ /* функция которая будет выполнена после успешного запроса. */ alert(data); /* В переменной data содержится ответ от test.php. */ } });
Или использовать сокращённую функцию $.get
$.get('/test.php', {testdata: 'Test'}, function(data){ alert(data); });
Код файла приёма данных:
if($_GET['testdata'] == 'test'){ echo 'Успешное получение данных - ' . $_GET['test']; }
GET запросы могут кэшироваться браузером или сервером, чтобы этого избежать нужно добавить в функцию параметр – cache: false
.
$.ajax({ url: '/test.php', method: 'get', cache: false });
POST запрос через AJAX
$.ajax({ url: '/test.php', method: 'post', dataType: 'html', testdata: {text: 'Test'}, success: function(data){ alert(data); } }); //Или сокращенный вариант – функция $.post $.post('/test.php', {testdata: 'Test'}, function(data){ alert(data); });
POST запросы ни когда не кэшируются.
Отправка формы через AJAX
При отправке формы применяется функция serialize().
Она обходит форму и собирает названия и заполненные пользователем значения полей и возвращает в виде массива:
{login: 'ЗНАЧЕНИЯ_ПОЛЯ', password: 'ЗНАЧЕНИЯ_ПОЛЯ'}.
Особенности serialize():
Кнопки формы по которым был клик игнорируются, в результате функции их не будет.
serialize можно применить только к тегу form и полям формы, т.е. $('div.form_container').serialize(); – вернет пустой результат.
Пример отправки и обработки формы:
<div class="form_container"> <div id="message"></div> <form id="form"> <input type="text" name="login"> <input type="text" name="password"> <input type="submit" name="send" value="Отправить"> </form> </div>
<script> $("#form").on("submit", function(){ $.ajax({ url: '/handler.php', method: 'post', dataType: 'html', data: $(this).serialize(), success: function(data){ $('#message').html(data); } }); }); </script>
if (empty($_POST['login'])) { echo 'Укажите логин'; } elseif (empty($_POST['password'])) { echo 'Укажите пароль'; } else { echo 'Авторизация...'; }
Работа с JSON
Приориететное применение в случае когда в ответе нужно передать массив данных.
$.ajax({ url: '/json.php', method: 'get', dataType: 'json', success: function(data){ alert(data.text); /* выведет "Текст" */ alert(data.error); /* выведет "Ошибка" */ } }); //Сокращённый синтаксис $.getJSON('/json.php', function(data) { alert(data.text); alert(data.error); });
$.getJSON передает запрос только через GET.
Код файла json.php:
header('Content-Type: application/json'); $result = array( 'text' => 'Текст', 'error' => 'Ошибка' ); echo json_encode($result);
Возможные проблемы
При работе с JSON может всплыть одна ошибка – после запроса сервер отдал результат, все хорошо, но метод success не срабатывает. Причина кроется в серверной части (PHP) т.к. перед данными могут появится управляющие символы, например:
Из-за них ответ считается не валидным и считается как ошибочный запрос.
В таких случаях помогает очистка буфера вывода ob_end_clean (если он используется на сайте).
Из-за них ответ считается не валидным и считается как ошибочный запрос.
В таких случаях помогает очистка буфера вывода ob_end_clean (если он используется на сайте).
... // Очистка буфера ob_end_clean(); header('Content-Type: application/json'); echo json_encode($result, JSON_UNESCAPED_UNICODE); exit();
Выполнение JS загруженного через AJAX
В JQuery реализована функция подгруздки javascript кода через AJAX, после успешного получения ответа на запрос он будет сразу выполнен.
$.ajax({ method: 'get', url: '/script.js', dataType: "script" }); //Или короткий вариант $.getScript('/script.js');
Дождаться выполнения AJAX запроса
По умолчанию в JQuery AJAX запросы выполняются асинхронно. Т.е. запрос не задерживает выполнение программы пока ждет результатов, а работает параллельно.
Пример:
var text = ''; $.ajax({ url: '/index.php', method: 'get', dataType: 'html', success: function(data){ text = data; } }); alert(text); /* Переменная будет пустая. */
Переменная text будет пустая, а не как ожидается текст который вернул index.php
Чтобы включить синхронный режим нужно добавить параметр async: false.
Соответственно синхронный запрос будет вешать прогрузку страницы если код выполняется в
страницы.
var text = ''; $.ajax({ url: '/index.php', method: 'get', dataType: 'html', async: false, success: function(data){ text = data; } }); alert(text); /* В переменной будет результат из index.php. */
Отправка HTTP заголовков
Через AJAX можно отправить заголовки HEAD, они указываются в параметре headers.
$.ajax({ url: '/index.php', method: 'get', dataType: 'html', headers: {'Token_value': 123}, success: function(data){ console.dir(data); } });
В PHP они будут доступны в массиве $_SERVER
, ключ массива переводится в верхний регистр с приставкой HTTP_
, например:
<?php echo $_SERVER['HTTP_TOKEN_VALUE']; // 123
Ajax - Обработка ошибок.
Через параметр error задается callback-функция, которая будет вызвана в случаи если запрашиваемый ресурс отдал 404, 500 или другой код.
$.ajax({ url: '/index.php', method: 'get', dataType: 'json', success: function(data){ console.dir(data); }, error: function (jqXHR, exception) { if (jqXHR.status === 0) { alert('Not connect. Verify Network.'); } else if (jqXHR.status == 404) { alert('Requested page not found (404).'); } else if (jqXHR.status == 500) { alert('Internal Server Error (500).'); } else if (exception === 'parsererror') { alert('Requested JSON parse failed.'); } else if (exception === 'timeout') { alert('Time out error.'); } else if (exception === 'abort') { alert('Ajax request aborted.'); } else { alert('Uncaught Error. ' + jqXHR.responseText); } } });
Через $.ajaxSetup можно задать обработчик ошибок для всех AJAX-запросов на сайте.
$.ajaxSetup({ error: function (jqXHR, exception) { ... } });