Spec-Zone.ru › Web APIs

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;
}

Просмотреть на JSFiddle

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

Способ 2

Существует две проблемы с точным обнаружением поддержки разбора HTML в XMLHttpRequest. Во-первых, результат обнаружения получается асинхронно, так как поддержка HTML доступна только в асинхронном режиме. Во-вторых, необходимо фактически получить тестовый документ по HTTP, потому что тестирование с data: URL привело бы к одновременной проверке поддержки data: URL.

Таким образом, для обнаружения поддержки HTML необходим тестовый HTML-файл на сервере. Этот тестовый файл небольшой и не является корректным XML:

<title>&amp;&<</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 — если нет.

Просмотреть на JSFiddle

Кодировка символов

Если кодировка символов указана в заголовке 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

См. также

  • XMLHttpRequest
  • Использование XMLHttpRequest

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API