This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
* Some parts of this feature may have varying levels of support.
The W3C XMLHttpRequest specification adds HTML parsing support to XMLHttpRequest, which originally supported only XML parsing. This feature allows Web apps to obtain an HTML resource as a parsed DOM using XMLHttpRequest.
To get an overview of how to use XMLHttpRequest in general, see Using XMLHttpRequest.
To discourage the synchronous use of XMLHttpRequest, HTML support is not available in the synchronous mode. Also, HTML support is only available if the responseType property has been set to "document". This limitation avoids wasting time parsing HTML uselessly when legacy code uses XMLHttpRequest in the default mode to retrieve responseText for text/html resources. Also, this limitation avoids problems with legacy code that assumes that responseXML is null for HTTP error pages (which often have a text/html response body).
Retrieving an HTML resource as a DOM using XMLHttpRequest works just like retrieving an XML resource as a DOM using XMLHttpRequest, except you can't use the synchronous mode and you have to explicitly request a document by assigning the string "document" to the responseType property of the XMLHttpRequest object after calling open() but before calling send().
const xhr = new XMLHttpRequest();
xhr.onload = () => {
console.log(xhr.responseXML.title);
};
xhr.open("GET", "file.html");
xhr.responseType = "document";
xhr.send();
If the character encoding is declared in the HTTP Content-Type header, that character encoding is used. Failing that, if there is a byte order mark, the encoding indicated by the byte order mark is used. Failing that, if there is a <meta> element that declares the encoding within the first 1024 bytes of the file, that encoding is used. Otherwise, the file is decoded as UTF-8.
| Specification |
|---|
| XMLHttpRequest> # interface-xmlhttprequest> |
| Desktop | Mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | WebView Android | WebView on iOS | |
XMLHttpRequest |
1 | 12 | 1 | ≤12.1 | 3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
HTML_in_XMLHttpRequest |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 3 | 1 |
abort |
1 | 12 | 1 | ≤12.1 | 1.2 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
abort_event |
1 | 12 | 3.5 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
authorization_removed_cross_origin |
No | No | 111 | No | 16.1 | No | 111 | No | 16.1 | No | No | 16.1 |
error_event |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
getAllResponseHeaders |
1 | 12 | 1Starting from Firefox 49, empty headers are returned as empty strings in case the preferencenetwork.http.keep_empty_response_headers_as_empty_string is set to true, defaulting to false. Before Firefox 49 empty headers had been ignored. Since Firefox 50 the preference defaults to true. |
≤12.1 | 1.2 | 18 | 4Starting from Firefox for Android 49, empty headers are returned as empty strings in case the preferencenetwork.http.keep_empty_response_headers_as_empty_string is set to true, defaulting to false. Before Firefox for Android 49 empty headers had been ignored. Since Firefox for Android 50 the preference defaults to true. |
≤12.1 | 1 | 1.0 | 4.4 | 1 |
getResponseHeader |
1 | 12 | 1Starting from Firefox 49, empty headers are returned as empty strings in case the preferencenetwork.http.keep_empty_response_headers_as_empty_string is set to true, defaulting to false. Before Firefox 49 empty headers had been ignored. Since Firefox 50 the preference defaults to true. |
8 | 1.2 | 18 | 4Starting from Firefox for Android 49, empty headers are returned as empty strings in case the preferencenetwork.http.keep_empty_response_headers_as_empty_string is set to true, defaulting to false. Before Firefox for Android 49 empty headers had been ignored. Since Firefox for Android 50 the preference defaults to true. |
10.1 | 1 | 1.0 | 4.4 | 1 |
load_event |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
loadend_event |
18 | 12 | 5 | ≤12.1 | 4 | 18 | 5 | ≤12.1 | 3 | 1.0 | 4.4 | 3 |
loadstart_event |
1 | 12 | 3.5 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
open |
1 | 12 | 1Starting in Firefox 30, synchronous requests on the main thread have been deprecated due to their negative impact on performance and the user experience. Therefore, theasync parameter may not be false except in a Worker. |
8 | 1.2 | 18 | 4Starting in Firefox for Android 30, synchronous requests on the main thread have been deprecated due to their negative impact on performance and the user experience. Therefore, theasync parameter may not be false except in a Worker. |
10.1 | 1 | 1.0 | 4.4 | 1 |
overrideMimeType |
1 | 12 | 1 | ≤12.1 | 1.2 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
progress_event |
1 | 12 | 1 | ≤12.1 | 3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
readyState |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
readystatechange_event |
1 | 12 | 1 | 9 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
response |
9 | 12 | 6 | 11.6 | 5.1 | 18 | 6 | 12 | 5 | 1.0 | 3 | 5 |
responseText |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
responseType |
31 | 12 | 6 | 1812–15 | 5.1 | 31 | 50 | 1812–14 | 5 | 2.0 | 4.4.3 | 5 |
responseURL |
37 | 14 | 32 | 24 | 8 | 37 | 32 | 24 | 8 | 3.0 | 37 | 8 |
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 | 4.4 | 1 |
send |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
setAttributionReporting |
125 | 125 | No | 111 | No | 125 | No | 83 | No | 27.0 | 125 | No |
setPrivateToken |
117 | 117 | No | 103 | No | 117 | No | 78 | No | 24.0 | 117 | No |
setRequestHeader |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
status |
1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
statusText |
1 | 12 | 1 | ≤12.1 | 1.2 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 | 1 |
timeout |
29 | 12 | 12 | 1712–16 | 7 | 29 | 14 | 1812–16 | 7 | 2.0 | 4.4 | 7 |
timeout_event |
29 | 12 | 12 | 16 | 7 | 29 | 14 | 16 | 7 | 1.0 | 4.4 | 7 |
upload |
2 | 12 | 3.5 | ≤12.1 | 4 | 18 | 4 | ≤12.1 | 3 | 1.0 | 4.4 | 3 |
withCredentials |
3 | 12 | 3.5Starting with Firefox 11, it's no longer supported to use thewithCredentials attribute when performing synchronous requests. Attempting to do so throws an NS_ERROR_DOM_INVALID_ACCESS_ERR exception. |
12 | 4 | 18 | 4Starting with Firefox for Android 14, it's no longer supported to use thewithCredentials attribute when performing synchronous requests. Attempting to do so throws an NS_ERROR_DOM_INVALID_ACCESS_ERR exception. |
12 | 3.2 | 1.0 | 4.4 | 3.2 |
worker_support |
4 | 12 | 3.5 | 10.6 | 4 | 18 | 4 | 11 | 5 | 1.0 | 4 | 5 |
© 2005–2025 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