JavaScript виконання коду JavaScript підключення зовнішнього файлу JavaScript console.log JavaScript змінні і константи JavaScript типи даних JavaScript операції зі змінними JavaScript перетворення даних JavaScript масиви JavaScript умовні конструкції JavaScript цикли JavaScript функції JavaScript область видимості змінних JavaScript замикання і функції IIFE JavaScript Паттерн Модуль JavaScript рекурсивні функції JavaScript перевизначення функцій JavaScript hoisting JavaScript передача параметрів за значенням і за посиланням JavaScript стрілочні функції JavaScript ООП Object JavaScript ООП вкладені об'єкти і масиви в об'єктах JavaScript ООП перевірка наявності і перебір методів і властивостей JavaScript ООП об'єкти у функціях JavaScript ООП конструктори об'єктів JavaScript ООП розширення об'єктів. prototype JavaScript ООП інкапсуляція JavaScript ООП Функція як об'єкт. Методи call і apply JavaScript ООП спадкування JavaScript ООП Ключове слово this JavaScript ООП Object destructuring JavaScript ООП класи JavaScript ООП Date. Робота з датами JavaScript Об'єкт Math. математичні операції JavaScript Об'єкт Array. Робота з масивами JavaScript ООП об'єкт Number JavaScript String JavaScript String Об'єкт RegExp. Регулярні вирази JavaScript String Регулярні вирази в методах String JavaScript String Синтаксис регулярних виразів JavaScript Робота з браузером і BOM JavaScript діалогові вікна JavaScript Історія браузера. об'єкт history JavaScript об'єкт location JavaScript об'єкт navigator JavaScript таймери JavaScript DOM Введення JavaScript DOM Об'єкт document. Пошук елементів JavaScript DOM Властивості об'єкта document JavaScript DOM Об'єкт Node. Навігація по DOM JavaScript DOM Створення, додавання і видалення елементів веб-сторінки JavaScript DOM Об'єкт Element. управління елементами JavaScript DOM Зміна стилю елементів JavaScript події. Введення в обробку подій. JavaScript події обробники JavaScript події. об'єкт Event JavaScript події. поширення подій JavaScript події миші JavaScript події клавіатури JavaScript FORMS. Форми і їх елементи JavaScript FORMS. Кнопки JavaScript FORMS. текстові поля JavaScript FORMS. Прапорці та перемикачі JavaScript FORMS. Список select JavaScript JSON JavaScript зберігання даних. cookie JavaScript зберігання даних. Web Storage JavaScript Collection. Ітератори JavaScript Collection. Генератори JavaScript Collection. Множина Set JavaScript Collection. Map JavaScript Collection. WeakSet і WeakMap JavaScript AJAX. XMLHttpRequest JavaScript AJAX. Відправка даних JavaScript AJAX. Promise в Ajax-запитах

JavaScript AJAX. XMLHttpRequest


Ajax

Сучасні веб-додатки, як правило, поділяються на дві частини: клієнт і сервер. Клієнт є веб-сторінку з кодом JavaScript. До серверних технологій відносяться PHP, Ruby, Node.js, ASP.NET і т.д., які отримують запит від клієнта, обробляють і відправляють у відповідь результат обробки.

Ajax представляє технологію для відправлення запитів до сервера з клієнтського коду JavaScript без перезавантаження сторінки. Сам термін розшифровується як Asynchronous JavaScript And XML . Тобто спочатку AJAX припускав асинхронну взаємодію клієнта і сервера за допомогою даних в форматі XML. Хоча зараз XML багато в чому витіснив формат JSON. У будь-якому випадку AJAX революціонізував веб-середовище, дозволивши створювати динамічні веб-додатки.

Оскільки Ajax передбачає взаємодію клієнта і сервера, то для роботи з Ajax і зокрема цієї глави необхідний локальний веб-сервер. Це може бути будь-який веб-сервер: Apache, IIS і т.д.


об'єкт XMLHttpRequest

Для створення додатків, що використовують Ajax, застосовуються різні способи. Але найпоширенішим способом є використання об'єкта XMLHttpRequest :

var request = new XMLHttpRequest();

Після створення об'єкта XMLHttpRequest можна відправляти запити до сервера. Але для початку треба викликати метод open () для ініціалізації:

request.open("GET", "http://localhost/hello.txt", false);

Метод open() приймає три параметри: тип запиту ( GET, POST, HEAD, PUT ), адреса запиту і третій необов'язковий параметр - логічне значення true або false , яке вказує, чи буде запит здійснюватися в асинхронному режимі. Тобто в даному випадку запит буде мати тип GET , він буде направлятися за адресою http: //localhost/hello.txt  в синхронному режимі, так як стоїть значення false (для асинхронного режиму вказується значення true ).

Синхронний і асинхронний режим відрізняються тим, що запит в синхронному режимі поки запит не виконається, решта коду javascript не може виконуватися. За замовчуванням, якщо третій параметр не використовується, то запит відправляється в асинхронному режимі, що дозволяє паралельно з виконанням запиту виконувати також і інший код javascript. І в більшості випадків, як правило, використовується саме асинхронний режим.

Крім того, метод open() може приймати ще два параметри: логін і пароль користувача, якщо для виконання запиту потрібна аутентифікація.

request.open("GET", "http://localhost/home.php", true, "login", "password");

Після ініціалізації запиту методом open() необхідно відправити запит за допомогою методу send () :

request.send();

властивості XMLHttpRequest

Об'єкт XMLHttpRequest має ряд властивостей, які дозволяють проконтролювати виконання запиту:

  • status: містить статусний код відповіді HTTP, який прийшов від сервера. За допомогою статусного коду можна судити про успішність запиту або про помилки, які могли б виникнути при його виконанні. Наприклад, статусний код 200 вказує на те, що запит пройшов успішно. Код 403 говорить про необхідність авторизації для виконання запиту, а код 404 повідомляє, що ресурс не знайдений і так далі.
  • statusText: повертає текст статусу відповіді, наприклад, "200 OK"
  • responseType: повертає тип відповіді. Є такі типи:
  • "", "arraybuffer", "blob" , "document", "json" , "text"

  • response: повертає відповідь сервера
  • responseText : повертає текст відповіді сервера
  • responseXML: повертає xml, якщо відповідь від сервера у форматі xml

Наприклад, виконаємо запит до текстового файлу, який знаходиться на локальному веб-сервері. Для виконання ajax-запитів буде потрібен запущений локальний веб-сервер, на якому буде лежати файл hello.txt , в якому буде міститися один рядок: "Привіт світ".

Код веб-сторінки (нехай вона називається test.html ) буде наступним:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
 
<script>

var request = new XMLHttpRequest();
request.open("GET", "http://localhost:8080/hello.txt", false);
request.send();

var status = request.status;

if(status==200)
    document.write("Текст відповіді: " + request.responseText)
else if(status==404)
    document.write("Ресурс не найдено")
else
    document.write(request.statusText)

</script>
</body>
</html>

І після завантаження сторінки виконається ajax-запит до ресурсу http://localhost:8080/hello.txt . Але важливо відзначити, що отримання статусу відразу після виклику методу request.send() буде працювати тільки для синхронного запиту.


асинхронні запити

Хоча синхронні запити цілком працюють і їх можна використовувати, але в той же час їх рекомендується уникати. Оскільки нерідко запит може зайняти тривалий час, то це може заблокувати виконання решти коду і роботу з html-сторінкою до закінчення виконання запиту. Тому рекомендується використовувати переважно асинхронні запити.

Робота з асинхронними запитами трохи складніша, ніж з синхронними, оскільки нам треба ще обробити подію readystatechange об'єкта XMLHttpRequest .

При асинхронному запиті об'єкт XMLHttpRequest використовує властивість readyState для зберігання стану запиту. Станом запиту є число:

  • 0 : Об'єкт XMLHttpRequest створено, але метод open() ще не був викликаний для ініціалізації об'єкта

  • 1 : Метод open() був викликаний, але запит ще не був відправлений методом send()

  • 2 : Запит був відправлений, заголовки і статус відповіді отримані і готові до використання

  • 3 : Відповідь отримана від сервера

  • 4 : Виконання запиту повністю завершено (навіть якщо отримано код помилки, наприклад, 404)

Подія readystatechange виникає кожен раз, коли змінюється значення властивості readyState. Наприклад, виконаємо асинхронний запит:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
 
<script>
var request = new XMLHttpRequest();
 
function reqReadyStateChange() {
    if (request.readyState == 4) {
        var status = request.status;
        if (status == 200) {
            document.write(request.responseText);
        } else {
            document.write("Відповідь сервера " + request.statusText);
        }
    }
}
 
request.open("GET", "http://localhost:8080/hello.txt");
request.onreadystatechange = reqReadyStateChange;
request.send();

</script>
</body>
</html>

Крім обробки події readystatechange для отримання відповіді сервера можна також обробляти подію load, яка виникає після виконання запиту. Аналогічне використання :

var request = new XMLHttpRequest();
 
function responceLoad() {

    if (request.readyState == 4) {
        var status = request.status;
        if (status == 200) {
            document.write(request.responseText);
        } else {
            document.write("Відповідь сервера " + request.statusText);
        }
    }
}
 
request.open("GET", "http://localhost:8080/hello.txt");
request.onload = responceLoad;
request.send();

Наш партнер:
beta test mp3 playlist downloader