AJAX в JavaScript
AJAX в JavaScript — подход к обмену данными между веб-страницей и сервером без полной перезагрузки страницы. С помощью AJAX интерфейс может получать новые данные, отправлять формы, обновлять отдельные блоки, подгружать списки, проверять введённые значения и взаимодействовать с API в фоновом режиме.
Название AJAX исторически расшифровывается как Asynchronous JavaScript and XML, но в современной разработке XML используется нечасто. Чаще всего данные передаются в формате JSON, а для запросов применяется интерфейс fetch(). Старый объект XMLHttpRequest по-прежнему поддерживается браузерами, но в новых проектах его обычно заменяют более удобным Fetch API.[1][2]
Что решает AJAX
До широкого использования AJAX многие действия на сайте требовали полной перезагрузки страницы: отправка формы, переход между страницами списка, обновление корзины, проверка логина, загрузка комментариев. AJAX позволяет выполнять такие операции точечно: браузер отправляет HTTP-запрос, получает ответ и обновляет только нужный фрагмент интерфейса.
Типичные задачи AJAX:
- загрузка данных из API;
- отправка формы без перезагрузки страницы;
- автодополнение в поисковой строке;
- динамическая фильтрация товаров или статей;
- обновление счётчиков, уведомлений и корзины;
- подгрузка следующей части списка;
- обмен данными с серверной частью одностраничного приложения.
AJAX не является отдельным языком программирования или самостоятельной технологией. Это способ организации взаимодействия между JavaScript-кодом на странице, браузерными API, HTTP-запросами и сервером.
Как работает AJAX-запрос
Обычная схема AJAX-запроса выглядит так:
- Пользователь выполняет действие на странице: нажимает кнопку, вводит текст, отправляет форму.
- JavaScript перехватывает действие и формирует HTTP-запрос.
- Браузер отправляет запрос на сервер.
- Сервер возвращает ответ: JSON, HTML-фрагмент, текст, статус операции или ошибку.
- JavaScript обрабатывает ответ и изменяет страницу через DOM.
Главное отличие от обычного перехода по ссылке или отправки формы состоит в том, что страница остаётся открытой. Меняется только та часть интерфейса, которую обновляет JavaScript.
Fetch API
fetch() — современный браузерный метод для выполнения сетевых запросов. Он возвращает объект Promise, поэтому хорошо сочетается с async и await.[3]
Простейший запрос к JSON-ресурсу:
async function loadData() {
const response = await fetch('/api/articles');
const data = await response.json();
console.log(data);
}
Метод fetch() не считает HTTP-ответы с кодами 404 или 500 ошибкой JavaScript. Промис будет отклонён при сетевой ошибке, но при ответе сервера с ошибочным HTTP-статусом нужно отдельно проверять свойство response.ok.
async function loadData() {
const response = await fetch('/api/articles');
if (!response.ok) {
throw new Error('Ошибка HTTP: ' + response.status);
}
return await response.json();
}
Отправка данных на сервер
AJAX-запрос может не только получать, но и отправлять данные. Для отправки JSON обычно указывают метод POST, заголовок Content-Type и тело запроса.
async function createArticle(article) {
const response = await fetch('/api/articles', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(article)
});
if (!response.ok) {
throw new Error('Не удалось сохранить данные');
}
return await response.json();
}
При отправке форм можно использовать не только JSON, но и объект FormData. Он удобен для обычных HTML-форм и загрузки файлов.
Практический пример
В примере ниже кнопка запускает асинхронную загрузку данных. Чтобы пример работал прямо в статье и не зависел от стороннего сервера, JSON создаётся внутри страницы и передаётся в fetch() через data: URL. В реальном проекте вместо такого URL обычно используется адрес API на сервере.
Обработка ошибок
AJAX-код должен учитывать ошибки. Запрос может завершиться неудачно из-за сетевой проблемы, недоступности сервера, ошибки авторизации, неправильного формата ответа или серверной ошибки.
Практичный вариант обработки:
try {
const response = await fetch('/api/profile');
if (!response.ok) {
throw new Error('HTTP ' + response.status);
}
const profile = await response.json();
renderProfile(profile);
} catch (error) {
showMessage('Данные временно недоступны');
console.error(error);
}
Пользователю лучше показывать понятное сообщение, а технические детали оставлять в логах или консоли разработчика.
XMLHttpRequest
XMLHttpRequest — старый интерфейс для AJAX-запросов. Именно он долгое время был основным способом фоновой загрузки данных в браузере. Он остаётся доступным, но код с ним обычно длиннее и менее удобен, чем вариант с fetch().
const request = new XMLHttpRequest();
request.open('GET', '/api/articles');
request.onload = function () {
if (request.status >= 200 && request.status < 300) {
const data = JSON.parse(request.responseText);
console.log(data);
}
};
request.onerror = function () {
console.error('Сетевая ошибка');
};
request.send();
В новых проектах обычно используют fetch(), а XMLHttpRequest встречается в старом коде, библиотеках совместимости и проектах, где требуется специфическое поведение старого API.
CORS и ограничения безопасности
Браузер ограничивает AJAX-запросы между разными доменами. Если страница с одного домена обращается к API на другом домене, сервер должен разрешить такой запрос через механизм CORS. Без корректных CORS-заголовков браузер заблокирует доступ JavaScript к ответу, даже если сервер технически ответил на запрос.
AJAX также не отменяет обычные требования безопасности:
- проверка прав доступа должна выполняться на сервере;
- пользовательские данные нельзя доверять без проверки;
- для изменения данных нужны защита от CSRF и корректная авторизация;
- секретные ключи и пароли нельзя хранить в клиентском JavaScript;
- ответ сервера нужно обрабатывать аккуратно, не вставляя непроверенный HTML в страницу.
AJAX и современные приложения
AJAX стал основой динамических веб-интерфейсов. На нём построены автоподсказки, личные кабинеты, панели администрирования, онлайн-редакторы, интерактивные карты, чаты и многие элементы одностраничных приложений.
В современных проектах AJAX часто используется вместе с фреймворками и библиотеками: React, Vue, Angular, Svelte и другими. При этом базовая идея остаётся прежней: JavaScript запрашивает данные, получает ответ и обновляет интерфейс без полной перезагрузки страницы.
Когда AJAX не нужен
AJAX не стоит применять для каждой ссылки и каждой формы без необходимости. Обычная загрузка страницы проще, надёжнее и лучше работает без JavaScript. AJAX оправдан, когда он действительно улучшает интерфейс: ускоряет действие, сохраняет состояние страницы, уменьшает объём передаваемых данных или делает взаимодействие удобнее.
Для страниц, где важны индексация, доступность и простая навигация, полезно сохранять базовую HTML-структуру и не превращать весь сайт в зависимый от JavaScript интерфейс без причины.
См. также
Источники
- ↑ Fetch API // MDN Web Docs.
- ↑ XMLHttpRequest // MDN Web Docs.
- ↑ Fetch Standard // WHATWG.
