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. Відправка даних


Відправка даних

Принцип відправки даних може відрізнятися в різних ситуаціях. Розглянемо ці ситуації.


Відправка GET-запиту

GET-запит характеризується тим, що дані можуть відправлятися в рядку запиту:

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

// обєкт для віправки
var user = {
    name: "Tom",
    age: 23
};
 
var request = new XMLHttpRequest();

function reqReadyStateChange() {
    if (request.readyState == 4) {
        var status = request.status;
        if (status == 200) {
            document.getElementById("output").innerHTML=request.responseText;
        }
    }
}

// рядок з параметрами для відправки
var body = "name=" + user.name + "&age="+user.age;

request.open("GET", "http://localhost:8080/postdata.php?"+body);
request.onreadystatechange = reqReadyStateChange;
request.send();

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

Для відправки беремо властивості об'єкта user і формуємо з їх значень терміну з параметрами: "name=" + user.name + "&age="+user.age . Потім цей рядок додається до рядка запиту в методі open("GET", "http://localhost:8080/postdata.php?"+body)

Передбачається, що дані відправляються скрипту на мові php postdata.php , який може мати, наприклад, такий зміст:

<?php
$name = "Невідомо";
$age = "Невідомо";

if(isset($_GET['name'])) $name = $_GET['name'];
if (isset($_GET['age'])) $age = $_GET['age'];

echo "Ваше імя: $name  <br> Ваш вік: $age";
?>

Конкретна технологія боку сервера тут не важлива. І як тестування можна взяти будь-яку іншу технологію. Наприклад, ASP.NET MVC. Метод контролера в ASP.NET MVC, який приймає дані, міг би виглядати наступним чином:

public string PostData(string name, int age)
{
    return "Ваше імя: "+name +"; Ваш вік: "+ age;
}

кодування параметрів

Всі надіслані в GET -запиті параметри поділяються знаком амперсанда ( & ). Але якщо який-небудь параметр має знак амперсанда. наприклад,

var user = {
    name: "Tom&Tim",
    age: 23
};
// рядок з параметрами для відравки
var body = "name=" + user.name + "&age="+user.age;

В цьому випадку при отриманні параметрів скрипт на стороні сервера може неправильно обробити дані і неправильно витягти параметри. Тому, щоб кодувати всі передані дані, потрібно застосовувати функцію encodeURIComponent () :

var body = "name=" + encodeURIComponent(user.name) + "&age="+encodeURIComponent(user.age);

При цьому рядок "Tom & Tim" буде кодований в наступний рядок: "Tom% 26Tim" .

При необхідності ми можемо виконати зворотнє декодування за допомогою функції decodeURIComponent () :

var encodeName = encodeURIComponent(user.name); // Tom%26Tim
var decodeName = decodeURIComponent(encodeName); // Tom&Tim

POST-запити

Відправка даних в POST -запитах буде трохи відрізнятися:

var user = {
    name: "Tom",
    age: 23
};
 
var request = new XMLHttpRequest();

function reqReadyStateChange() {
    if (request.readyState == 4 && request.status == 200)
        document.getElementById("output").innerHTML=request.responseText;
}

var body = "name=" + user.name + "&age="+user.age;

request.open("POST", "http://localhost:8080/postdata.php");
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
request.onreadystatechange = reqReadyStateChange;
request.send(body);

Для відправки даних методом POST треба встановити заголовок Content-Type за допомогою методу setRequestHeader () . В даному випадку заголовок має значення application/x-www-form-urlencoded .


Відправлення форм. FormData

Починаючи з специфікації XMLHttpRequest2 в JavaScript з'явився новий об'єкт - FormData , який дозволяє серіалізувать дані форми для її подальшої відправки. При цьому нам навіть необов'язково створювати форму в коді html, ми можемо створити її динамічно в JavaScript:

var formData = new FormData();
formData.append('name', 'Tom');
formData.append('age', 23);
 
var request = new XMLHttpRequest();

function reqReadyStateChange() {
    if (request.readyState == 4 && request.status == 200)
        document.getElementById("output").innerHTML=request.responseText;
}
 
request.open("POST", "http://localhost:8080/display.php");
request.onreadystatechange = reqReadyStateChange;
request.send(formData);

Для додавання даних у об'єкт FormData використовується метод append ( 'імя_параметра', значення) . При цьому ніякі заголовки вказувати не треба.

Також ми можемо визначити форму в html і використовувати її для відправки:

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

<div id="output"></div>

<form name="user" action="http://localhost:8080/postdata.php">
   <input type="text" name="username" placeholder="Введіть імя" /><br/>
   <input type="text" name="age" placeholder="Введіть вік" /><br/>
   <input type="submit" name="submit" value="Відправити" />
</form>

<script>

// отримуємо обєкт форми
var form = document.forms.user;

// прикріплюємо обробник кнопки
form.submit.addEventListener("click", sendRequest);
 
// обробник нажимання
function sendRequest(event){
     
    event.preventDefault();
    var formData = new FormData(form);
 
    var request = new XMLHttpRequest();
 
    request.open("POST", form.action);
     
    request.onreadystatechange = function () {
        if (request.readyState == 4 && request.status == 200)
            document.getElementById("output").innerHTML=request.responseText;
    }
    request.send(formData);
}

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

Для серіалізації всіх полів форми нам досить передати об'єкт форми в конструктор FormData :

var formData = new FormData(form);


Відправка даних в форматі json

Для відправки даних в форматі json нам необхідно встановити відповідний заголовок і серіалізувати дані за допомогою методу JSON.stringify :

// обєкт для відправки
var user = {
    username: "Tom",
    age: 23
};

var json = JSON.stringify(user);
var request = new XMLHttpRequest();

request.open("POST", "http://localhost:8080/postjson.php");
request.setRequestHeader('Content-type', 'application/json; charset=utf-8');

request.onreadystatechange = function () {
        if (request.readyState == 4 && request.status == 200)
            document.getElementById("output").innerHTML=request.responseText;
}

request.send(json);

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