1. Introduction
This section is non-normative.
The XMLHttpRequest object is an API for fetching resources.
The name XMLHttpRequest is historical and has no bearing on its functionality.
Some simple code to do something with data from an XML document fetched over the network:
function processData( data) {
// taking care of data
}
function handler() {
if ( this . status == 200 &&
this . responseXML != null &&
this . responseXML. getElementById( 'test' ). textContent) {
// success!
processData( this . responseXML. getElementById( 'test' ). textContent);
} else {
// something went wrong
…
}
}
var client = new XMLHttpRequest();
client. onload = handler;
client. open( "GET" , "unicorn.xml" );
client. send();
If you just want to log a message to the server:
function log( message) {
var client = new XMLHttpRequest();
client. open( "POST" , "/log" );
client. setRequestHeader( "Content-Type" , "text/plain;charset=UTF-8" );
client. send( message);
}
Or if you want to check the status of a document on the server:
function fetchStatus( address) {
var client = new XMLHttpRequest();
client. onload = function () {
// in case of network errors this might not give reliable results
returnStatus( this . status);
}
client. open( "HEAD" , address);
client. send();
}
1.1. Specification history
The XMLHttpRequest object was initially defined as part of
the WHATWG’s HTML effort. (Based on Microsoft’s implementation many years prior.)
It moved to the W3C in 2006. Extensions (e.g. progress events and
cross-origin requests) to XMLHttpRequest were developed in a
separate draft (XMLHttpRequest Level 2) until end of 2011, at which point
the two drafts were merged and XMLHttpRequest became a single
entity again from a standards perspective. End of 2012 it moved back to the
WHATWG.
Discussion that led to the current draft can be found in the following mailing list archives:
2. Conformance
All diagrams, examples, and notes in this specification are non-normative, as are all sections explicitly marked non-normative. Everything else in this specification is normative.
The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this specification are to be interpreted as described in RFC2119. For readability, these words do not appear in all uppercase letters in this specification. [RFC2119]
2.1. Extensibility
User agents, Working Groups, and other interested parties are strongly encouraged to discuss new features with the WHATWG community.
3. Terminology
This specification uses terminology, cross-linked throughout, from DOM, DOM Parsing and Serialization, Encoding, Feature Policy, Fetch, File API, HTML, HTTP, URL, Web IDL, and XML.
[DOM] [DOMPS] [ENCODING] [FEATURE-POLICY] [FETCH] [FILEAPI] [HTML] [HTTP] [URL] [WEBIDL] [XML] [XMLNS]
It uses the typographic conventions from HTML. [HTML]
4. Interface XMLHttpRequest
[Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :XMLHttpRequestEventTarget EventTarget { // event handlersattribute EventHandler onloadstart ;attribute EventHandler onprogress ;attribute EventHandler onabort ;attribute EventHandler onerror ;attribute EventHandler onload ;attribute EventHandler ontimeout ;attribute EventHandler onloadend ; }; [Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :XMLHttpRequestUpload XMLHttpRequestEventTarget { };enum {XMLHttpRequestResponseType ,"" ,"arraybuffer" ,"blob" ,"document" ,"json" }; ["text" Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :XMLHttpRequest XMLHttpRequestEventTarget {constructor (); // event handlerattribute EventHandler onreadystatechange ; // statesconst unsigned short UNSENT = 0;const unsigned short OPENED = 1;const unsigned short HEADERS_RECEIVED = 2;const unsigned short LOADING = 3;const unsigned short DONE = 4;readonly attribute unsigned short readyState ; // requestvoid open (ByteString ,method USVString );url void open (ByteString ,method USVString ,url boolean ,async optional USVString ?=username null ,optional USVString ?=password null );void setRequestHeader (ByteString ,name ByteString );value attribute unsigned long timeout ;attribute boolean withCredentials ; [SameObject ]readonly attribute XMLHttpRequestUpload upload ;void send (optional (Document or XMLHttpRequestBodyInit )?=body null );void abort (); // responsereadonly attribute USVString responseURL ;readonly attribute unsigned short status ;readonly attribute ByteString statusText ;ByteString ?getResponseHeader (ByteString );name ByteString getAllResponseHeaders ();void overrideMimeType (DOMString );mime attribute XMLHttpRequestResponseType responseType ;readonly attribute any response ;readonly attribute USVString responseText ; [Exposed =Window ]readonly attribute Document ?responseXML ; };
An XMLHttpRequest object has an associated XMLHttpRequestUpload object.
An XMLHttpRequest object has an associated state, which is one of unsent, opened, headers received, loading, and done. Unless stated otherwise it is unsent.
An XMLHttpRequest object has an associated send() flag. Unless stated otherwise it is unset.
4.1. Constructors
client = new XMLHttpRequest()- Returns a new
XMLHttpRequestobject.
The XMLHttpRequest() constructor, when invoked, must return a new XMLHttpRequest object.
4.2. Garbage collection
An XMLHttpRequest object must not be garbage collected if its state is either opened with the send() flag set, headers received, or loading, and it has one or more event listeners registered whose type is one of readystatechange, progress, abort, error, load, timeout, and loadend.
If an XMLHttpRequest object is garbage collected while its
connection is still open, the user agent must terminate the ongoing
fetch operated by the XMLHttpRequest object.
4.3. Event handlers
The following are the event handlers (and their corresponding event handler event types)
that must be supported on objects implementing an interface that inherits
from XMLHttpRequestEventTarget as attributes:
| event handler | event handler event type |
|---|---|
|
XMLHttpRequestEventTarget/onloadstart In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)18IE10+ Firefox for AndroidYesiOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes onloadstart
| loadstart
|
onprogress
| progress
|
|
XMLHttpRequestEventTarget/onabort In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)18IE10+ Firefox for AndroidYesiOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes onabort
| abort
|
|
XMLHttpRequestEventTarget/onerror In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)18IE10+ Firefox for AndroidYesiOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes onerror
| error
|
|
XMLHttpRequestEventTarget/onload In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)18IE9+ Firefox for AndroidYesiOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes XMLHttpRequestEventTarget/onprogress In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)18IE10+ Firefox for AndroidYesiOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes onload
| load
|
ontimeout
| timeout
|
onloadend
| loadend
|
The following is the event handler (and its corresponding event handler event type) that must be
supported as attribute solely by the XMLHttpRequest object:
| event handler | event handler event type |
|---|---|
|
XMLHttpRequest/onreadystatechange In all current engines.
Firefox1+Safari1.2+Chrome1+
Opera9+Edge79+ Edge (Legacy)12+IE5+ Firefox for Android4+iOS Safari1+Chrome for Android18+Android WebView1+Samsung Internet1.0+Opera Mobile10.1+ onreadystatechange
| readystatechange
|
4.4. States
In all current engines.
Opera8+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android4+iOS Safari1+Chrome for Android18+Android WebView1+Samsung Internet1.0+Opera Mobile10.1+
client . readyState-
Returns client’s state.
The readyState attribute’s getter must return the value from the table below in the cell of the second column, from
the row where the value in the cell in the first column is context object’s state:
| unsent | UNSENT (numeric value 0)
| The object has been constructed. |
| opened | OPENED (numeric value 1)
| The open() method has
been successfully invoked. During this state request headers can be set using setRequestHeader() and the fetch can be initiated using the send() method.
|
| headers received | HEADERS_RECEIVED (numeric value 2)
| All redirects (if any) have been followed and all HTTP headers of the response have been received. |
| loading | LOADING (numeric value 3)
| The response’s body is being received. |
| done | DONE (numeric value 4)
| The data transfer has been completed or something went wrong during the transfer (e.g. infinite redirects). |
4.5. Request
Each XMLHttpRequest object has the following request-associated concepts: request method, request URL, author request headers, request body, synchronous flag, upload complete flag, upload listener flag, and timed out flag.
The author request headers is an initially empty header list.
The request body is initially null.
The synchronous flag, upload complete flag, upload listener flag and timed out flag are initially unset.
Registering one or more event listeners
on an XMLHttpRequestUpload object will result in a CORS-preflight request. (That is
because registering an event listener causes the upload listener flag to be set, which in
turn causes the use-CORS-preflight flag to be set.)
4.5.1. The open() method
In all current engines.
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android4+iOS Safari1+Chrome for Android18+Android WebView1+Samsung Internet1.0+Opera Mobile10.1+
client . open(method, url [, async = true [, username = null [, password = null]]])-
Sets the request method, request URL, and synchronous flag.
Throws a "
SyntaxError"DOMExceptionif either method is not a valid HTTP method or url cannot be parsed.Throws a "
SecurityError"DOMExceptionif method is a case-insensitive match for `CONNECT`, `TRACE`, or `TRACK`.Throws an "
InvalidAccessError"DOMExceptionif async is false, current global object is aWindowobject, and thetimeoutattribute is not zero or theresponseTypeattribute is not the empty string.
Synchronous XMLHttpRequest outside of workers is
in the process of being removed from the web platform as it has detrimental effects to the end
user’s experience. (This is a long process that takes many years.) Developers must not pass false
for the async argument when current global object is a Window object. User
agents are strongly encouraged to warn about such usage in developer tools and may experiment with throwing an "InvalidAccessError" DOMException when it occurs.
The open(method, url) and open(method, url, async, username, password) methods, when invoked, must run these steps:
-
Let settingsObject be context object’s relevant settings object.
-
If settingsObject has a responsible document and it is not fully active, then throw an "
InvalidStateError"DOMException. -
If method is not a method, then throw a "
SyntaxError"DOMException. -
If method is a forbidden method, then throw a "
SecurityError"DOMException. -
Normalize method.
-
Let parsedURL be the result of parsing url with settingsObject’s API base URL and settingsObject’s API URL character encoding.
-
If parsedURL is failure, then throw a "
SyntaxError"DOMException. -
If the async argument is omitted, set async to true, and set username and password to null.
Unfortunately legacy content prevents treating the async argument being
undefinedidentical from it being omitted. -
If parsedURL’s host is non-null, then:
-
If the username argument is not null, set the username given parsedURL and username.
-
If the password argument is not null, set the password given parsedURL and password.
-
-
If async is false, current global object is a
Windowobject, and thetimeoutattribute value is not zero or theresponseTypeattribute value is not the empty string, then throw an "InvalidAccessError"DOMException. -
Terminate the ongoing fetch operated by the
XMLHttpRequestobject.A fetch can be ongoing at this point.
-
Set variables associated with the object as follows:
-
Unset the
send()flag and upload listener flag. -
Set request method to method.
-
Set request URL to parsedURL.
-
Set the synchronous flag, if async is false, and unset the synchronous flag otherwise.
-
Empty author request headers.
-
Set response to a network error.
-
Set received bytes to the empty byte sequence.
-
Set response object to null.
Override MIME type is not overridden here as the
overrideMimeType()method can be invoked before theopen()method. -
-
If the state is not opened, then:
-
Set state to opened.
-
Fire an event named
readystatechangeat this.
-
The reason there are two open() methods defined is due to a limitation of
the editing software used to write the XMLHttpRequest Standard.
4.5.2. The setRequestHeader() method
XMLHttpRequest/setRequestHeader
In all current engines.
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android4+iOS Safari1+Chrome for Android18+Android WebView1+Samsung Internet1.0+Opera Mobile10.1+
client . setRequestHeader(name, value)-
Combines a header in author request headers.
Throws an "
InvalidStateError"DOMExceptionif either state is not opened or thesend()flag is set.Throws a "
SyntaxError"DOMExceptionif name is not a header name or if value is not a header value.
The setRequestHeader(name, value) method must run these steps:
-
If state is not opened, then throw an "
InvalidStateError"DOMException. -
If the
send()flag is set, then throw an "InvalidStateError"DOMException. -
Normalize value.
-
If name is not a name or value is not a value, then throw a "
SyntaxError"DOMException. -
Terminate these steps if name is a forbidden header name.
-
Combine name/value in author request headers.
Some simple code demonstrating what happens when setting the same header twice:
// The following script:
var client = new XMLHttpRequest();
client. open( 'GET' , 'demo.cgi' );
client. setRequestHeader( 'X-Test' , 'one' );
client. setRequestHeader( 'X-Test' , 'two' );
client. send();
// …results in the following header being sent:
// X-Test: one, two
4.5.3. The timeout attribute
In all current engines.
Opera17+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android14+iOS Safari7+Chrome for Android29+Android WebView37+Samsung Internet2.0+Opera Mobile18+
client . timeout-
Can be set to a time in milliseconds. When set to a non-zero value will cause fetching to terminate after the given time has passed. When the time has passed, the request has not yet completed, and the synchronous flag is unset, a
timeoutevent will then be dispatched, or a "TimeoutError"DOMExceptionwill be thrown otherwise (for thesend()method).When set: throws an "
InvalidAccessError"DOMExceptionif the synchronous flag is set and current global object is aWindowobject.
The timeout attribute must return its value. Initially its value must be zero.
Setting the timeout attribute must run these steps:
-
If current global object is a
Windowobject and the synchronous flag is set, then throw an "InvalidAccessError"DOMException. -
Set its value to the new value.
This implies that the timeout attribute can be
set while fetching is in
progress. If that occurs it will still be measured relative to the start
of fetching.
4.5.4. The withCredentials attribute
XMLHttpRequest/withCredentials
In all current engines.
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android4+iOS Safari3.2+Chrome for Android18+Android WebView37+Samsung Internet1.0+Opera Mobile12+
client . withCredentials-
True when credentials are to be included in a cross-origin request. False when they are to be excluded in a cross-origin request and when cookies are to be ignored in its response. Initially false.
When set: throws an "
InvalidStateError"DOMExceptionif state is not unsent or opened, or if thesend()flag is set.
The withCredentials attribute must return its value. Initially its value must be false.
Setting the withCredentials attribute must run these steps:
-
If state is not unsent or opened, then throw an "
InvalidStateError"DOMException. -
If the
send()flag is set, then throw an "InvalidStateError"DOMException. -
Set the
withCredentialsattribute’s value to the given value.
The withCredentials attribute has no effect when fetching same-origin resources.
4.5.5. The upload attribute
In all current engines.
OperaYesEdge79+
Edge (Legacy)12+IE10+
Firefox for AndroidYesiOS SafariYesChrome for Android18+Android WebView1+Samsung Internet1.0+Opera MobileYes
client . upload-
Returns the associated
XMLHttpRequestUploadobject. It can be used to gather transmission information when data is transferred to a server.
The upload attribute must return the associated XMLHttpRequestUpload object.
As indicated earlier, each XMLHttpRequest object has an associated XMLHttpRequestUpload object.
4.5.6. The send() method
In all current engines.
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android4+iOS Safari1+Chrome for Android18+Android WebView1+Samsung Internet1.0+Opera Mobile10.1+
client . send([body = null])-
Initiates the request. The body argument provides the request body, if any, and is ignored if the request method is
GETorHEAD.Throws an "
InvalidStateError"DOMExceptionif either state is not opened or thesend()flag is set.
The send(body) method must run these steps:
-
If state is not opened, then throw an "
InvalidStateError"DOMException. -
If the
send()flag is set, then throw an "InvalidStateError"DOMException. -
If the request method is
GETorHEAD, set body to null. -
If body is not null, then:
-
Let extractedContentType be null.
-
If body is a
Document, then set request body to body, serialized, converted, and UTF-8 encoded. -
Otherwise, set request body and extractedContentType to the result of extracting body.
-
If author request headers contains `
Content-Type`, then:-
If body is a
Documentor aUSVString, then:-
Let originalAuthorContentType be the value of the header whose name is a byte-case-insensitive match for `
Content-Type` in author request headers. -
Let contentTypeRecord be the result of parsing originalAuthorContentType.
-
If contentTypeRecord is not failure, contentTypeRecord’s parameters["
charset"] exists, and parameters["charset"] is not an ASCII case-insensitive match for "UTF-8", then:-
Set contentTypeRecord’s parameters["
charset"] to "UTF-8". -
Let newContentTypeSerialized be the result of serializing contentTypeRecord.
-
Set `
Content-Type`/newContentTypeSerialized in author request headers.
-
-
-
-
Otherwise:
-
If body is an HTML document, set `
Content-Type`/`text/html;charset=UTF-8` in author request headers. -
Otherwise, if body is an XML document, set `
Content-Type`/`application/xml;charset=UTF-8` in author request headers. -
Otherwise, if extractedContentType is not null, set `
Content-Type`/extractedContentType in author request headers.
-
-
-
If one or more event listeners are registered on the associated
XMLHttpRequestUploadobject, then set upload listener flag. -
Let req be a new request, initialized as follows:
- method
- request method
- url
- request URL
- header list
- author request headers
- unsafe-request flag
- Set.
- body
- request body
- client
- context object’s relevant settings object
- synchronous flag
- Set if the synchronous flag is set.
- mode
- "
cors" - use-CORS-preflight flag
- Set if upload listener flag is set.
- credentials mode
- If the
withCredentialsattribute value is true, "include", and "same-origin" otherwise. - use-URL-credentials flag
- Set if either request URL’s username is not the empty string or request URL’s password is non-null.
-
Unset the upload complete flag.
-
Unset the timed out flag.
-
If req’s body is null, set the upload complete flag.
-
Set the
send()flag. -
If the synchronous flag is unset, then:
-
Fire a progress event named
loadstartat this with 0 and 0. -
If the upload complete flag is unset and upload listener flag is set, then fire a progress event named
loadstartat this’sXMLHttpRequestUploadobject with 0 and req’s body’s total bytes. -
If state is not opened or the
send()flag is unset, then return. -
Fetch req. Handle the tasks queued on the networking task source per below.
Run these steps in parallel:
-
Wait until either req’s done flag is set or
-
If req’s done flag is unset, then set the timed out flag and terminate fetching.
To process request body for request, run these steps:
-
If not roughly 50ms have passed since these steps were last invoked, terminate these steps.
-
If upload listener flag is set, then fire a progress event named
progressat this’sXMLHttpRequestUploadobject with request’s body’s transmitted bytes and request’s body’s total bytes.
These steps are only invoked when new bytes are transmitted.
To process request end-of-body for request, run these steps:
-
Set the upload complete flag.
-
If upload listener flag is unset, then terminate these steps.
-
Let transmitted be request’s body’s transmitted bytes.
-
Let length be request’s body’s total bytes.
-
Fire a progress event named
progressat this’sXMLHttpRequestUploadobject with transmitted and length. -
Fire a progress event named
loadat this’sXMLHttpRequestUploadobject with transmitted and length. -
Fire a progress event named
loadendat this’sXMLHttpRequestUploadobject with transmitted and length.
To process response for response, run these steps:
-
Set response to response.
-
Handle errors for response.
-
If response is a network error, return.
-
Set state to headers received.
-
Fire an event named
readystatechangeat this. -
If state is not headers received, then return.
-
If response’s body is null, then run handle response end-of-body and return.
-
Let reader be the result of getting a reader from response’s body’s stream.
This operation will not throw an exception.
-
Let read be the result of reading a chunk from response’s body’s stream with reader.
When read is fulfilled with an object whose
doneproperty is false and whosevalueproperty is aUint8Arrayobject, run these steps and then run this step again:-
Append the
valueproperty to received bytes. -
If not roughly 50ms have passed since these steps were last invoked, then terminate these steps.
-
Fire an event named
readystatechangeat this.Web compatibility is the reason
readystatechangefires more often than state changes. -
Fire a progress event named
progressat this with response’s body’s transmitted bytes and response’s body’s total bytes.
These steps are only invoked when new bytes are transmitted.
When read is fulfilled with an object whose
doneproperty is true, run handle response end-of-body for response.When read is rejected with an exception, run handle errors for response.
-
-
-
-
Otherwise, if the synchronous flag is set, run these steps:
-
If context object’s relevant settings object has a responsible document which is not allowed to use the "
sync-xhr" feature, then run handle response end-of-body for a network error and return. -
Let response be the result of fetching req.
If the
timeoutattribute value is not zero, then set the timed out flag and terminate fetching if it has not returned within the amount of milliseconds from thetimeout. -
If response’s body is null, then run handle response end-of-body and return.
-
Let reader be the result of getting a reader from response’s body’s stream.
This operation will not throw an exception.
-
Let promise be the result of reading all bytes from response’s body’s stream with reader.
-
Wait for promise to be fulfilled or rejected.
-
If promise is fulfilled with bytes, then append bytes to received bytes.
-
Run handle response end-of-body for response.
-
To handle response end-of-body for response, run these steps:
-
If the synchronous flag is set, set response to response.
-
Handle errors for response.
-
If response is a network error, return.
-
If the synchronous flag is unset, update response’s body using response.
-
Let transmitted be response’s body’s transmitted bytes.
-
Let length be response’s body’s total bytes.
-
If the synchronous flag is unset, fire a progress event named
progressat this with transmitted and length. -
Set state to done.
-
Unset the
send()flag. -
Fire an event named
readystatechangeat this. -
Fire a progress event named
loadat this with transmitted and length. -
Fire a progress event named
loadendat this with transmitted and length.
To handle errors for response run these steps:
-
If the
send()flag is unset, return. -
If the timed out flag is set, then run the request error steps for event
timeoutand exception "TimeoutError"DOMException. -
If response is a network error, then run the request error steps for event
errorand exception "NetworkError"DOMException. -
Otherwise, if response’s body’s stream is errored, then:
-
Set state to done.
-
Unset the
send()flag. -
Set response to a network error.
-
-
Otherwise, if response’s aborted flag is set, then run the request error steps for event
abortand exception "AbortError"DOMException.
The request error steps for event event and optionally an exception exception are:
-
Set state to done.
-
Unset the
send()flag. -
Set response to a network error.
-
If the synchronous flag is set, throw an exception exception.
-
Fire an event named
readystatechangeat this.At this point it is clear that the synchronous flag is unset.
-
If the upload complete flag is unset, then:
-
Set the upload complete flag.
-
If the upload listener flag is set, then:
-
Fire a progress event named event at this’s
XMLHttpRequestUploadobject with 0 and 0. -
Fire a progress event named
loadendat this’sXMLHttpRequestUploadobject with 0 and 0.
-
-
-
Fire a progress event named event at this with 0 and 0.
-
Fire a progress event named
loadendat this with 0 and 0.
4.5.7. The abort() method
In all current engines.
OperaYesEdge79+
Edge (Legacy)12+IE5+
Firefox for AndroidYesiOS SafariYesChrome for AndroidYesAndroid WebView37+Samsung InternetYesOpera MobileYes
client . abort()- Cancels any network activity.
The abort() method,
when invoked, must run these steps:
-
Terminate the ongoing fetch with the aborted flag set.
-
If state is either opened with the
send()flag set, headers received, or loading, run the request error steps for eventabort. -
If state is done, then set state to unsent and response to a network error.
No
readystatechangeevent is dispatched.
4.6. Response
An XMLHttpRequest has an associated response. Unless stated
otherwise it is a network error.
An XMLHttpRequest also has an associated received bytes (a byte
sequence). Unless stated otherwise it is the empty byte sequence.
4.6.1. The responseURL attribute
In all current engines.
Opera24+Edge79+
Edge (Legacy)14+IENone
Firefox for Android32+iOS SafariYesChrome for Android37+Android WebView37+Samsung Internet3.0+Opera Mobile24+
The responseURL attribute
must return the empty string if response’s url is null and its serialization with the exclude fragment flag set otherwise.
4.6.2. The status attribute
In all current engines.
Opera8+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android4+iOS Safari1+Chrome for Android18+Android WebView1+Samsung Internet1.0+Opera Mobile10.1+
The status attribute must return the response’s status.
4.6.3. The statusText attribute
In all current engines.
OperaYesEdge79+
Edge (Legacy)12+IE7+
Firefox for Android4+iOS SafariYesChrome for Android18+Android WebView1+Samsung Internet1.0+Opera MobileYes
The statusText attribute must return the response’s status message.
4.6.4. The getResponseHeader() method
XMLHttpRequest/getResponseHeader
In all current engines.
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android4+iOS Safari1+Chrome for Android18+Android WebView1+Samsung Internet1.0+Opera Mobile10.1+
The getResponseHeader(name) method,
when invoked, must return the result of getting name from response’s header list
The Fetch Standard filters response’s header list. [FETCH]
For the following script:
var client = new XMLHttpRequest();
client. open( "GET" , "unicorns-are-awesome.txt" , true );
client. send();
client. onreadystatechange = function () {
if ( this . readyState == this . HEADERS_RECEIVED) {
print( client. getResponseHeader( "Content-Type" ));
}
}
The print() function will get to process something like:
text/plain; charset=UTF-8
4.6.5. The getAllResponseHeaders() method
XMLHttpRequest/getAllResponseHeaders
In all current engines.
OperaYesEdge79+
Edge (Legacy)12+IE5+
Firefox for Android4+iOS SafariYesChrome for AndroidYesAndroid WebView1+Samsung InternetYesOpera MobileYes
A byte sequence a is legacy-uppercased-byte less than a byte sequence b if the following steps return true:
-
Let A be a, byte-uppercased.
-
Let B be b, byte-uppercased.
-
Return A is byte less than B.
The getAllResponseHeaders() method, when invoked, must run these steps:
-
Let output be an empty byte sequence.
-
Let initialHeaders be the result of running sort and combine with response’s header list.
-
Let headers be the result of sorting initialHeaders in ascending order, with a being less than b if a’s name is legacy-uppercased-byte less than b’s name.
Unfortunately, this is needed for compatibility with deployed content.
-
For each header in headers, append header’s name, followed by a 0x3A 0x20 byte pair, followed by header’s value, followed by a 0x0D 0x0A byte pair, to output.
-
Return output.
The Fetch Standard filters response’s header list. [FETCH]
For the following script:
var client = new XMLHttpRequest();
client. open( "GET" , "narwhals-too.txt" , true );
client. send();
client. onreadystatechange = function () {
if ( this . readyState == this . HEADERS_RECEIVED) {
print( this . getAllResponseHeaders());
}
}
The print() function will get to process something
like:
connection: Keep-Alive
content-type: text/plain; charset=utf-8
date: Sun, 24 Oct 2004 04:58:38 GMT
keep-alive: timeout=15, max=99
server: Apache/1.3.31 (Unix)
transfer-encoding: chunked
4.6.6. Response body
The response MIME type is the result of running these steps:
-
Let mimeType be the result of extracting a MIME type from response’s header list.
-
If mimeType is failure, then set mimeType to
text/xml. -
Return mimeType.
The override MIME type is initially null and can get a value
when overrideMimeType() is invoked. The final MIME type is the override MIME type unless that is null in which case it is the response MIME type.
The final charset is the return value of these steps:
-
Let label be null.
-
If response MIME type’s parameters["
charset"] exists, then set label to it. -
If override MIME type’s parameters["
charset"] exists, then set label to it. -
If label is null, then return null.
-
Let encoding be the result of getting an encoding from label.
-
If encoding is failure, then return null.
-
Return encoding.
The above steps intentionally do not use the final MIME type as it would yield the wrong result.
An XMLHttpRequest object has an associated response object (an object, failure,
or null). Unless stated otherwise it is null.
An arraybuffer response is the return value of these steps:
-
Set response object to a new
ArrayBufferobject representing received bytes. If this throws an exception, then set response object to failure and return null.Allocating an
ArrayBufferobject is not guaranteed to succeed. [ECMASCRIPT] -
Return response object.
A blob response is the return value of these steps:
-
Set response object to a new
Blobobject representing received bytes withtypeset to the final MIME type. -
Return response object.
A document response is the return value of these steps:
-
If the final MIME type is not an HTML MIME type or an XML MIME type, then return null.
-
If
responseTypeis the empty string and the final MIME type is an HTML MIME type, then return null.This is restricted to
responseTypebeing "document" in order to prevent breaking legacy content. -
If the final MIME type is an HTML MIME type, then:
-
Let charset be the final charset.
-
If charset is null, prescan the first 1024 bytes of received bytes and if that does not terminate unsuccessfully then let charset be the return value.
-
If charset is null, then set charset to UTF-8.
-
Let document be a document that represents the result parsing received bytes following the rules set forth in the HTML Standard for an HTML parser with scripting disabled and a known definite encoding charset. [HTML]
-
Flag document as an HTML document.
-
-
Otherwise, let document be a document that represents the result of running the XML parser with XML scripting support disabled on received bytes. If that fails (unsupported character encoding, namespace well-formedness error, etc.), then return null. [HTML]
Resources referenced will not be loaded and no associated XSLT will be applied.
-
If charset is null, then set charset to UTF-8.
-
Set document’s encoding to charset.
-
Set document’s content type to the final MIME type.
-
Set document’s origin to context object’s relevant settings object’s origin.
-
Set response object to document and return it.
A JSON response is the return value of these steps:
-
Let jsonObject be the result of running parse JSON from bytes on received bytes. If that threw an exception, then return null.
-
Set response object to jsonObject and return it.
A text response is the return value of these steps:
-
Let charset be the final charset.
-
If
responseTypeis the empty string, charset is null, and the final MIME type is an XML MIME type, then use the rules set forth in the XML specifications to determine the encoding. Let charset be the determined encoding. [XML] [XMLNS]This is restricted to
responseTypebeing the empty string to keep the non-legacyresponseTypevalue "text" simple. -
If charset is null, then set charset to UTF-8.
-
Return the result of running decode on received bytes using fallback encoding charset.
Authors are strongly encouraged to always encode their resources using UTF-8.
4.6.7. The overrideMimeType() method
XMLHttpRequest/overrideMimeType
In all current engines.
OperaYesEdge79+
Edge (Legacy)12+IE11
Firefox for AndroidYesiOS SafariYesChrome for Android18+Android WebView1+Samsung Internet1.0+Opera MobileYes
client . overrideMimeType(mime)-
Acts as if the `
Content-Type` header value for response is mime. (It does not actually change the header though.)Throws an "
InvalidStateError"DOMExceptionif state is loading or done.
The overrideMimeType(mime) method,
when invoked, must run these steps:
-
If state is loading or done, then throw an "
InvalidStateError"DOMException. -
Set override MIME type to the result of parsing mime.
-
If override MIME type is failure, then set override MIME type to
application/octet-stream.
4.6.8. The responseType attribute
In all current engines.
Opera18+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android50+iOS Safari7+Chrome for Android55+Android WebView55+Samsung Internet6.0+Opera Mobile42+
client . responseType [ = value ]-
Returns the response type.
Can be set to change the response type. Values are: the empty string (default), "
arraybuffer", "blob", "document", "json", and "text".When set: setting to "
document" is ignored if current global object is not aWindowobject.When set: throws an "
InvalidStateError"DOMExceptionif state is loading or done.When set: throws an "
InvalidAccessError"DOMExceptionif the synchronous flag is set and current global object is aWindowobject.
The responseType attribute must return its value. Initially its value must be the empty
string.
Setting the responseType attribute must run these steps:
-
If current global object is not a
Windowobject and the given value is "document", terminate these steps. -
If state is loading or done, then throw an "
InvalidStateError"DOMException. -
If current global object is a
Windowobject and the synchronous flag is set, then throw an "InvalidAccessError"DOMException. -
Set the
responseTypeattribute’s value to the given value.
4.6.9. The response attribute
In all current engines.
Opera11.6+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android6+iOS Safari6+Chrome for Android18+Android WebView37+Samsung Internet1.0+Opera Mobile12+
The response attribute must return the result of running these
steps:
- If
responseTypeis the empty string or "text" -
-
If state is not loading or done, return the empty string.
-
Return the text response.
-
- Otherwise
-
-
If state is not done, return null.
-
If response object is failure, then return null.
-
If response object is non-null, then return it.
-
- If
responseTypeis "arraybuffer" -
Return the arraybuffer response.
- If
responseTypeis "blob" -
Return the blob response.
- If
responseTypeis "document" -
Return the document response.
- If
responseTypeis "json" -
Return the JSON response.
- If
-
4.6.10. The responseText attribute
In all current engines.
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android4+iOS Safari1+Chrome for Android18+Android WebView1+Samsung Internet1.0+Opera Mobile10.1+
client . responseText-
Returns the text response.
Throws an "
InvalidStateError"DOMExceptionifresponseTypeis not the empty string or "text".
The responseText attribute must return the result of running these
steps:
-
If
responseTypeis not the empty string or "text", then throw an "InvalidStateError"DOMException. -
If state is not loading or done, then return the empty string.
-
Return the text response.
4.6.11. The responseXML attribute
In all current engines.
OperaYesEdgeYes
Edge (Legacy)12+IEYes
Firefox for AndroidYesiOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes
client . responseXML-
Returns the document response.
Throws an "
InvalidStateError"DOMExceptionifresponseTypeis not the empty string or "document".
The responseXML attribute must return the result of running these steps:
-
If
responseTypeis not the empty string or "document", then throw an "InvalidStateError"DOMException. -
If state is not done, then return null.
-
Assert: response object is not failure.
-
If response object is non-null, then return it.
-
Return the document response.
4.7. Events summary
This section is non-normative.
The following events are dispatched on XMLHttpRequest or XMLHttpRequestUpload objects:
| Event name | Interface | Dispatched when… |
|---|---|---|
readystatechange
| Event
| The readyState attribute changes
value, except when it changes to UNSENT.
|
|
XMLHttpRequest/loadstart_event In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)NoneIE10+ Firefox for AndroidYesiOS Safari?Chrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes loadstart
| ProgressEvent
| The fetch initiates. |
|
In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)NoneIE10+ Firefox for AndroidYesiOS Safari?Chrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes progress
| ProgressEvent
| Transmitting data. |
|
In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)NoneIE10+ Firefox for AndroidYesiOS Safari?Chrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes abort
| ProgressEvent
| When the fetch has been aborted. For instance, by invoking the abort() method.
|
|
In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)NoneIE10+ Firefox for AndroidYesiOS Safari?Chrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes error
| ProgressEvent
| The fetch failed. |
|
In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)NoneIE9+ Firefox for AndroidYesiOS Safari?Chrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes load
| ProgressEvent
| The fetch succeeded. |
|
In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)18IE10+ Firefox for AndroidYesiOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes timeout
| ProgressEvent
| The author specified timeout has passed before the fetch completed. |
|
In all current engines.
FirefoxYesSafariYesChromeYes
OperaYesEdgeYes Edge (Legacy)NoneIE10+ Firefox for AndroidYesiOS Safari?Chrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes loadend
| ProgressEvent
| The fetch completed (success or failure). |
4.8. Permissions Policy integration
Headers/Feature-Policy/sync-xhr
In only one current engine.
Opera52+Edge79+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS SafariNoneChrome for Android65+Android WebView65+Samsung Internet9.0+Opera Mobile47+
This specification defines a policy-controlled feature identified by the string
"sync-xhr". Its default allowlist is *.
5. Interface FormData
In all current engines.
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android4+iOS Safari5+Chrome for Android18+Android WebView37+Samsung Internet1.0+Opera Mobile12+
typedef (File or USVString ); [FormDataEntryValue Exposed =(Window ,Worker )]interface {FormData constructor (optional HTMLFormElement );form void append (USVString ,name USVString );value void append (USVString ,name Blob ,blobValue optional USVString );filename void delete (USVString );name FormDataEntryValue ?get (USVString );name sequence <FormDataEntryValue >getAll (USVString );name boolean has (USVString );name void set (USVString ,name USVString );value void set (USVString ,name Blob ,blobValue optional USVString );filename iterable <USVString ,FormDataEntryValue >; };
Each FormData object has an associated entry list (a list of entries). It is initially the empty list.
An entry consists of a name and a value.
For the purposes of interaction with other algorithms, an entry’s filename is
the empty string if value is not a File object, and otherwise its
filename is the value of entry’s value’s name attribute.
To create an entry for name, value, and optionally a filename, run these steps:
-
Let entry be a new entry.
-
Set entry’s name to name.
-
If value is a
Blobobject and not aFileobject, then set value to a newFileobject, representing the same bytes, whosenameattribute value is "blob". -
If value is (now) a
Fileobject and filename is given, then set value to a newFileobject, representing the same bytes, whosenameattribute value is filename. -
Set entry’s value to value.
-
Return entry.
In all current engines.
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android4+iOS Safari5+Chrome for Android18+Android WebView37+Samsung Internet1.0+Opera Mobile12+
In all current engines.
Opera37+Edge79+
Edge (Legacy)18IENone
Firefox for Android44+iOS Safari11+Chrome for Android50+Android WebView50+Samsung Internet5.0+Opera Mobile37+
In all current engines.
OperaYesEdge79+
Edge (Legacy)18IENone
Firefox for Android44+iOS Safari11+Chrome for Android50+Android WebView50+Samsung Internet5.0+Opera Mobile?
In all current engines.
Opera37+Edge79+
Edge (Legacy)18IENone
Firefox for Android44+iOS Safari11+Chrome for Android50+Android WebView50+Samsung Internet5.0+Opera Mobile37+
The FormData(form) constructor must run these steps:
-
Let fd be a new
FormDataobject. -
If form is given, then:
-
Let list be the result of constructing the entry list for form.
-
If list is null, then throw an "
InvalidStateError"DOMException. -
Set fd’s entry list to list.
-
-
Return fd.
In all current engines.
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android4+iOS Safari5+Chrome for Android18+Android WebView3+Samsung Internet1.0+Opera Mobile12+
The append(name, value) and append(name, blobValue, filename) methods, when invoked, must run these steps:
-
Let value be value if given, and blobValue otherwise.
-
Let entry be the result of creating an entry with name, value, and filename if given.
-
Append entry to the context object’s entry list.
The reason there is an argument named value as well as blobValue is due to a limitation of the editing software used to write the XMLHttpRequest Standard.
In all current engines.
OperaYesEdge79+
Edge (Legacy)18IENone
Firefox for AndroidYesiOS SafariNoneChrome for Android50+Android WebView50+Samsung Internet5.0+Opera MobileYes
The delete(name) method, when invoked, must remove all entries whose name is name from the context object’s entry list.
In all current engines.
Opera37+Edge79+
Edge (Legacy)18IENone
Firefox for Android39+iOS Safari11+Chrome for Android50+Android WebView50+Samsung Internet5.0+Opera Mobile37+
The get(name) method,
when invoked, must return the value of the first entry whose name is name from the context object’s entry list, and null otherwise.
In all current engines.
Opera37+Edge79+
Edge (Legacy)18IENone
Firefox for Android39+iOS Safari11+Chrome for Android50+Android WebView50+Samsung Internet5.0+Opera Mobile37+
The getAll(name) method, when invoked, must return the values of all entries whose name is name, in order, from
the context object’s entry list, and the empty list otherwise.
In all current engines.
OperaYesEdge79+
Edge (Legacy)18IENone
Firefox for AndroidYesiOS SafariNoneChrome for Android50+Android WebView50+Samsung Internet5.0+Opera MobileYes
The has(name) method,
when invoked, must return true if there is an entry whose name is name in the context object’s entry list, and false otherwise.
In all current engines.
Opera37+Edge79+
Edge (Legacy)18IENone
Firefox for Android39+iOS Safari11+Chrome for Android50+Android WebView50+Samsung Internet5.0+Opera Mobile37+
The set(name, value) and set(name, blobValue, filename) methods, when invoked, must run these steps:
-
Let value be value if given, and blobValue otherwise.
-
Let entry be the result of creating an entry with name, value, and filename if given.
-
If there are any entries in the context object’s entry list whose name is name, then replace the first such entry with entry and remove the others.
-
Otherwise, append entry to the context object’s entry list.
The reason there is an argument named value as well as blobValue is due to a limitation of the editing software used to write the XMLHttpRequest Standard.
The value pairs to iterate over are the context object’s entry list’s entries with the key being the name and the value being the value.
6. Interface ProgressEvent
In all current engines.
OperaYesEdge79+
Edge (Legacy)12+IE10+
Firefox for Android4+iOS SafariYesChrome for AndroidYesAndroid WebView37+Samsung InternetYesOpera MobileYes
In all current engines.
OperaYesEdgeYes
Edge (Legacy)NoneIENone
Firefox for Android22+iOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes
[Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :ProgressEvent Event {(constructor DOMString ,type optional ProgressEventInit = {});eventInitDict readonly attribute boolean lengthComputable ;readonly attribute unsigned long long loaded ;readonly attribute unsigned long long total ; };dictionary :ProgressEventInit EventInit {boolean =lengthComputable false ;unsigned long long = 0;loaded unsigned long long = 0; };total
Events using the ProgressEvent interface indicate some kind of progression.
ProgressEvent/lengthComputable
In all current engines.
Opera37+Edge79+
Edge (Legacy)12+IEYes
Firefox for Android4+iOS Safari2+Chrome for Android50+Android WebView50+Samsung Internet5.0+Opera Mobile37+
In all current engines.
OperaYesEdgeYes
Edge (Legacy)12+IENone
Firefox for Android4+iOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes
In all current engines.
OperaYesEdgeYes
Edge (Legacy)12+IENone
Firefox for Android4+iOS SafariYesChrome for AndroidYesAndroid WebViewYesSamsung InternetYesOpera MobileYes
The lengthComputable, loaded, and total attributes must return the value they were initialized to.
6.1. Firing events using the ProgressEvent interface
To fire a progress event named e at target, given transmitted and length, means to fire an event named e at target, using ProgressEvent, with the loaded attribute initialized to transmitted, and if length is not 0, with the lengthComputable attribute initialized to true and the total attribute initialized to length.
6.2. Suggested names for events using the ProgressEvent interface
This section is non-normative.
The suggested type attribute values for use with events using the ProgressEvent interface are summarized in the table below.
Specification editors are free to tune the details to their specific
scenarios, though are strongly encouraged to discuss their usage with the
WHATWG community to ensure input from people familiar with the subject.
type attribute value
| Description | Times | When |
|---|---|---|---|
loadstart
| Progress has begun. | Once. | First. |
progress
| In progress. | Once or more. | After loadstart has been dispatched.
|
error
| Progression failed. | Zero or once (mutually exclusive). | After the last progress has
been dispatched.
|
abort
| Progression is terminated. | ||
timeout
| Progression is terminated due to preset time expiring. | ||
load
| Progression is successful. | ||
loadend
| Progress has stopped. | Once. | After one of error, abort, timeout or load has been dispatched.
|
The error, abort, timeout, and load event types are mutually exclusive.
Throughout the web platform the error, abort, timeout and load event types have
their bubbles and cancelable attributes initialized to false, so it is suggested that for consistency all events using the ProgressEvent interface do the same.
6.3. Security considerations
For cross-origin requests some kind of opt-in, e.g. the CORS protocol defined in the Fetch Standard, has to be
used before events using the ProgressEvent interface are dispatched as information (e.g. size) would be revealed that cannot be obtained
otherwise. [FETCH]
6.4. Example
In this example XMLHttpRequest, combined with concepts
defined in the sections before, and the HTML progress element are used together to
display the process of fetching a resource.
<!DOCTYPE html>
< title > Waiting for Magical Unicorns</ title >
< progress id = p ></ progress >
< script >
var progressBar = document. getElementById( "p" ),
client = new XMLHttpRequest()
client. open( "GET" , "magical-unicorns" )
client. onprogress = function ( pe) {
if ( pe. lengthComputable) {
progressBar. max = pe. total
progressBar. value = pe. loaded
}
}
client. onloadend = function ( pe) {
progressBar. value = pe. loaded
}
client. send()
</ script >
Fully working code would of course be more elaborate and deal with more scenarios, such as network errors or the end user terminating the request.
Acknowledgments
Thanks to Addison Phillips, Adrian Bateman, Ahmed Kamel, Alan Thomas, Alex Hopmann, Alex Vincent, Alexey Proskuryakov, Ali Alabbas, Andrea Marchesini, Asbjørn Ulsberg, Bertrand Guay-Paquet, Björn Höhrmann, Boris Zbarsky, Caitlin Potter, Cameron McCormack, 白丞祐 (Cheng-You Bai), Chris Marrin, Christophe Jolif, Charles McCathieNevile, Dan Winship, David Andersson, David Flanagan, David Håsäther, David Levin, Dean Jackson, Denis Sureau, Domenic Denicola, Dominik Röttsches, Doug Schepers, Douglas Livingstone, Elliott Sprehn, Elliotte Harold, Eric Lawrence, Eric Uhrhane, Erik Arvidsson, Erik Dahlström, Feras Moussa, Gideon Cohn, Glenn Adams, Gorm Haug Eriksen, Gregory Terzian, Håkon Wium Lie, Hallvord R. M. Steen, Henri Sivonen, Hiroshige Hayashizaki, Huub Schaeks, Ian Clelland, Ian Davis, Ian Hickson, Ivan Herman, Jake Archibald, Jared Jacobs, Jarred Nicholls, Jeff Walden, Jens Lindström, Jim Deegan, Jim Ley, Joe Farro, Jonas Sicking, Julian Reschke, 송정기 (Jungkee Song), 呂康豪 (Kang-Hao Lu), Karl Dubost, Keith Yeung, 田村健人 (Kent TAMURA), Lachlan Hunt, Maciej Stachowiak, Magnus Kristiansen, Manish Goregaokar, Marc Hadley, Marcos Caceres, Mark Baker, Mark Birbeck, Mark Nottingham, Mark S. Miller, Martin Hassman, Mike Pennisi, Mohamed Zergaoui, Ms2ger, Odin Hørthe Omdal, Olli Pettay, Pawel Glowacki, Peter Michaux, Philip Jägenstedt, Philip Taylor, Robin Berjon, Rune F. Halvorsen, Ruud Steltenpool, Ryo Onodera, Sam Sneddon, Sergiu Dumitriu, Shivakumar Jagalur Matt, Sigbjørn Finne, Simon Pieters, Stewart Brodie, Sunava Dutta, Takeshi Kurosawa, Takeshi Yoshino, Thomas Roessler, Thomas Wisniewski, Tom Magliery, Travis Leithead, triple-underscore, Yaron Tausky, Yehuda Katz, Youenn Fablet, and Zhenbin Xu for their contributions to this standard.
Special thanks to the Microsoft employees who first implemented the XMLHttpRequest interface, which was first widely deployed by the
Windows Internet Explorer browser.
Special thanks to Ian Hickson for drafting an initial version of this specification in the HTML Standard (then Web Applications 1.0). [HTML]
Special thanks to the W3C SVG WG for drafting the original ProgressEvent class as part of the SVG Micro DOM.
This standard is written by Anne van Kesteren (Mozilla, annevk@annevk.nl).
Intellectual property rights
Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). This work is licensed under a Creative Commons Attribution 4.0 International License. To the extent portions of it are incorporated into source code, such portions in the source code are licensed under the BSD 3-Clause License instead.