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 使用 XMLHttpRequest .

To get an overview of how to use XMLHttpRequest in general, see 使用 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" responseType 特性为 XMLHttpRequest object after calling open() but before calling send() .

var xhr = new XMLHttpRequest();
xhr.onload = function() {
  console.log(this.responseXML.title);
}
xhr.open("GET", "file.html");
xhr.responseType = "document";
xhr.send();
					

特征检测

方法 1

This method relies on the "force async" nature of the feature. When you try to set responseType of an XMLHttpRequest object after it is opened as "sync". This throws an error in the browsers that implement the feature and works on others.

function HTMLinXHR() {
  if (!window.XMLHttpRequest)
    return false;
  var req = new window.XMLHttpRequest();
  req.open('GET', window.location.href, false);
  try {
    req.responseType = 'document';
  } catch(e) {
    return true;
  }
  return false;
}
					

View on JSFiddle

This method is synchronous, does not rely on external assets though it may not be as reliable as method 2 described below since it does not check the actual feature but an indication of that feature.

方法 2

There are two challenges to detecting exactly if a browser supports HTML parsing in XMLHttpRequest . First, the detection result is obtained asynchronously, because HTML support is only available in the asynchronous mode. Second, you have to actually fetch a test document over HTTP, because testing with a data: URL would end up testing data: URL support at the same time.

Thus, to detect HTML support, a test HTML file is needed on the server. This test file is small and is not well-formed XML:

<title>&&<</title>
					

If the file is named detect.html , the following function can be used for detecting HTML parsing support:

function detectHtmlInXhr(callback) {
  if (!window.XMLHttpRequest) {
    window.setTimeout(function() { callback(false); }, 0);
    return;
  }
  var done = false;
  var xhr = new window.XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (this.readyState == 4 && !done) {
      done = true;
      callback(!!(this.responseXML && this.responseXML.title && this.responseXML.title == "&&<"));
    }
  }
  xhr.onabort = xhr.onerror = function() {
    if (!done) {
      done = true;
      callback(false);
    }
  }
  try {
    xhr.open("GET", "detect.html");
    xhr.responseType = "document";
    xhr.send();
  } catch (e) {
    window.setTimeout(function() {
      if (!done) {
        done = true;
        callback(false);
      }
    }, 0);
  }
}
					

自变量 callback is a function that will be called asynchronously with true as the only argument if HTML parsing is supported and false as the only argument if HTML parsing is not supported.

View on JSFiddle

字符编码

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.

在旧浏览器中处理 HTML

XMLHttpRequest originally supported only XML parsing. HTML parsing support is a recent addition. For older browsers, you can even use the XMLHttpRequest.responseText property in association with 正则表达式 in order to get, for example, the source code of an HTML element given its ID:

function getHTML (oXHR, sTargetId) {
  var  rOpen = new RegExp("<(?!\!)\\s*([^\\s>]+)[^>]*\\s+id\\=[\"\']" + sTargetId + "[\"\'][^>]*>" ,"i"),
       sSrc = oXHR.responseText, aExec = rOpen.exec(sSrc);
  return aExec ? (new RegExp("(?:(?:.(?!<\\s*" + aExec[1] + "[^>]*[>]))*.?<\\s*" + aExec[1] + "[^>]*[>](?:.(?!<\\s*\/\\s*" + aExec[1] + "\\s*>))*.?<\\s*\/\\s*" + aExec[1] + "\\s*>)*(?:.(?!<\\s*\/\\s*" + aExec[1] + "\\s*>))*.?", "i")).exec(sSrc.slice(sSrc.indexOf(aExec[0]) + aExec[0].length)) || "" : "";
}
var oReq = new XMLHttpRequest();
oReq.open("GET", "yourPage.html", true);
oReq.onload = function () { console.log(getHTML(this, "intro")); };
oReq.send(null);
					
注意: This solution is very expensive for the interpreter. Use it only when it is really necessary .

规范

规范 状态 注释
XMLHttpRequest 实时标准 初始定义

浏览器兼容性

XMLHttpRequest interface

The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request. 更新 GitHub 上的兼容性数据
桌面 移动
Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet
XMLHttpRequest Chrome 1 Edge 12
12
不支持 12 — 79
Implemented via ActiveXObject('Microsoft.XMLHTTP')
Firefox 1 IE 7
7
5
Implemented via ActiveXObject('Microsoft.XMLHTTP')
Opera 8 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4 Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
abort Chrome 18 Edge 12 Firefox Yes IE 5 Opera Yes Safari 1.2 WebView Android Yes Chrome Android Yes Firefox Android Yes Opera Android Yes Safari iOS Yes Samsung Internet Android Yes
abort event Chrome Yes Edge ≤79 Firefox Yes IE 10 Opera Yes Safari Yes WebView Android Yes Chrome Android Yes Firefox Android Yes Opera Android Yes Safari iOS ? Samsung Internet Android Yes
error event Chrome Yes Edge ≤79 Firefox Yes IE 10 Opera Yes Safari Yes WebView Android Yes Chrome Android Yes Firefox Android Yes Opera Android Yes Safari iOS ? Samsung Internet Android Yes
getAllResponseHeaders Chrome 1 Edge 12 Firefox 4
4
Starting from Firefox 49, empty headers are returned as empty strings in case the preference network.http.keep_empty_response_headers_as_empty_string 被设为 true ,默认为 false . Before Firefox 49 empty headers had been ignored. Since Firefox 50 the preference defaults to true .
IE 5 Opera Yes Safari 1.2 WebView Android Yes Chrome Android Yes Firefox Android 4
4
Starting from Firefox 49, empty headers are returned as empty strings in case the preference network.http.keep_empty_response_headers_as_empty_string 被设为 true ,默认为 false . Before Firefox 49 empty headers had been ignored. Since Firefox 50 the preference defaults to true .
Opera Android Yes Safari iOS Yes Samsung Internet Android Yes
getResponseHeader Chrome 1 Edge 12 Firefox 1
1
Starting from Firefox 49, empty headers are returned as empty strings in case the preference network.http.keep_empty_response_headers_as_empty_string 被设为 true ,默认为 false . Before Firefox 49 empty headers had been ignored. Since Firefox 50 the preference defaults to true .
IE 5 Opera 8 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4
4
Starting from Firefox 49, empty headers are returned as empty strings in case the preference network.http.keep_empty_response_headers_as_empty_string 被设为 true ,默认为 false . Before Firefox 49 empty headers had been ignored. Since Firefox 50 the preference defaults to true .
Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
load event Chrome Yes Edge ≤79 Firefox Yes IE 9 Opera Yes Safari Yes WebView Android Yes Chrome Android Yes Firefox Android Yes Opera Android Yes Safari iOS ? Samsung Internet Android Yes
loadend event Chrome Yes Edge ≤79 Firefox Yes IE 10 Opera Yes Safari Yes WebView Android Yes Chrome Android Yes Firefox Android Yes Opera Android Yes Safari iOS ? Samsung Internet Android Yes
loadstart event Chrome Yes Edge ≤79 Firefox Yes IE 10 Opera Yes Safari Yes WebView Android Yes Chrome Android Yes Firefox Android Yes Opera Android Yes Safari iOS ? Samsung Internet Android Yes
onreadystatechange Chrome 1 Edge 12 Firefox 1 IE 5 Opera 9 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4 Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
open Chrome 1 Edge 12 Firefox 1
1
Starting in Firefox 30, synchronous requests on the main thread have been deprecated due to their negative impact on performance and the user experience. Therefore, the async parameter may not be false except in a Worker .
IE 5 Opera 8 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4
4
Starting in Firefox 30, synchronous requests on the main thread have been deprecated due to their negative impact on performance and the user experience. Therefore, the async parameter may not be false except in a Worker .
Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
overrideMimeType Chrome 1 Edge 12 Firefox Yes IE 11
11
5
Implemented via ActiveXObject
Opera Yes Safari 1.2 WebView Android Yes Chrome Android 18 Firefox Android Yes Opera Android Yes Safari iOS Yes Samsung Internet Android 1.0
progress event Chrome Yes Edge ≤79 Firefox Yes IE 10 Opera Yes Safari Yes WebView Android Yes Chrome Android Yes Firefox Android Yes Opera Android Yes Safari iOS ? Samsung Internet Android Yes
readyState Chrome 1 Edge 12 Firefox 1 IE 7 Opera 8 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4 Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
response Chrome 9 Edge 12 Firefox 6 IE 10 Opera 11.6 Safari 5.1 WebView Android ≤37 Chrome Android 18 Firefox Android 6 Opera Android 12 Safari iOS 6 Samsung Internet Android 1.0
responseText Chrome 1 Edge 12 Firefox 1 IE 5
5
Before Internet Explorer 10, the value of XMLHttpRequest.responseText could be read only once the request was complete.
Opera 8 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4 Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
responseType Chrome 31 Edge 12 Firefox 6 IE 10 Opera 18 Safari 7 WebView Android 55 Chrome Android 55 Firefox Android 50 Opera Android 42 Safari iOS 7 Samsung Internet Android 6.0
responseURL Chrome 37 Edge 14 Firefox 32 IE No Opera 24 Safari 8 WebView Android 37 Chrome Android 37 Firefox Android 32 Opera Android 24 Safari iOS Yes Samsung Internet Android 3.0
responseXML Chrome Yes Edge 12 Firefox Yes
Yes
Prior to 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.
IE Yes Opera Yes Safari Yes WebView Android Yes Chrome Android Yes Firefox Android Yes
Yes
Prior to 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.
Opera Android Yes Safari iOS Yes Samsung Internet Android Yes
send Chrome 1 Edge 12 Firefox 1 IE 5 Opera 8 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4 Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
sendAsBinary 弃用 非标 Chrome No
不支持 No
polyfill available to support sendAsBinary() .
Edge No
不支持 No
polyfill available to support sendAsBinary() .
Firefox 2 — 31 IE No Opera No Safari No WebView Android No
不支持 No
polyfill available to support sendAsBinary() .
Chrome Android No
不支持 No
polyfill available to support sendAsBinary() .
Firefox Android 4 — 31 Opera Android No Safari iOS No Samsung Internet Android No
不支持 No
polyfill available to support sendAsBinary() .
setRequestHeader Chrome 1 Edge 12 Firefox 1 IE 5 Opera 8 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4 Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
status Chrome 1 Edge 12 Firefox 1 IE 7
7
Internet Explorer version 5 and 6 supported ajax calls using ActiveXObject()
Opera 8 Safari 1.2 WebView Android 1 Chrome Android 18 Firefox Android 4 Opera Android 10.1 Safari iOS 1 Samsung Internet Android 1.0
statusText Chrome 1 Edge 12 Firefox 1 IE 7
7
Internet Explorer version 5 and 6 supported ajax calls using ActiveXObject()
Opera Yes Safari 1.2 WebView Android Yes Chrome Android 18 Firefox Android 4 Opera Android Yes Safari iOS Yes Samsung Internet Android 1.0
timeout Chrome 29 Edge 12 Firefox 12 IE 8 Opera 17
17
不支持 12 — 16
Safari 6.1 WebView Android ≤37 Chrome Android 29 Firefox Android 14 Opera Android 18
18
不支持 12 — 16
Safari iOS 7 Samsung Internet Android 2.0
timeout event Chrome Yes Edge ≤18 Firefox Yes IE 10 Opera Yes Safari Yes WebView Android Yes Chrome Android Yes Firefox Android Yes Opera Android Yes Safari iOS Yes Samsung Internet Android Yes
upload Chrome 1 Edge 12 Firefox Yes IE 10 Opera Yes Safari 10 WebView Android Yes Chrome Android 18 Firefox Android Yes Opera Android Yes Safari iOS Yes Samsung Internet Android 1.0
withCredentials Chrome 3 Edge 12 Firefox 3.5
3.5
Starting with Firefox 11, it's no longer supported to use the withCredentials attribute when performing synchronous requests. Attempting to do so throws an NS_ERROR_DOM_INVALID_ACCESS_ERR 异常。
IE 10
10
Internet Explorer versions 8 and 9 supported cross-domain requests (CORS) using XDomainRequest .
Opera 12 Safari 4 WebView Android ≤37 Chrome Android 18 Firefox Android 4
4
Starting with Firefox 11, it's no longer supported to use the withCredentials attribute when performing synchronous requests. Attempting to do so throws an NS_ERROR_DOM_INVALID_ACCESS_ERR 异常。
Opera Android 12 Safari iOS 3.2 Samsung Internet Android 1.0

图例

完整支持

完整支持

不支持

不支持

兼容性未知 ?

兼容性未知

非标。预期跨浏览器支持较差。

非标。预期跨浏览器支持较差。

弃用。不要用于新网站。

弃用。不要用于新网站。

见实现注意事项。

另请参阅

元数据

  • 最后修改: