HTML в XMLHttpRequest
Базовая Широко доступная *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
* Некоторые части этой функции могут иметь разный уровень поддержки.
Спецификация W3C XMLHttpRequest добавляет поддержку разбора HTML в XMLHttpRequest, которая изначально поддерживала только разбор XML. Эта функция позволяет веб-приложениям получать ресурс HTML как обработанный DOM с помощью XMLHttpRequest.
Чтобы получить общее представление о том, как использовать XMLHttpRequest в целом, см. Использование XMLHttpRequest.
Ограничения
Чтобы отговорить от синхронного использования XMLHttpRequest, поддержка HTML недоступна в синхронном режиме. Кроме того, поддержка HTML доступна только в том случае, если свойство responseType установлено в значение "document". Это ограничение предотвращает трату времени на бесполезный разбор HTML, когда устаревший код использует XMLHttpRequest в стандартном режиме для получения responseText для ресурсов text/html. Кроме того, это ограничение предотвращает проблемы с устаревшим кодом, который предполагает, что responseXML является null для страниц с ошибками HTTP (которые часто содержат text/html ответное тело).
Использование
Получение ресурса HTML в виде DOM с помощью XMLHttpRequest работает так же, как получение ресурса XML в виде DOM с помощью XMLHttpRequest, за исключением того, что вы не можете использовать синхронный режим и должны явно запросить документ, назначив строку "document" свойству responseType объекта XMLHttpRequest после вызова open(), но перед вызовом send().
const xhr = new XMLHttpRequest();
xhr.onload = () => {
console.log(xhr.responseXML.title);
};
xhr.open("GET", "file.html");
xhr.responseType = "document";
xhr.send();
Обнаружение функции
Способ 1
Этот метод опирается на «принудительный асинхронный» характер функции. Когда вы пытаетесь установить responseType объекта XMLHttpRequest после его открытия как «синхронный». В браузерах, реализующих эту функцию, это вызовет ошибку, а в других — будет работать.
function HTMLinXHR() {
if (!window.XMLHttpRequest) {
return false;
}
const req = new window.XMLHttpRequest();
req.open("GET", window.location.href, false);
try {
req.responseType = "document";
} catch (e) {
return true;
}
return false;
}
Этот метод является синхронным, не зависит от внешних ресурсов, хотя он может быть менее надёжным, чем метод 2, описанный ниже, так как он не проверяет саму функцию, а лишь её признак.
Способ 2
Существует две проблемы с точным обнаружением поддержки разбора HTML в XMLHttpRequest. Во-первых, результат обнаружения получается асинхронно, так как поддержка HTML доступна только в асинхронном режиме. Во-вторых, необходимо фактически получить тестовый документ по HTTP, потому что тестирование с data: URL привело бы к одновременной проверке поддержки data: URL.
Таким образом, для обнаружения поддержки HTML необходим тестовый HTML-файл на сервере. Этот тестовый файл небольшой и не является корректным XML:
<title>&&<</title>
Если файл называется detect.html, для обнаружения поддержки разбора HTML можно использовать следующую функцию:
function detectHtmlInXhr(callback) {
if (!window.XMLHttpRequest) {
setTimeout(function () {
callback(false);
}, 0);
return;
}
let done = false;
const xhr = new window.XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && !done) {
done = true;
callback(
!!(
xhr.responseXML &&
xhr.responseXML.title &&
xhr.responseXML.title === "&&<"
),
);
}
};
xhr.onabort = xhr.onerror = () => {
if (!done) {
done = true;
callback(false);
}
};
try {
xhr.open("GET", "detect.html");
xhr.responseType = "document";
xhr.send();
} catch (e) {
setTimeout(function () {
if (!done) {
done = true;
callback(false);
}
}, 0);
}
}
Аргумент callback — функция, которая будет вызвана асинхронно с true в качестве единственного аргумента, если поддержка разбора HTML есть, и false — если нет.
Кодировка символов
Если кодировка символов указана в заголовке HTTP Content-Type, используется эта кодировка. В противном случае, если есть метка порядка байтов, используется кодировка, указанная этой меткой. В противном случае, если есть элемент <meta>, который объявляет кодировку в первых 1024 байтах файла, используется эта кодировка. В противном случае файл декодируется как UTF-8.
Спецификации
| Спецификация |
|---|
| XMLHttpRequest # interface-xmlhttprequest |
Совместимость с браузерами
| Настольные | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
XMLHttpRequest |
1 | 12 | 1 | ≤12.1 | 3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
HTML_in_XMLHttpRequest |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | ≤37 |
abort |
1 | 12 | 1 | ≤12.1 | 1.2 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
abort_event |
1 | 12 | 3.5 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | ≤37 |
authorization_removed_cross_origin |
Нет | Нет | 111 | Нет | 16.1 | Нет | 111 | Нет | 16.1 | Нет | Нет |
error_event |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | ≤37 |
getAllResponseHeaders |
1 | 12 | 1Начиная с Firefox 49, пустые заголовки возвращаются как пустые строки, если параметрnetwork.http.keep_empty_response_headers_as_empty_string установлен в true, по умолчанию false. До Firefox 49 пустые заголовки игнорировались. Начиная с Firefox 50, параметр по умолчанию установлен в true. |
≤12.1 | 1.2 | 18 | 4Начиная с Firefox for Android 49, пустые заголовки возвращаются как пустые строки, если параметрnetwork.http.keep_empty_response_headers_as_empty_string установлен в true, по умолчанию false. До Firefox for Android 49 пустые заголовки игнорировались. Начиная с Firefox for Android 50, параметр по умолчанию установлен в true. |
≤12.1 | 1 | 1.0 | 4.4 |
getResponseHeader |
1 | 12 | 1Начиная с Firefox 49, пустые заголовки возвращаются как пустые строки, если параметрnetwork.http.keep_empty_response_headers_as_empty_string установлен в true, по умолчанию false. До Firefox 49 пустые заголовки игнорировались. Начиная с Firefox 50, параметр по умолчанию установлен в true. |
8 | 1.2 | 18 | 4Начиная с Firefox for Android 49, пустые заголовки возвращаются как пустые строки, если параметрnetwork.http.keep_empty_response_headers_as_empty_string установлен в true, по умолчанию false. До Firefox for Android 49 пустые заголовки игнорировались. Начиная с Firefox for Android 50, параметр по умолчанию установлен в true. |
10.1 | 1 | 1.0 | 4.4 |
load_event |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | ≤37 |
loadend_event |
18 | 12 | 5 | ≤12.1 | 4 | 18 | 5 | ≤12.1 | 3 | 1.0 | 4.4 |
loadstart_event |
1 | 12 | 3.5 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
open |
1 | 12 | 1Начиная с Firefox 30, синхронные запросы в основном потоке устарели из-за их негативного влияния на производительность и пользовательский опыт. Поэтому параметрasync может не быть false за исключением Worker. |
8 | 1.2 | 18 | 4Начиная с Firefox for Android 30, синхронные запросы в основном потоке устарели из-за их негативного влияния на производительность и пользовательский опыт. Поэтому параметрasync может не быть false за исключением Worker. |
10.1 | 1 | 1.0 | 4.4 |
overrideMimeType |
1 | 12 | 1 | ≤12.1 | 1.2 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
progress_event |
1 | 12 | 1 | ≤12.1 | 3 | 18 | 4 | ≤12.1 | 1 | 1.0 | ≤37 |
readyState |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 |
readystatechange_event |
1 | 12 | 1 | 9 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 |
response |
9 | 12 | 6 | 11.6 | 5.1 | 18 | 6 | 12 | 5 | 1.0 | 3 |
responseText |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 |
responseType |
31 | 12 | 6 | 1812–15 | 5.1 | 31 | 50 | 1812–14 | 5 | 2.0 | 4.4.3 |
responseURL |
37 | 14 | 32 | 24 | 8 | 37 | 32 | 24 | 8 | 3.0 | 37 |
responseXML |
1 | 12 | 1Before Firefox 51, an error parsing the received data added a<parsererror> node to the top of the Document and then returned the Document in whatever state it happens to be in. This was inconsistent with the specification. Starting with Firefox 51, this scenario now correctly returns null as per the spec. |
≤12.1 | 3 | 18 | 4Before Firefox for Android 51, an error parsing the received data added a<parsererror> node to the top of the Document and then returned the Document in whatever state it happens to be in. This was inconsistent with the specification. Starting with Firefox for Android 51, this scenario now correctly returns null as per the spec. |
≤12.1 | 1 | 1.0 | ≤37 |
|---|---|---|---|---|---|---|---|---|---|---|---|
send |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 |
setAttributionReporting |
125 | 125 | Нет | 111 | Нет | 125 | Нет | 83 | Нет | 27.0 | 125 |
setPrivateToken |
117 | 117 | Нет | 103 | Нет | 117 | Нет | 78 | Нет | 24.0 | 117 |
setRequestHeader |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 |
status |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 |
statusText |
1 | 12 | 1 | ≤12.1 | 1.2 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
timeout |
29 | 12 | 12 | 1712–16 | 7 | 29 | 14 | 1812–16 | 7 | 2.0 | 4.4 |
timeout_event |
29 | 12 | 12 | 16 | 7 | 29 | 14 | 16 | 7 | 1.0 | 4.4 |
upload |
2 | 12 | 3.5 | ≤12.1 | 4 | 18 | 4 | ≤12.1 | 3 | 1.0 | 4.4 |
withCredentials |
3 | 12 | 3.5Начиная с Firefox 11, больше не поддерживается использование атрибутаwithCredentials при выполнении синхронных запросов. Попытка сделать это выбросит исключение NS_ERROR_DOM_INVALID_ACCESS_ERR. |
12 | 4 | 18 | 4Начиная с Firefox for Android 14, больше не поддерживается использование атрибутаwithCredentials при выполнении синхронных запросов. Попытка сделать это выбросит исключение NS_ERROR_DOM_INVALID_ACCESS_ERR. |
12 | 3.2 | 1.0 | ≤37 |
worker_support |
4 | 12 | 3.5 | 10.6 | 4 | 18 | 4 | 11 | 5 | 1.0 | 4 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/HTML_in_XMLHttpRequest