Баннер мобильный (3) Пройти тест

Руководство по AJAX: делаем сайты живыми

Как обновлять страницы без перезагрузки с помощью AJAX

Разбор

6 августа 2025

Поделиться

Скопировано
Руководство по AJAX: делаем сайты живыми

Содержание

    В мире веб-разработки пользователи все чаще ожидают от сайтов мгновенной реакции и плавной работы — без утомительных перезагрузок страниц. Именно здесь на помощь приходит AJAX — технология, позволяющая обновлять содержимое сайта «на лету», делая взаимодействие с ним быстрым и удобным. 

    В этом руководстве мы разберемся, как работает AJAX, зачем он нужен и как с его помощью превратить обычный сайт в динамичный и отзывчивый.

    Что такое AJAX

    AJAX (Asynchronous JavaScript and XML) — это способ обновлять данные на веб-странице, не перезагружая ее целиком.

    Слово «асинхронный» значит, что код не ждет ответа от сервера, чтобы продолжить работу. Он отправляет серверу запрос, а сам продолжает выполнять другие задачи.

    Например, когда мы листаем ленту в соцсетях, новые посты подгружаются сами без мигания экрана. Это и есть AJAX. Без него каждое обновление — например, отправка формы или загрузка новых сообщений в чате — заставляло бы страницу перезагружаться и раздражать пользователей.

    Как работает AJAX

    AJAX — не отдельная технология, а комбинация инструментов: JavaScript, Fetch API (или XMLHttpRequest) и DOM.

    JavaScript для написания кода

    Это язык программирования, который управляет всей логикой AJAX. JavaScript отправляет запросы на сервер, обрабатывает ответы и обновляет страницу. Без него AJAX невозможен, так как он «склеивает» все остальные инструменты.

    Fetch API или XMLHttpRequest для общения с сервером и DOM для изменения страницы

    DOM — это структура веб-страницы, с которой JavaScript работает, чтобы менять содержимое. Например, мы получаем новые данные с сервера, а DOM помогает вставить их в нужное место на странице.

    XMLHttpRequest — это API для обмена данными между клиентом и сервером. Это старый способ отправки запросов, который чаще использовали до появления Fetch API.

    XML в названии AJAX означает формат данных для обмена между сервером и страницей. Но JSON сейчас популярнее, потому что он проще и компактнее.

    Например, JSON выглядит так:

    {"name": "Алекс", "age": 25}

    XML более громоздкий, с тегами вроде:

    <name>Алекс</name>

    Так выглядит GET-запрос с XMLHttpRequest, который получает данные о пользователе с id 1 с тестового API JSONPlaceholder и выводит их на страницу через DOM:

    script.js

    const xhr = new XMLHttpRequest();
    xhr.open('GET', 'https://jsonplaceholder.typicode.com/users/1', true);
    xhr.onload = function () {
      if (xhr.status === 200) {
        const data = JSON.parse(xhr.responseText);
        const output = document.getElementById('output');
        output.textContent = `Имя: ${data.name}, Email: ${data.email}`;
      } else {
        console.log('Ошибка:', xhr.status);
      }
    };
    xhr.onerror = function () {
      console.log('Ошибка сети');
    };
    xhr.send();

    index.html

    <!DOCTYPE html>
    <html lang="ru">
    <head>
      <meta charset="UTF-8">
      <title>AJAX с XMLHttpRequest</title>
    </head>
    <body>
      <h1>Данные пользователя</h1>
      <div id="output">Загрузка...</div>
      <script src="script.js"></script>
    </body>
    </html>

    Здесь:

    • const xhr = new XMLHttpRequest() создает объект XMLHttpRequest, который будет отправлять запрос.
    • xhr.open(‘GET’, ‘https://jsonplaceholder.typicode.com/users/1’, true) настраивает запрос: метод GET, URL для API, и параметр true для асинхронного выполнения (это делает запрос AJAX).
    • xhr.onload = function () { … } устанавливает, что делать, когда сервер ответит. Если статус ответа 200 (успех), парсим ответ с помощью JSON.parse, так как данные приходят в формате JSON (например, {«name»: «Leanne Graham», «email»: «Sincere@april.biz»}). Затем обновляем <div id=»output»> в index.html.
    • xhr.onerror = function () { … } обрабатывает сетевые ошибки, например, если сервер недоступен.
    • xhr.send() отправляет запрос на сервер.

    Оба файла — script.js и index.html должны быть в одной папке. Если все корректно, то при открытии файла index.html на экране получим данные о пользователе 1:

    «Имя: Leanne Graham, Email: Sincere@april.biz» вместо «Загрузка…».

    Данные о пользователе
    Скриншот: Анастасия Саврова для Skillfactory Media

    Чтобы не создавать отдельно js и html файлы на своем компьютере, можно протестировать работу AJAX в специальном компиляторе:

    Компилятор
    Скриншот: W3Schools Tryit Editor / Skillfactory Media

    Также можно использовать такие онлайн-компиляторы, как JSFiddle или CodePen:

    1. Вставьте HTML-код в раздел HTML.
    2. Вставьте JavaScript-код в раздел JS.
    3. Нажмите Run и проверьте результат в окне вывода. Это удобно для быстрого тестирования, но для реальных проектов лучше использовать локальные файлы или сервер.
    • Fetch API — еще один интерфейс для получения ресурсов. Это более современный способ отправлять запросы на сервер и получать ответы. Он удобнее чем XMLHttpRequest, потому что использует простые, короткие команды и работает с Promise.

    Promise — это объект в JavaScript, который помогает работать с асинхронными операциями. Он имеет три состояния:

    • Ожидание (Pending): запрос отправлен, ответа пока нет.
    • Успех (Fulfilled): сервер ответил, данные получены.
    • Ошибка (Rejected): что-то пошло не так (например, сервер недоступен).

    Вызов fetch(‘/data’) вернет Promise. К нему можно применять методы then() для обработки успешного ответа и catch() для обработки ошибок.

    Например:

    fetch(‘/data’)
      //Получаем данные в формате JSON
      .then(response => response.json())
      //Выводим данные
      .then(data => console.log(data))
      //Обрабатываем ошибку
      .catch(error => console.log(‘Ошибка:’, error)); 

    fetch('/data')
      //Получаем данные в формате JSON
      .then(response => response.json())
      //Выводим данные
      .then(data => console.log(data))
      //Обрабатываем ошибку
      .catch(error => console.log('Ошибка:', error)); 

    Здесь Fetch API отправляет запрос, а Promise позволяет дождаться ответа и обработать его, не блокируя остальной код.

    Если обобщить, то AJAX-запрос с Fetch API — это вызов функции fetch() и последующая обработка ответа с помощью then() и catch().

    С Fetch API скрипт получается лаконичнее, а результат тот же, что и при использовании XMLHttpRequest. К тому же, для работы с JSON в XMLHttpRequest приходится его парсить через JSON.parse(), а в Fetch API есть встроенная поддержка JSON.

    Но в конечном итоге решение о том, что из них выбрать, будет зависеть от того, что используют в конкретном проекте.

    Примеры AJAX-запросов с Fetch API

    В качестве простого примера рассмотрим GET-запрос к серверу JSONPlaceholder с помощью Fetch API. В этот раз получим данные о пользователе с id 2 и отобразим их на странице.

    Напишем script.js:

    fetch('https://jsonplaceholder.typicode.com/users/2')
      .then(response => response.json())
      .then(data => {
        const output = document.getElementById('output');
        output.textContent = `Имя: ${data.name}, Email: ${data.email}`;
      })
      .catch(error => console.log('Ошибка:', error));

    Также создадим index.html:

    <!DOCTYPE html>
    <html lang="ru">
    <head>
      <meta charset="UTF-8">
      <title>AJAX Пример</title>
    </head>
    <body>
      <h1>Данные пользователя</h1>
      <div id="output">Загрузка...</div>
      <script src="script.js"></script>
    </body>
    </html>
    • <div id=»output»> — это место, куда выведутся данные, полученные с сервера. Если запрос не удался, ошибка выводится в консоль.
    • <script src=»script.js»> подключает JavaScript-файл, где будет код для AJAX-запроса.

    Результат:

    Данные пользователя
    Скриншот: Анастасия Саврова для Skillfactory Media

    Получили данные пользователя 2.

    Автозаполнение форм

    Если ввести запрос в строку поиска, JavaScript отправит введенный текст на сервер через Fetch API. Сервер вернет подсказки в JSON, и JavaScript обновит список подсказок через DOM.

    В качестве сервера возьмем открытый API для поиска книг Open Library.

    Поиск книг
    Скриншот: Анастасия Саврова для Skillfactory Media

    Скрипт

    const input = document.getElementById('search');
    input.addEventListener('input', () => {
      fetch(`https://openlibrary.org/search.json?q=${input.value}`)
        .then(response => response.json())
        .then(data => {
          const list = document.getElementById('suggestions');
          //Берем первые 5 книг для подсказок
          const suggestions = data.docs.slice(0, 5).map(book => book.title);
          list.innerHTML = suggestions.map(s => `<li>${s}</li>`).join('');
        })
        .catch(error => console.log('Ошибка:', error));
    });

    HTML

    <h1>Поиск книг</h1>
      <input id="search" type="text" placeholder="Введите название книги">
      <ul id="suggestions"></ul>
      <script src="script.js"></script>

    Как это работает:

    1. Пользователь вводит текст в поле <input id=»search»>.
    2. JavaScript формирует URL, например, https://openlibrary.org/search.json?q=hobbit.
    3. Fetch API отправляет GET-запрос к Open Library API.
    4. Сервер возвращает JSON с результатами поиска, из которых мы берем заголовки книг (docs[].title) и выводим первые 5 в <ul id=»suggestions»>.
    5. Если запрос не удался, в консоли увидим ошибку.

    Поиск координат

    Для поиска координат определенного места на карте можно воспользоваться Nominatim API от OpenStreetMap. Базовые запросы к этому API можно выполнять без токена.

    Поиск на карте
    Скриншот: Анастасия Саврова для Skillfactory Media

    Скрипт

    const input = document.getElementById('search');
    input.addEventListener('input', () => {
      clearTimeout(window.searchTimeout);
      window.searchTimeout = setTimeout(() => {
        fetch(`https://nominatim.openstreetmap.org/search?q=${input.value}&format=json&limit=5`)
          .then(response => response.json())
          .then(data => {
            const list = document.getElementById('suggestions');
            const suggestions = data.map(place => place.display_name);
            list.innerHTML = suggestions.map(s => `<li>${s}</li>`).join('');
           
            if (data.length > 0) {
              const map = document.getElementById('map');
              const { lat, lon } = data[0];
              map.innerHTML = `<p>Координаты: ${lat}, ${lon}</p>`;
            }
          })
          .catch(error => console.log('Ошибка:', error));
      }, 1000);
    });

    HTML

    <h1>Поиск на карте</h1>
      <input id="search" type="text" placeholder="Введите место">
      <ul id="suggestions"></ul>
      <div id="map"></div>
      <script src="script.js"></script>

    Как это работает:

    1. Пользователь вводит название места (например, «Москва») в <input id=»search»>.
    2. JavaScript формирует URL для Nominatim API, например, https://nominatim.openstreetmap.org/search?q=Москва&format=json&limit=5. Fetch API отправляет GET-запрос.
    3. Сервер возвращает JSON с координатами. Код выводит до 5 подсказок в <ul id=»suggestions»> и показывает координаты первого результата в <div id=»map»>.
    4. Также добавлена задержка (debounce) в 1 секунду, чтобы соблюдать лимит Nominatim (1 запрос/сек).

    Подведем итоги

    • AJAX — комбинация JavaScript, Fetch API (или XMLHttpRequest) и DOM. 
    • JavaScript управляет логикой, Fetch API или XMLHttpRequest отправляют запросы к серверу, DOM обновляет содержимое страницы.
    • Работает AJAX следующим образом: JavaScript отправляет асинхронный запрос на сервер, получает данные и обновляет страницу через DOM. Асинхронность не блокирует страницу, в отличие от синхронных запросов. 
    • Для запуска AJAX можно создать HTML и JavaScript файлы, либо воспользоваться онлайн-компилятором.

    Разбор

    Поделиться

    Скопировано
    0 комментариев
    Комментарии