XMLHttpRequest — API-запит вебклієнта (браузера) до вебсервера за протоколом HTTP у фоновому режимі, для мов програмування JavaScript, JScript, VBScript і подібних. Використовується для синхронного або асинхронного обміну інформацією в довільному текстовому форматі (наприклад, XML, JSON, HTML). Дозволяє здійснювати HTTP-запити до віддаленого сервера без потреби перезавантажувати сторінку. Застосування XMLHttpRequest справляє враження «миттєвої» відповіді сервера, у порівнянні з класичними методом перезавантаження всієї сторінки для оновлення представленої на ній інформації.
XMLHttpRequest є невід'ємною частиною технології AJAX і використовується багатьма сайтами для створення динамічних вебзастосунків, що швидко реагують на запити користувача. Наприклад XMLHTTP використовується такими сайтами як Gmail, , MSN Virtual Earth та іншими. XMLHTTP працює лише з файлами, розташованими на тому ж домені, з якої завантажено сторінку. Як і у випадку JavaScript, це зроблено з метою забезпечення безпеки користувача (як захист від атаки, що має назву «міжсайтові сценарії», англ. cross-site scripting).
Історія
Вперше був реалізований компанією Microsoft, з'явившись в Internet Explorer 5.0 у вигляді об'єкта ActiveX, доступного через JavaScript, JScript, VBScript — скриптові мови, що підтримуються браузером. Програмісти проекту Mozilla потім розробили сумісну версію, під назвою XMLHttpRequest, в Mozilla 1.0. Надалі ця можливість також була реалізована компаніями Apple починаючи з Safari 1.2, спорідненим браузером Konqueror, компанією Opera Software починаючи з Opera 8.01, і ймовірно іншими.
Оскільки оригінальний XMLHttpRequest в IE5 та IE6 є об'єктом ActiveX, його неможливо розширити, додавши нові властивості і методи, що іноді є незручним обмеженням. Це обмеження було знято в реалізації Mozilla — XMLHttpRequest є повноцінним об'єктом JavaScript. Починаючи з IE7 Microsoft теж почав дотримуватися рекомендованого w3c визначення запиту.
Методи класу XMLHttpRequest
Метод | Опис |
---|---|
abort() | скасовує поточний запит |
getAllResponseHeaders() | повертає повний список HTTP-заголовків у вигляді рядка |
getResponseHeader (headerName) | повертає значення вказаного заголовка |
open (method, URL, async, userName, password) | визначає метод, URL і інші необов'язкові параметри запиту; параметр async визначає, чи відбувається робота в асинхронному режимі |
send (content) | відправляє запит на сервер |
setRequestHeader (label, value) | додає HTTP-заголовок до запиту |
overrideMimeType (mimeType) | дозволяє вказати MIME-тип документа, якщо сервер його не передав або передав неправильно. Увага: метод відсутній в Internet Explorer |
Властивості класу XMLHttpRequest
Властивість | Опис |
---|---|
onreadystatechange | обробник події, яка відбувається при кожній зміні стану об'єкта (необхідний для асинхронного режиму) |
readyState | повертає поточний стан об'єкта (0 — не ініціалізовано, 1 — відкрито, 2 — відправлення даних, 3 — отримання даних і 4 — дані завантажено) |
responseText | текст відповіді на запит |
responseXML | текст відповіді на запит в вигляді XML, котрий пізніше може бути розібраний методами DOM |
status | повертає HTTP-стан у вигляді числа (404 — «Not Found, Не найдено», 200 — «OK» тощо) |
statusText | повертає стан у вигляді рядка («Not Found», «OK» тощо) |
Приклад використання
План роботи з об'єктом XMLHttpRequest можна представити так:
- Створення об'єкта XMLHttpRequest
- Встановлення для нього обробника події onreadystatechange
- Відкриття з'єднання з вказівкою типу запиту, URL і інших параметрів.
- Безпосередньо відправлення запиту.
Створення екземпляра класу XMLHttpRequest
Перший пункт: створення екземпляра класу XMLHttpRequest. Конструкція створення об'єкта відрізняється в залежності від версії браузера: у IE 5 та IE 6 вона реалізована через ActiveXObject, а в решті браузерах (IE 7, Mozilla, Opera, Netscape і Safari) — як вбудований об'єкт типу XMLHttpRequest.
Отже, виклик для ранніх версій Internet Explorer:
var req = new ActiveXObject("Microsoft.XMLHTTP");
У ранніх версіях Internet Explorer (до IE7) рекомендується використовувати:
var req = new ActiveXObject("Msxml2.XMLHTTP");
і для решти:
var req = new XMLHttpRequest();
Тобто, для забезпечення кросс-браузерності нашого коду, потрібно лише перевіряти наявність об'єктів window.XMLHttpRequest і window.ActiveXObject, і застосовувати присутній. Як універсальне рішення пропонується використання наступної функції:
function createRequestObject() { if (window.XMLHttpRequest) { try { return new XMLHttpRequest(); } catch (e){} } else if (window.ActiveXObject) { try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e){} try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e){} } return null; }
Установлення обробника події
Наступним кроком є створення обробника подій і відкриття з'єднання. Ці виклики виглядають просто і однаково:
req.onreadystatechange = processReqChange; req.open(<"GET"|"POST"|...>, <url>, <asyncFlag>);
Відкриття з'єднання і відправлення
Після визначення всіх параметрів запиту його залишається тільки відправити. Робиться це функцією send(). Якщо необхідно передати на сервер POST-дані, їх треба підставити як параметр для цієї функції. POST-дані повинні бути згорнуті в URL-закодований рядок (кодування UTF-8). Іншими словами цей рядок матиме вигляд, який ми звикли бачити в командному рядку браузера, при передачі даних командою GET. При відправленні запиту методом GET — для версії без ACTIVEX необхідно вказати параметр null, в решті випадків можна не указувати ніяких параметрів, але не буде помилкою, якщо для GET завжди буде вказаний параметр null:
req.send(null);
Після цього починає працювати згаданий вище обробник подій. Він — фактично основна частина нашої програми. У обробнику зазвичай відбувається перехоплення всіх можливих кодів стану запиту і виклик відповідних дій, а також перехоплення можливих помилок. Власне, ось приклад частини коду з цими двома функціями:
var req; function loadXMLDoc(url) { req = null; if (window.XMLHttpRequest) { try { req = new XMLHttpRequest(); } catch (e){} } else if (window.ActiveXObject) { try { req = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e){ try { req = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e){} } } if (req) { req.onreadystatechange = processReqChange; req.open("GET", url, true); req.send(null); } } function processReqChange() { // Тільки в стані "complete" if (req.readyState == 4) { // для стану "OK" if (req.status == 200) { // Якщо 200 - робимо потрібні дії (404 - не знайдено) } else { alert("Не вдалось одержати дані:\n" + req.statusText); } } }
Підсумковий код
Отже, початковий код JavaScript-частини:
var req; var reqTimeout; function loadXMLDoc(url) { req = null; if (window.XMLHttpRequest) { try { req = new XMLHttpRequest(); } catch (e){} } else if (window.ActiveXObject) { try { req = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e){ try { req = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e){} } } if (req) { req.onreadystatechange = processReqChange; req.open("GET", url, true); req.send(null); reqTimeout = setTimeout("req.abort();", 5000); } else { alert("Браузер не підтримує AJAX"); } } function processReqChange() { document.form1.state.value = stat(req.readyState); if (req.readyState == 4) { clearTimeout(reqTimeout); document.form1.statusnum.value = req.status; document.form1.status.value = req.statusText; // only if "OK" if (req.status == 200) { document.form1.response.value=req.responseText; } else { alert("Не вдалося отримати дані:\n" + req.statusText); } } } function stat(n) { switch (n) { case 0: return "не ініціалізовано"; break; case 1: return "Завантаження..."; break; case 2: return "Завантажено"; break; case 3: return "В процесі..."; break; case 4: return "Виконано"; break; default: return "Невідомий стан"; } } function requestdata(params) { loadXMLDoc('examples/httpreq.php'+params); }
Тепер — HTML-форма:
<form name=form1> <table width=100% style="font-size: 100%"> <tr><td width=30% valign=top> Стан запиту <td width=70%> <input size=25 disabled type=text name=state value=""> <tr><td valign=top>Код стану <td><input disabled size=2 type=text name=statusnum value=""> <input disabled size=19 type=text name=status value=""> <tr><td valign=top>Дані від сервера <td><textarea rows=6 name=response></textarea> <tr><td>Рядок GET-запиту<td> <input type=text name=getparams value="?"> <input type=button onclick="requestdata(getparams.value);" value="GET"> </table> </form>
І наостанок, PHP файл:
<?php header("Content-type: text/plain; charset=windows-1251"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Expires: -1"); echo "Hello world!\n\n"; if (isset($a)) { for ($i=1; $i < 10000; $i++) { echo 'Це тестовий рядок. '; if (($i % 1000) == 0) flush(); } } if (count($_GET) > 0) { echo "\n\nПередано GET'ом\n"; print_r($_GET); } ?>
Кодування
Всі параметри GET/POST, що йдуть на сервер, окрім випадку multipart/form-data, кодуються по різному в різних браузерах. Зокрема, Firefox користується стандартним кодом URL, Opera вдається до кодування в UTF-8, IE7 передає кирилицю не кодуючи, як є. Тому треба бути уважним, інформація про спосіб кодування присутня в заголовках запиту. Наприклад, в PHP їх потрібно за потреби перекодувати функцією iconv. Єдино, можна бути певним, що латиниця не перекодовується в будь-якому випадку, і якщо є можливість залишитися в рамках латиниці, це позбавить програміста від додаткових клопотів.
Відповідь сервера браузер сприймає в тому кодуванні, яке вказане в заголовку відповіді Content-Type. Тобто, знову ж таки, в PHP, щоб браузер сприйняв відповідь в Windows-1251, потрібно послати заголовок типу:
header(Content-Type: text/plain; charset=windows-1251);
Або ж, це має зробити сервер.
Відомі проблеми
Проблема з кешуванням в Microsoft Internet Explorer
Internet Explorer кешує GET-запити. Ті автори, які незнайомі з кешуванням HTTP, сподіваються, що GET-запити не кешуються, або що кеш може бути обійдений, як у разі натиснення кнопки оновлення. У деяких ситуаціях уникнення кешування дійсно є помилкою. Одним з рішень є використання методу POST, який ніколи не кешується; проте він призначений для інших операцій. Іншим рішенням є використання методу запиту GET, що включає унікальний рядок запиту з кожним викликом, як показано на прикладі нижче.
req.open("GET", "xmlprovider.php?hash=" + Math.random());
або установки заголовка Expires на минулу дату у вашому скрипті, який генерує вміст XML. У PHP це буде так:
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // disable IE caching header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache");
У сервлетах Java це буде так:
response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setDateHeader("Expires", 0);
Інакше можна примусити об'єкт XMLHttpRequest завжди витягати новий вміст, не використовуючи кеш.
req.open("GET", "xmlprovider.php"); req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); req.send(null);
Важливо відмітити, що всі ці методики повинні використовуватися у разі, коли кешування заважає. В основному ж краще отримати переваги в швидкості при кешуванні, можливо комбінуючи зі спеціально вказаними датами модифікації або іншими доречними заголовками на сервері так, щоб максимально використовувати кешування без отримання неправильних результатів.
Повторне використання об'єкта XmlHttpRequest
В Internet Explorer, якщо open() викликаний після установки onreadystatechange, може бути проблема з повторним використанням цього XmlHttpRequest. Щоб використовувати наново XmlHttpRequest, спочатку викликайте метод open(), а потім — призначайте onreadystatechange. Це потрібно тому, що IE неявно очищає об'єкт XmlHttpRequest в методі open(), якщо його стан «completed».
Викликати abort() для перенаправлення запиту на іншій URL не потрібно, навіть якщо поточний запит ще не завершився.
Витоки пам'яті
В Internet Explorer об'єкт XmlHttpRequest належить середовищу DOM/COM, а Javascript-функція — середовищу Javascript. Виклик req.onreadystatechange = function() { … } неявний круговий зв'язок: req посилається на функцію через onreadystatechange, а функція, через область видимості — бачить (посилається на) req.
Неможливість виявити і обірвати такий зв'язок в багатьох (до IE 6,7 редакцій червня 2007?) версіях Internet Explorer приводить до того, що XmlHttpRequest разом з відповіддю сервера, функція-обробник, і все замикання міцно осідають в пам'яті до перезавантаження браузера. Щоб цього уникнути, ряд фреймворків (YUI, dojo…) взагалі не ставлять onreadystatechange, а натомість через setTimeout перевіряють його readyState кожні 10 мілісекунд. Це розриває кругову зв'язку req <-> onreadystatechange, і витік пам'яті не загрожує навіть в найбільш глючних браузерах.
Обмеження безпеки
Кросс-доменний XMLHttpRequest
Для обмеження XmlHttpRequest використовується філософія «Same Origin Policy» — «Правило одного джерела». Воно дуже просте — кожен сайт працює в своїй пісочниці. Запит можна робити тільки на адреси з тим же протоколом, доменом, портом, що і поточна сторінка. Тобто, із сторінки на адресі http://site.com не можна зробити XmlHttpRequest на адресу , http://site.com:81[недоступне посилання з червня 2019] або .
Це створює проблему, якщо хочеться узяти вміст з іншого сайту. Як правило, в цьому випадку замість XmlHttpRequest використовуються інші засоби, наприклад, завантаження через динамічно створюваний тег <script>. Але, здебільшого, XmlHttpRequest є зручнішим.
Проксі
Найпростіший спосіб обійти це обмеження — проксування. Припустимо, ми хочемо зробити запит з http://site.com [ 17 червня 2019 у Wayback Machine.] на . Замість вказівки remote.com у методі open(), там ставиться URL виду http://site.com/proxy/remote.com/get.html[недоступне посилання з червня 2019], а сервер на site.com вже обробляє цей запит, як треба.
Якщо remote.com знаходиться на іншому сервері, то серверу site.com доведеться проксувати відвідувачеві як запит, так і відповідь. При цьому, зрозуміло, site.com не отримає куки remote.com, тому з цієї точки зору для користувача все безпечно.
Використання наддомену
Часто кросбраузерні запити — це спосіб обійти обмеження в 2 одночасних з'єднання до одного домену-порту. Спосіб використовувати два різних сервера в спілкуванні з відвідувачем. Крос-доменні запити між наддоменами , http://b.site.com[недоступне посилання з червня 2019] на http://site.com [ 17 червня 2019 у Wayback Machine.] допустимі, через властивість document.domain, яке треба встановити в site.com
// на сторінці а.site.com … document.domain="site.com"; … // все, тепер можу робити XmlHttpRequest на site.com req.open("POST", "http://site.com/giveme.php")
Будь-які запити допустимі між сайтами, що знаходяться в довіреній (trusted) зоні Internet Explorer. Отже, внутрішній корпоративний портал може бути у всіх в цій зоні, і робити запити до будь-яких сайтів.
Ще один хитрий підхід називається XHRIframeProxy, і дозволяє робити XmlHttpRequest до будь-яких доменів за допомогою хитрого iframe-хака.
В плагінах Google Chrome
Пишучи аддон до браузера Google Chrome можна дозволити робити запити на довільні сервери, записавши їхні адреси в manifest.json
{ "name": "My extension", ... "permissions": [ "http://www.google.com/" ], ... }
Примітки
- Mozilla намагалася зберегти максимальну сумісність із оригіналом, були вилучені лише пропрієтарні назви Microsoft та ActiveX
- . Архів оригіналу за 8 лютого 2010. Процитовано 27 липня 2010.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title ()
Див. також
Посилання
- Об'єкт XMLHttpRequest [Архівовано 5 лютого 2012 у WebCite] — робочий нарис W3C
- яваскрипт.укр/XMLHttpRequest [ 13 квітня 2021 у Wayback Machine.] — про XMLHttpRequest українською мовою.
- Apple Safari 1.2 [ 12 січня 2010 у Wayback Machine.]
- Microsoft IXMLHTTPRequest
- Mozilla XML Extras [ 30 листопада 2005 у Wayback Machine.]
- Mozilla XMLHttpRequest object HowTo [ 24 лютого 2006 у Wayback Machine.]
Це незавершена стаття про Інтернет. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
XMLHttpRequest API zapit vebkliyenta brauzera do vebservera za protokolom HTTP u fonovomu rezhimi dlya mov programuvannya JavaScript JScript VBScript i podibnih Vikoristovuyetsya dlya sinhronnogo abo asinhronnogo obminu informaciyeyu v dovilnomu tekstovomu formati napriklad XML JSON HTML Dozvolyaye zdijsnyuvati HTTP zapiti do viddalenogo servera bez potrebi perezavantazhuvati storinku Zastosuvannya XMLHttpRequest spravlyaye vrazhennya mittyevoyi vidpovidi servera u porivnyanni z klasichnimi metodom perezavantazhennya vsiyeyi storinki dlya onovlennya predstavlenoyi na nij informaciyi XMLHttpRequest ye nevid yemnoyu chastinoyu tehnologiyi AJAX i vikoristovuyetsya bagatma sajtami dlya stvorennya dinamichnih vebzastosunkiv sho shvidko reaguyut na zapiti koristuvacha Napriklad XMLHTTP vikoristovuyetsya takimi sajtami yak Gmail MSN Virtual Earth ta inshimi XMLHTTP pracyuye lishe z fajlami roztashovanimi na tomu zh domeni z yakoyi zavantazheno storinku Yak i u vipadku JavaScript ce zrobleno z metoyu zabezpechennya bezpeki koristuvacha yak zahist vid ataki sho maye nazvu mizhsajtovi scenariyi angl cross site scripting IstoriyaVpershe buv realizovanij kompaniyeyu Microsoft z yavivshis v Internet Explorer 5 0 u viglyadi ob yekta ActiveX dostupnogo cherez JavaScript JScript VBScript skriptovi movi sho pidtrimuyutsya brauzerom Programisti proektu Mozilla potim rozrobili sumisnu versiyu pid nazvoyu XMLHttpRequest v Mozilla 1 0 Nadali cya mozhlivist takozh bula realizovana kompaniyami Apple pochinayuchi z Safari 1 2 sporidnenim brauzerom Konqueror kompaniyeyu Opera Software pochinayuchi z Opera 8 01 i jmovirno inshimi Oskilki originalnij XMLHttpRequest v IE5 ta IE6 ye ob yektom ActiveX jogo nemozhlivo rozshiriti dodavshi novi vlastivosti i metodi sho inodi ye nezruchnim obmezhennyam Ce obmezhennya bulo znyato v realizaciyi Mozilla XMLHttpRequest ye povnocinnim ob yektom JavaScript Pochinayuchi z IE7 Microsoft tezh pochav dotrimuvatisya rekomendovanogo w3c viznachennya zapitu Metodi klasu XMLHttpRequestMetod Opis abort skasovuye potochnij zapit getAllResponseHeaders povertaye povnij spisok HTTP zagolovkiv u viglyadi ryadka getResponseHeader headerName povertaye znachennya vkazanogo zagolovka open method URL async userName password viznachaye metod URL i inshi neobov yazkovi parametri zapitu parametr async viznachaye chi vidbuvayetsya robota v asinhronnomu rezhimi send content vidpravlyaye zapit na server setRequestHeader label value dodaye HTTP zagolovok do zapitu overrideMimeType mimeType dozvolyaye vkazati MIME tip dokumenta yaksho server jogo ne peredav abo peredav nepravilno Uvaga metod vidsutnij v Internet ExplorerVlastivosti klasu XMLHttpRequestVlastivist Opis onreadystatechange obrobnik podiyi yaka vidbuvayetsya pri kozhnij zmini stanu ob yekta neobhidnij dlya asinhronnogo rezhimu readyState povertaye potochnij stan ob yekta 0 ne inicializovano 1 vidkrito 2 vidpravlennya danih 3 otrimannya danih i 4 dani zavantazheno responseText tekst vidpovidi na zapit responseXML tekst vidpovidi na zapit v viglyadi XML kotrij piznishe mozhe buti rozibranij metodami DOM status povertaye HTTP stan u viglyadi chisla 404 Not Found Ne najdeno 200 OK tosho statusText povertaye stan u viglyadi ryadka Not Found OK tosho Priklad vikoristannyaPlan roboti z ob yektom XMLHttpRequest mozhna predstaviti tak Stvorennya ob yekta XMLHttpRequest Vstanovlennya dlya nogo obrobnika podiyi onreadystatechange Vidkrittya z yednannya z vkazivkoyu tipu zapitu URL i inshih parametriv Bezposeredno vidpravlennya zapitu Stvorennya ekzemplyara klasu XMLHttpRequest Pershij punkt stvorennya ekzemplyara klasu XMLHttpRequest Konstrukciya stvorennya ob yekta vidriznyayetsya v zalezhnosti vid versiyi brauzera u IE 5 ta IE 6 vona realizovana cherez ActiveXObject a v reshti brauzerah IE 7 Mozilla Opera Netscape i Safari yak vbudovanij ob yekt tipu XMLHttpRequest Otzhe viklik dlya rannih versij Internet Explorer var req new ActiveXObject Microsoft XMLHTTP U rannih versiyah Internet Explorer do IE7 rekomenduyetsya vikoristovuvati var req new ActiveXObject Msxml2 XMLHTTP i dlya reshti var req new XMLHttpRequest Tobto dlya zabezpechennya kross brauzernosti nashogo kodu potribno lishe pereviryati nayavnist ob yektiv window XMLHttpRequest i window ActiveXObject i zastosovuvati prisutnij Yak universalne rishennya proponuyetsya vikoristannya nastupnoyi funkciyi function createRequestObject if window XMLHttpRequest try return new XMLHttpRequest catch e else if window ActiveXObject try return new ActiveXObject Msxml2 XMLHTTP catch e try return new ActiveXObject Microsoft XMLHTTP catch e return null Ustanovlennya obrobnika podiyi Nastupnim krokom ye stvorennya obrobnika podij i vidkrittya z yednannya Ci vikliki viglyadayut prosto i odnakovo req onreadystatechange processReqChange req open lt GET POST gt lt url gt lt asyncFlag gt Vidkrittya z yednannya i vidpravlennya Pislya viznachennya vsih parametriv zapitu jogo zalishayetsya tilki vidpraviti Robitsya ce funkciyeyu send Yaksho neobhidno peredati na server POST dani yih treba pidstaviti yak parametr dlya ciyeyi funkciyi POST dani povinni buti zgornuti v URL zakodovanij ryadok koduvannya UTF 8 Inshimi slovami cej ryadok matime viglyad yakij mi zvikli bachiti v komandnomu ryadku brauzera pri peredachi danih komandoyu GET Pri vidpravlenni zapitu metodom GET dlya versiyi bez ACTIVEX neobhidno vkazati parametr null v reshti vipadkiv mozhna ne ukazuvati niyakih parametriv ale ne bude pomilkoyu yaksho dlya GET zavzhdi bude vkazanij parametr null req send null Pislya cogo pochinaye pracyuvati zgadanij vishe obrobnik podij Vin faktichno osnovna chastina nashoyi programi U obrobniku zazvichaj vidbuvayetsya perehoplennya vsih mozhlivih kodiv stanu zapitu i viklik vidpovidnih dij a takozh perehoplennya mozhlivih pomilok Vlasne os priklad chastini kodu z cimi dvoma funkciyami var req function loadXMLDoc url req null if window XMLHttpRequest try req new XMLHttpRequest catch e else if window ActiveXObject try req new ActiveXObject Msxml2 XMLHTTP catch e try req new ActiveXObject Microsoft XMLHTTP catch e if req req onreadystatechange processReqChange req open GET url true req send null function processReqChange Tilki v stani complete if req readyState 4 dlya stanu OK if req status 200 Yaksho 200 robimo potribni diyi 404 ne znajdeno else alert Ne vdalos oderzhati dani n req statusText Pidsumkovij kod Otzhe pochatkovij kod JavaScript chastini var req var reqTimeout function loadXMLDoc url req null if window XMLHttpRequest try req new XMLHttpRequest catch e else if window ActiveXObject try req new ActiveXObject Msxml2 XMLHTTP catch e try req new ActiveXObject Microsoft XMLHTTP catch e if req req onreadystatechange processReqChange req open GET url true req send null reqTimeout setTimeout req abort 5000 else alert Brauzer ne pidtrimuye AJAX function processReqChange document form1 state value stat req readyState if req readyState 4 clearTimeout reqTimeout document form1 statusnum value req status document form1 status value req statusText only if OK if req status 200 document form1 response value req responseText else alert Ne vdalosya otrimati dani n req statusText function stat n switch n case 0 return ne inicializovano break case 1 return Zavantazhennya break case 2 return Zavantazheno break case 3 return V procesi break case 4 return Vikonano break default return Nevidomij stan function requestdata params loadXMLDoc examples httpreq php params Teper HTML forma lt form name form1 gt lt table width 100 style font size 100 gt lt tr gt lt td width 30 valign top gt Stan zapitu lt td width 70 gt lt input size 25 disabled type text name state value gt lt tr gt lt td valign top gt Kod stanu lt td gt lt input disabled size 2 type text name statusnum value gt lt input disabled size 19 type text name status value gt lt tr gt lt td valign top gt Dani vid servera lt td gt lt textarea rows 6 name response gt lt textarea gt lt tr gt lt td gt Ryadok GET zapitu lt td gt lt input type text name getparams value gt lt input type button onclick requestdata getparams value value GET gt lt table gt lt form gt I naostanok PHP fajl lt php header Content type text plain charset windows 1251 header Cache Control no store no cache must revalidate header Cache Control post check 0 pre check 0 false header Expires 1 echo Hello world n n if isset a for i 1 i lt 10000 i echo Ce testovij ryadok if i 1000 0 flush if count GET gt 0 echo n n Peredano GET om n print r GET gt KoduvannyaVsi parametri GET POST sho jdut na server okrim vipadku multipart form data koduyutsya po riznomu v riznih brauzerah Zokrema Firefox koristuyetsya standartnim kodom URL Opera vdayetsya do koduvannya v UTF 8 IE7 peredaye kirilicyu ne koduyuchi yak ye Tomu treba buti uvazhnim informaciya pro sposib koduvannya prisutnya v zagolovkah zapitu Napriklad v PHP yih potribno za potrebi perekoduvati funkciyeyu iconv Yedino mozhna buti pevnim sho latinicya ne perekodovuyetsya v bud yakomu vipadku i yaksho ye mozhlivist zalishitisya v ramkah latinici ce pozbavit programista vid dodatkovih klopotiv Vidpovid servera brauzer sprijmaye v tomu koduvanni yake vkazane v zagolovku vidpovidi Content Type Tobto znovu zh taki v PHP shob brauzer sprijnyav vidpovid v Windows 1251 potribno poslati zagolovok tipu header Content Type text plain charset windows 1251 Abo zh ce maye zrobiti server Vidomi problemiProblema z keshuvannyam v Microsoft Internet Explorer Internet Explorer keshuye GET zapiti Ti avtori yaki neznajomi z keshuvannyam HTTP spodivayutsya sho GET zapiti ne keshuyutsya abo sho kesh mozhe buti obijdenij yak u razi natisnennya knopki onovlennya U deyakih situaciyah uniknennya keshuvannya dijsno ye pomilkoyu Odnim z rishen ye vikoristannya metodu POST yakij nikoli ne keshuyetsya prote vin priznachenij dlya inshih operacij Inshim rishennyam ye vikoristannya metodu zapitu GET sho vklyuchaye unikalnij ryadok zapitu z kozhnim viklikom yak pokazano na prikladi nizhche req open GET xmlprovider php hash Math random abo ustanovki zagolovka Expires na minulu datu u vashomu skripti yakij generuye vmist XML U PHP ce bude tak header Expires Mon 26 Jul 1997 05 00 00 GMT disable IE caching header Last Modified gmdate D d M Y H i s GMT header Cache Control no cache must revalidate header Pragma no cache U servletah Java ce bude tak response setHeader Pragma no cache response setHeader Cache Control no cache no store must revalidate response setDateHeader Expires 0 Inakshe mozhna primusiti ob yekt XMLHttpRequest zavzhdi vityagati novij vmist ne vikoristovuyuchi kesh req open GET xmlprovider php req setRequestHeader If Modified Since Sat 1 Jan 2000 00 00 00 GMT req send null Vazhlivo vidmititi sho vsi ci metodiki povinni vikoristovuvatisya u razi koli keshuvannya zavazhaye V osnovnomu zh krashe otrimati perevagi v shvidkosti pri keshuvanni mozhlivo kombinuyuchi zi specialno vkazanimi datami modifikaciyi abo inshimi dorechnimi zagolovkami na serveri tak shob maksimalno vikoristovuvati keshuvannya bez otrimannya nepravilnih rezultativ Povtorne vikoristannya ob yekta XmlHttpRequest V Internet Explorer yaksho open viklikanij pislya ustanovki onreadystatechange mozhe buti problema z povtornim vikoristannyam cogo XmlHttpRequest Shob vikoristovuvati nanovo XmlHttpRequest spochatku viklikajte metod open a potim priznachajte onreadystatechange Ce potribno tomu sho IE neyavno ochishaye ob yekt XmlHttpRequest v metodi open yaksho jogo stan completed Viklikati abort dlya perenapravlennya zapitu na inshij URL ne potribno navit yaksho potochnij zapit she ne zavershivsya Vitoki pam yati V Internet Explorer ob yekt XmlHttpRequest nalezhit seredovishu DOM COM a Javascript funkciya seredovishu Javascript Viklik req onreadystatechange function neyavnij krugovij zv yazok req posilayetsya na funkciyu cherez onreadystatechange a funkciya cherez oblast vidimosti bachit posilayetsya na req Nemozhlivist viyaviti i obirvati takij zv yazok v bagatoh do IE 6 7 redakcij chervnya 2007 versiyah Internet Explorer privodit do togo sho XmlHttpRequest razom z vidpoviddyu servera funkciya obrobnik i vse zamikannya micno osidayut v pam yati do perezavantazhennya brauzera Shob cogo uniknuti ryad frejmvorkiv YUI dojo vzagali ne stavlyat onreadystatechange a natomist cherez setTimeout pereviryayut jogo readyState kozhni 10 milisekund Ce rozrivaye krugovu zv yazku req lt gt onreadystatechange i vitik pam yati ne zagrozhuye navit v najbilsh glyuchnih brauzerah Obmezhennya bezpekiKross domennij XMLHttpRequest Dlya obmezhennya XmlHttpRequest vikoristovuyetsya filosofiya Same Origin Policy Pravilo odnogo dzherela Vono duzhe proste kozhen sajt pracyuye v svoyij pisochnici Zapit mozhna robiti tilki na adresi z tim zhe protokolom domenom portom sho i potochna storinka Tobto iz storinki na adresi http site com ne mozhna zrobiti XmlHttpRequest na adresu http site com 81 nedostupne posilannya z chervnya 2019 abo Ce stvoryuye problemu yaksho hochetsya uzyati vmist z inshogo sajtu Yak pravilo v comu vipadku zamist XmlHttpRequest vikoristovuyutsya inshi zasobi napriklad zavantazhennya cherez dinamichno stvoryuvanij teg lt script gt Ale zdebilshogo XmlHttpRequest ye zruchnishim Proksi Najprostishij sposib obijti ce obmezhennya proksuvannya Pripustimo mi hochemo zrobiti zapit z http site com 17 chervnya 2019 u Wayback Machine na Zamist vkazivki remote com u metodi open tam stavitsya URL vidu http site com proxy remote com get html nedostupne posilannya z chervnya 2019 a server na site com vzhe obroblyaye cej zapit yak treba Yaksho remote com znahoditsya na inshomu serveri to serveru site com dovedetsya proksuvati vidviduvachevi yak zapit tak i vidpovid Pri comu zrozumilo site com ne otrimaye kuki remote com tomu z ciyeyi tochki zoru dlya koristuvacha vse bezpechno Vikoristannya naddomenu Chasto krosbrauzerni zapiti ce sposib obijti obmezhennya v 2 odnochasnih z yednannya do odnogo domenu portu Sposib vikoristovuvati dva riznih servera v spilkuvanni z vidviduvachem Kros domenni zapiti mizh naddomenami http b site com nedostupne posilannya z chervnya 2019 na http site com 17 chervnya 2019 u Wayback Machine dopustimi cherez vlastivist document domain yake treba vstanoviti v site com na storinci a site com document domain site com vse teper mozhu robiti XmlHttpRequest na site com req open POST http site com giveme php Bud yaki zapiti dopustimi mizh sajtami sho znahodyatsya v dovirenij trusted zoni Internet Explorer Otzhe vnutrishnij korporativnij portal mozhe buti u vsih v cij zoni i robiti zapiti do bud yakih sajtiv She odin hitrij pidhid nazivayetsya XHRIframeProxy i dozvolyaye robiti XmlHttpRequest do bud yakih domeniv za dopomogoyu hitrogo iframe haka V plaginah Google Chrome Pishuchi addon do brauzera Google Chrome mozhna dozvoliti robiti zapiti na dovilni serveri zapisavshi yihni adresi v manifest json name My extension permissions http www google com PrimitkiMozilla namagalasya zberegti maksimalnu sumisnist iz originalom buli vilucheni lishe propriyetarni nazvi Microsoft ta ActiveX Arhiv originalu za 8 lyutogo 2010 Procitovano 27 lipnya 2010 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya Div takozhAJAX DOM XML JSONPosilannyaOb yekt XMLHttpRequest Arhivovano 5 lyutogo 2012 u WebCite robochij naris W3C yavaskript ukr XMLHttpRequest 13 kvitnya 2021 u Wayback Machine pro XMLHttpRequest ukrayinskoyu movoyu Apple Safari 1 2 12 sichnya 2010 u Wayback Machine Microsoft IXMLHTTPRequest Mozilla XML Extras 30 listopada 2005 u Wayback Machine Mozilla XMLHttpRequest object HowTo 24 lyutogo 2006 u Wayback Machine Ce nezavershena stattya pro Internet Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi