Краткое руководство по AJAX - Компьюти
Logo КОМПЬЮТИ

Краткое руководство по AJAX

Время на прочтение: 7 мин.

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

Проще говоря, AJAX позволяет обновлять части веб-страницы без перезагрузки всей страницы .

Представьте, что вы ставите лайк(класс) под публикацией в социальных сетях, видите автоподсказки в строке поиска или оставляете комментарий. Страница не закрывается и не перезагружается; контент просто появляется или меняется плавно. Это AJAX в действии.

Аббревиатура: Асинхронный JavaScript и XML

  • Асинхронный : это ключевой момент. Это означает, что браузеру не нужно останавливаться и ждать ответа сервера. Он может отправлять запрос и одновременно выполнять другие действия (например, реагировать на клики пользователя). Когда сервер наконец отправляет данные обратно, их обрабатывает функция JavaScript.
  • JavaScript : JavaScript — это язык, который инициирует запрос и обрабатывает ответ.
  • И XML : XML был первоначальным форматом данных для передачи данных. Сегодня JSON (JavaScript Object Notation) практически полностью заменил его, поскольку он легче и идеально интегрируется с JavaScript.

Почему это меняет правила игры?

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

После AJAX: приложения работают быстрее, отзывчивее и больше похожи на настольные. Это делает пользовательский опыт гораздо более плавным и увлекательным.

Основные концепции: как работает AJAX

По сути, операция AJAX включает в себя следующие этапы:

  • На веб-странице происходит событие (например, нажатие кнопки).
  • JavaScript создает объект запроса и отправляет его на определенный URL-адрес на сервере.
  • Сервер обрабатывает запрос, обращается к базе данных или выполняет некоторую логику.
  • Сервер отправляет ответ обратно на веб-страницу.
  • JavaScript получает ответ и обновляет содержимое страницы ( DOM ) без полной перезагрузки.

Классический метод:XMLHttpRequest

Это оригинальный API браузера для выполнения AJAX-запросов. Хотя современный код часто использует этот fetchAPI, важно понимать XMLHttpRequest(XHR), поскольку он встречается в старых кодовых базах.

// 1. Create a new XHR object
const xhr = new XMLHttpRequest();

// 2. Configure the request
// open(method, url, isAsynchronous)
xhr.open('GET', 'https://api.example.com/data', true);

// 3. Set up a function to run when the request state changes
xhr.onreadystatechange = function() {
  // Check if the request is complete (readyState 4) and successful (status 200)
  if (xhr.readyState === 4 && xhr.status === 200) {
    // 5. Process the response
    const responseData = JSON.parse(xhr.responseText);
    console.log(responseData);
    // Now you can update the DOM with this data
  }
};

// 4. Send the request
xhr.send();

Современный метод: fetchAPI

API — это современный стандарт сетевых запросов, fetch основанный на обещаниях . Он чище, мощнее и рекомендуется для новых проектов.

Запрос GET (извлечение данных):

fetch('https://api.example.com/data')
  .then(response => {
    // Check if the response was successful
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    // Parse the response body as JSON
    return response.json();
  })
  .then(data => {
    // The data is now a JavaScript object
    console.log(data);
    // Update the DOM here
  })
  .catch(error => {
    // Handle any errors that occurred during the fetch
    console.error('Fetch error:', error);
  });

Запрос POST (отправка данных):

const userData = {
  name: 'John Doe',
  email: 'john.doe@example.com'
};

fetch('https://api.example.com/users', {
  method: 'POST', // Specify the method
  headers: {
    'Content-Type': 'application/json' // Tell the server we're sending JSON
  },
  body: JSON.stringify(userData) // Convert the JS object to a JSON string
})
.then(response => response.json())
.then(data => {
  console.log('Success:', data);
})
.catch(error => {
  console.error('Error:', error);
});

Форматы данных: JSON, XML и HTML

JSON (JavaScript Object Notation): стандарт де-факто. Он лёгкий и напрямую сопоставляется с объектами JavaScript.

{
  "id": 1,
  "title": "My First Post",
  "author": "Admin"
}

XML (расширяемый язык разметки): исходный формат. Он более многословен и реже встречается в современных веб-API.

HTML/Обычный текст: Иногда сервер просто отправляет обратно предварительно отформатированный блок HTML или простую строку, которую можно внедрить непосредственно в DOM.

Практический пример Vanilla JS: динамическая отправка формы

Давайте создадим простую контактную форму, которая отправляет данные без перезагрузки страницы.

HTML ( index.html):

<div id="form-message"></div>
<form id="contact-form">
  <input type="text" name="name" placeholder="Your Name" required>
  <input type="email" name="email" placeholder="Your Email" required>
  <button type="submit">Submit</button>
</form>

JavaScript (app.js):

document.getElementById('contact-form').addEventListener('submit', function(event) {
  // Prevent the default form submission (page reload)
  event.preventDefault();

  const form = event.target;
  const formData = new FormData(form); // Uses the FormData API
  const messageDiv = document.getElementById('form-message');

  // Show a loading message
  messageDiv.textContent = 'Sending...';

  // We will use the fetch API
  fetch('/api/contact', { // A hypothetical server endpoint
    method: 'POST',
    body: formData
  })
  .then(response => response.json())
  .then(data => {
    if (data.success) {
      messageDiv.textContent = 'Success! Thank you for your message.';
      form.reset(); // Clear the form
    } else {
      messageDiv.textContent = 'Error: ' + data.message;
    }
  })
  .catch(error => {
    messageDiv.textContent = 'An unexpected error occurred.';
    console.error('Error:', error);
  });
});

AJAX с jQuery

jQuery значительно упростил синтаксис AJAX, поэтому он стал таким популярным. Если вы работаете с проектом, который уже использует jQuery (например, многие темы и плагины WordPress), его AJAX-методы очень удобны.

$('#contact-form').on('submit', function(event) {
  event.preventDefault();

  const form = $(this);
  const messageDiv = $('#form-message');

  messageDiv.text('Sending...');

  $.ajax({
    url: '/api/contact', // The server endpoint
    type: 'POST',
    data: form.serialize(), // jQuery's way of collecting form data
    dataType: 'json', // The expected data type from the server

    // Callback for a successful request
    success: function(response) {
      if (response.success) {
        messageDiv.text('Success! Thank you for your message.');
        form[0].reset();
      } else {
        messageDiv.text('Error: ' + response.message);
      }
    },

    // Callback for a failed request
    error: function(xhr, status, error) {
      messageDiv.text('An unexpected error occurred.');
      console.error('Error:', error);
    }
  });
});

Путь WordPress: AJAX в WordPress

WordPress использует собственный, особый и безопасный способ обработки AJAX-запросов . Никогда не публикуйте сообщения напрямую в PHP-файл в папке темы или плагина. Вместо этого WordPress предоставляет централизованный AJAX API .

Чем AJAX в WordPress отличается?

  1. Централизованная конечная точка: все запросы AJAX (как для административной области, так и для внешнего интерфейса) отправляются в один файл: /wp-admin/admin-ajax.php.
  2. Действия: запросы различаются с помощью action параметра. WordPress затем использует это действие для запуска нужной PHP-функции.
  3. Безопасность: WordPress имеет встроенные функции безопасности, в частности одноразовые коды (числа, используемые один раз), для защиты от атак с подделкой межсайтовых запросов (CSRF) .

Ключевые компоненты

  • wp-admin/admin-ajax.php: URL-адрес, на который вы отправляете все свои запросы.
  • wp_ajax_{action}хук : срабатывает для вошедших в систему пользователей.
  • wp_ajax_nopriv_{action}хук : срабатывает для не вошедших в систему (публичных) пользователей.
  • wp_localize_script(): Правильный способ передачи данных (например, URL-адреса AJAX и одноразового номера безопасности) из PHP в файл JavaScript.
  • wp_send_json_success()/ wp_send_json_error(): Рекомендуемые функции для форматирования ответа JSON и завершения выполнения скрипта.

Шаг 1: Серверная часть (PHP)

Этот код обычно размещается в файле вашей темы functions.php или в пользовательском плагине.

  1. Поставьте в очередь и локализуйте свой скрипт: сначала нам нужно загрузить наш файл JavaScript и предоставить ему необходимые данные.
// In functions.php
add_action('wp_enqueue_scripts', 'my_project_enqueue_scripts');

function my_project_enqueue_scripts() {
    // Enqueue your main script file using wp_enqueue_script
    wp_enqueue_script(
        'my-ajax-script', // A unique handle for your script
        get_template_directory_uri() . '/js/my-ajax-script.js', // Path to your JS file
        array('jquery'), // Dependencies (e.g., jQuery)
        '1.0.0', // Version number
        true // Load in the footer
    );

    // Pass PHP data to the script
    wp_localize_script(
        'my-ajax-script', // The handle of the script to attach data to
        'my_ajax_obj', // The name of the JavaScript object that will contain our data
        array(
            'ajax_url' => admin_url('admin-ajax.php'), // The WordPress AJAX URL
            'nonce'    => wp_create_nonce('my_ajax_nonce') // Create a security nonce
        )
    );
}

2. Создайте функцию обработчика AJAX: это функция PHP, которая будет запущена, когда WordPress получит наш запрос AJAX.

// In functions.php

// The action name must match the 'action' parameter in your JS
add_action('wp_ajax_my_custom_action', 'my_custom_action_handler');
add_action('wp_ajax_nopriv_my_custom_action', 'my_custom_action_handler'); // For logged-out users

function my_custom_action_handler() {
    // 1. Verify the nonce for security
    check_ajax_referer('my_ajax_nonce', 'security');

    // 2. Get data from the request (e.g., from a POST variable)
    $name = sanitize_text_field($_POST['name']);

    // 3. Do something with the data (e.g., process it, query the database)
    if (empty($name)) {
        wp_send_json_error(array('message' => 'Name cannot be empty.'));
    }

    $response_message = "Hello, " . $name . "! Your request was successful.";

    // 4. Send a response back to the browser
    wp_send_json_success(array('message' => $response_message));

    // Note: wp_send_json_* functions automatically call wp_die(), so you don't need it after.
}

Шаг 2: Клиентская сторона (JavaScript)

Теперь в вашем my-ajax-script.js файле вы можете использовать объект, который мы создали с помощью wp_localize_script.

// In /js/my-ajax-script.js

// Using jQuery for simplicity, as it's common in WordPress
jQuery(document).ready(function($) {

    $('#my-trigger-button').on('click', function() {

        const name_to_send = "Alice";

        // The data object to send
        const data = {
            action: 'my_custom_action', // This MUST match the PHP hook name suffix
            security: my_ajax_obj.nonce, // The nonce we passed from PHP
            name: name_to_send // Any other data you want to send
        };

        // Use jQuery's post method
        $.post(my_ajax_obj.ajax_url, data, function(response) {
            // response is the data sent back from the server
            if(response.success) {
                // If wp_send_json_success was used
                alert(response.data.message);
            } else {
                // If wp_send_json_error was used
                alert('Error: ' + response.data.message);
            }
        });
    });
});

Примечание: объект ответа wp_send_json_success()имеет структуру { success: true, data: { ... } }. Ответ от wp_send_json_error()— { success: false, data: { ... } }.

Полный пример WordPress: кнопка «Загрузить больше записей»

Это классический вариант использования.

1. PHP (functions.php):

// --- Enqueue script (same as before, just make sure the handle is correct) ---
add_action('wp_enqueue_scripts', 'my_theme_enqueue_scripts');
function my_theme_enqueue_scripts() {
    wp_enqueue_script('load-more-script', get_template_directory_uri() . '/js/load-more.js', array('jquery'), null, true);

    wp_localize_script('load-more-script', 'load_more_params', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('load_more_posts_nonce'),
    ));
}

// --- AJAX Handler ---
add_action('wp_ajax_load_more_posts', 'my_load_more_posts_handler');
add_action('wp_ajax_nopriv_load_more_posts', 'my_load_more_posts_handler');

function my_load_more_posts_handler() {
    check_ajax_referer('load_more_posts_nonce', 'security');

    $paged = intval($_POST['page']);

    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => 3, // Number of posts to load per click
        'paged' => $paged,
    );

    // Use the WP_Query class
    $query = new WP_Query($args);

    if ($query->have_posts()) {
        ob_start(); // Start output buffering
        while ($query->have_posts()) {
            $query->the_post();
            // Get post content via a template part (e.g., content-post.php)
            get_template_part('template-parts/content', get_post_format());
        }
        $html = ob_get_clean(); // Get buffered content
        wp_send_json_success(array('html' => $html));
    } else {
        wp_send_json_error(array('message' => 'No more posts found.'));
    }
}

2. HTML (в вашем index.php или archive.php шаблоне):

<div id="posts-container">
    <!-- Initial posts are loaded here by the standard WordPress loop -->
</div>

<button id="load-more-btn" data-page="2">Load More</button>

3. JavaScript (/js/load-more.js):

jQuery(function($) {
    $('#load-more-btn').on('click', function() {
        const button = $(this);
        let currentPage = button.data('page');

        button.text('Loading...'); // Provide user feedback

        $.ajax({
            url: load_more_params.ajax_url,
            type: 'POST',
            data: {
                action: 'load_more_posts',
                security: load_more_params.nonce,
                page: currentPage
            },
            success: function(response) {
                if(response.success) {
                    $('#posts-container').append(response.data.html);
                    button.data('page', currentPage + 1); // Increment page number
                    button.text('Load More');
                } else {
                    button.text('No More Posts'); // No more posts to load
                    button.prop('disabled', true);
                }
            },
            error: function() {
                button.text('Error. Try Again?');
            }
        });
    });
});

Лучшие практики и заключение

  • Использование fetch: для современных проектов, не основанных на WordPress, предпочитайте fetchAPI, а не XMLHttpRequest.
  • Предоставляйте обратную связь: всегда предоставляйте пользователю визуальную обратную связь (индикаторы загрузки, отключенные кнопки), чтобы он знал, что что-то происходит.
  • Корректная обработка ошибок: сетевые запросы могут завершаться сбоем. Ваш код должен предвидеть это и информировать пользователя, позволяя ему повторить попытку.
  • Безопасность превыше всего: всегда проверяйте и дезинфицируйте данные на сервере. При использовании WordPress всегда используйте одноразовые значения.
  • Не злоупотребляйте: AJAX — мощный инструмент, но он нужен не для каждого действия. Полная перезагрузка страницы подходит для серьёзных изменений навигации.
  • Учитывайте доступность: при динамическом обновлении контента программы чтения с экрана могут не заметить изменений. Используйте динамические области ARIA ( aria-live="polite") для анонсирования обновлений.

AJAX — это фундаментальная технология современной веб-разработки, которая стирает грань между статическими веб-страницами и динамическими интерактивными приложениями. Понимая её основные принципы и особенности реализации в вашей среде (например, WordPress), вы сможете создавать более быстрые и увлекательные интерфейсы для своих пользователей.


Читайте также:

Приглашаем поучаствовать в обсуждении статьи:

Комментариев 0