XMLHttpRequest

現行標準 — 最終更新

参加:
GitHub whatwg/xhr (新しい問題, オープンな問題)
Matrixでチャット
コミット:
GitHub whatwg/xhr/commits
このコミット時点のスナップショット
@xhrstandard
テスト:
web-platform-tests xhr/ (進行中の作業)
翻訳 (非規範的):
日本語
简体中文
한국어

概要

XMLHttpRequest標準は、クライアントとサーバー間でデータを転送するためのスクリプト化されたクライアント機能を提供するAPIを定義します。

1. 序論

このセクションは規範的ではありません。

XMLHttpRequest オブジェクトは、リソースを取得するためのAPIです。

XMLHttpRequest という名前は歴史的なものであり、その機能には関係ありません。

ネットワーク経由で取得したXMLドキュメントからデータを処理する簡単なコードの例です:

function processData(data) {
  // データの処理
}

function handler() {
  if(this.status == 200 &&
    this.responseXML != null &&
    this.responseXML.getElementById('test').textContent) {
    // 成功!
    processData(this.responseXML.getElementById('test').textContent);
  } else {
    // 何かがうまくいかなかった}
}

var client = new XMLHttpRequest();
client.onload = handler;
client.open("GET", "unicorn.xml");
client.send();

サーバーにメッセージを記録するだけの例:

function log(message) {
  var client = new XMLHttpRequest();
  client.open("POST", "/log");
  client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
  client.send(message);
}

サーバー上のドキュメントのステータスを確認する場合:

function fetchStatus(address) {
  var client = new XMLHttpRequest();
  client.onload = function() {
    // ネットワークエラーの場合、これは信頼できる結果を提供しない可能性があります
    returnStatus(this.status);
  }
  client.open("HEAD", address);
  client.send();
}

1.1. 仕様の歴史

XMLHttpRequest オブジェクトは、WHATWGのHTMLの取り組みの一環として最初に定義されました。(それ以前のMicrosoftの実装に基づくものです。) 2006年にW3Cに移行しました。XMLHttpRequest の拡張機能(例:進捗イベントやクロスオリジンリクエスト)は、2011年末まで 別のドラフト(XMLHttpRequest Level 2)で開発され、その後2つのドラフトが統合され、標準の観点からXMLHttpRequest は再び単一のエンティティになりました。2012年末にWHATWGに戻りました。

現在のドラフトにつながる議論は、以下のメーリングリストアーカイブで見つけることができます:

2. 用語

この仕様書はInfra Standardに依存しています。[INFRA]

この仕様書は、DOM、DOM Parsing and Serialization、Encoding、Fetch、File API、HTML、URL、Web IDL、およびXMLからの用語を使用します。

[DOM] [DOM-PARSING] [ENCODING] [FETCH] [FILEAPI] [HTML] [URL] [WEBIDL] [XML] [XML-NAMES]

3. インターフェース XMLHttpRequest

[Exposed=(Window,DedicatedWorker,SharedWorker)]
interface XMLHttpRequestEventTarget : EventTarget {
  // event handlers
  attribute 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 handler
  attribute EventHandler onreadystatechange;

  // states
  const 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;

  // request
  undefined open(ByteString method, USVString url);
  undefined open(ByteString method, USVString url, boolean async, optional USVString? username = null, optional USVString? password = null);
  undefined setRequestHeader(ByteString name, ByteString value);
           attribute unsigned long timeout;
           attribute boolean withCredentials;
  [SameObject] readonly attribute XMLHttpRequestUpload upload;
  undefined send(optional (Document or XMLHttpRequestBodyInit)? body = null);
  undefined abort();

  // response
  readonly attribute USVString responseURL;
  readonly attribute unsigned short status;
  readonly attribute ByteString statusText;
  ByteString? getResponseHeader(ByteString name);
  ByteString getAllResponseHeaders();
  undefined overrideMimeType(DOMString mime);
           attribute XMLHttpRequestResponseType responseType;
  readonly attribute any response;
  readonly attribute USVString responseText;
  [Exposed=Window] readonly attribute Document? responseXML;
};

XMLHttpRequest オブジェクトには次の関連付けがあります:

アップロードオブジェクト
XMLHttpRequestUpload オブジェクト。
状態
未送信オープンヘッダー受信済み読み込み中、および完了のいずれか;初期値は未送信
send() フラグ
フラグで、初期値は未設定。
タイムアウト
符号なし整数で、初期値は0。
クロスオリジン認証情報
ブール値で、初期値はfalse。
リクエストメソッド
メソッド
リクエストURL
URL
オーサーリクエストヘッダー
ヘッダーリストで、初期値は空。
リクエスト本文
初期値はnull。
同期フラグ
フラグで、初期値は未設定。
アップロード完了フラグ
フラグで、初期値は未設定。
アップロードリスナーフラグ
フラグで、初期値は未設定。
タイムアウトフラグ
フラグで、初期値は未設定。
レスポンス
レスポンスで、初期値はネットワークエラー
受信バイト
バイトシーケンスで、初期値は空のバイトシーケンス。
レスポンスタイプ
空文字列、"arraybuffer"、"blob"、"document"、"json"、および"text"のいずれか;初期値は空文字列。
レスポンスオブジェクト
オブジェクト、失敗、またはnullで、初期値はnull。
フェッチコントローラー
フェッチコントローラーで、初期値は新しいフェッチコントローラーsend() メソッドが有用な フェッチコントローラーに設定しますが、簡略化のため常に フェッチコントローラーを保持します。
MIMEタイプのオーバーライド
MIMEタイプまたはnull。初期値はnull。overrideMimeType() が呼び出されたときに値を取得できます。

3.1. コンストラクター

client = new XMLHttpRequest()
新しいXMLHttpRequest オブジェクトを返します。

new XMLHttpRequest() コンストラクターの手順は次の通りです:

  1. thisアップロードオブジェクト新しい XMLHttpRequestUploadオブジェクトに設定します。

3.2. ガベージコレクション

XMLHttpRequest オブジェクトは、その状態オープンsend()フラグが設定されている場合、 ヘッダー受信済み、または読み込み中であり、さらに イベントリスナーが1つ以上登録されており、そのタイプreadystatechangeprogressaborterrorloadtimeout、 および loadend のいずれかである場合、ガベージコレクションされてはなりません。

XMLHttpRequest オブジェクトが接続がまだ開いている状態でガベージコレクションされた場合、ユーザーエージェントは 終了しなければなりません。そのXMLHttpRequest オブジェクトの フェッチコントローラーを。

3.3. イベントハンドラー

次に挙げるものは、イベントハンドラー(およびそれに対応するイベントハンドラーイベントタイプ) であり、XMLHttpRequestEventTarget を継承するインターフェースを実装するオブジェクト上で属性としてサポートされなければなりません:

イベントハンドラー イベントハンドラーイベントタイプ
onloadstart loadstart
onprogress progress
onabort abort
onerror error
onload load
ontimeout timeout
onloadend loadend

次に挙げるものはイベントハンドラー(およびそれに対応するイベントハンドラーイベントタイプ)であり、XMLHttpRequest オブジェクトのみで属性としてサポートされなければなりません:

イベントハンドラー イベントハンドラーイベントタイプ
onreadystatechange readystatechange

3.4. 状態

client . readyState

client状態を返します。

readyStateゲッターの手順は、次の表で 第1列のセルの値がthis状態である行から第2列のセルの値を返すことです:

未送信 UNSENT(数値0) オブジェクトが構築されました。
オープン OPENED(数値1) open()メソッドが正常に呼び出されました。この状態では、 setRequestHeader()を使用してリクエストヘッダーを設定したり、 send()メソッドを使用してフェッチを開始することができます。
ヘッダー受信済み HEADERS_RECEIVED (数値2) 全てのリダイレクト(ある場合)が追跡され、レスポンスの全てのヘッダーが受信されました。
読み込み中 LOADING(数値3) レスポンスの本文が受信されています。
完了 DONE(数値4) データ転送が完了したか、転送中に何らかの問題(例:無限リダイレクト)が発生しました。

3.5. リクエスト

XMLHttpRequestUpload オブジェクトに1つ以上のイベントリスナーを登録すると、 CORSプリフライトリクエストが発生します。(これは、イベントリスナーを登録すると アップロードリスナーフラグが設定され、 use-CORSプリフライトフラグが設定されるためです。)

3.5.1. open() メソッド

client . open(method, url [, async = true [, username = null [, password = null]]])

リクエストメソッドリクエストURL、 および同期フラグを設定します。

methodが有効なメソッドでない場合、またはurlを解析できない場合、 "SyntaxError" DOMException をスローします。

methodが`CONNECT`、`TRACE`、または`TRACK`に 大文字小文字を区別せず一致する場合、 "SecurityError" DOMException をスローします。

asyncがfalseで、現在のグローバルオブジェクトWindow オブジェクトであり、 timeout 属性が0でない、またはresponseType 属性が空文字列でない場合、 "InvalidAccessError" DOMException をスローします。

ワーカー外での同期的XMLHttpRequest は、エンドユーザーの体験に悪影響を与えるため、ウェブプラットフォームから削除される過程にあります。(これは数年かかる長いプロセスです。)開発者は、 async引数にfalseを渡さないようにする必要があります。ユーザーエージェントはこのような使用法について開発者ツールで警告を出すことが強く推奨されており、 発生時に"InvalidAccessError" DOMException をスローする試みを行うことができます。

open(method, url) および open(method, url, async, username, password) メソッドの手順は以下の通りです:

  1. このthis関連するグローバルオブジェクトWindow オブジェクトであり、 関連付けられたDocument完全にアクティブでない場合、 以下をスローします: "InvalidStateError" DOMException

  2. methodメソッド でない場合、 以下をスローします: "SyntaxError" DOMException

  3. method禁止されたメソッド の場合、 以下をスローします: "SecurityError" DOMException

  4. メソッドを正規化します。

  5. parsedURLURLをエンコード・解析した結果とし、 それをthis関連設定オブジェクトに相対的なものとします。

  6. parsedURLが失敗した場合、 以下をスローします: "SyntaxError" DOMException

  7. async引数が省略された場合、asyncをtrueに設定し、 usernamepasswordをnullに設定します。

    残念ながら、レガシーコンテンツにより、async引数が undefinedであることと省略されたことを同一視することが妨げられています。

  8. parsedURLホスト がnullでない場合:

    1. username引数がnullでない場合、 ユーザー名を設定します。 parsedURLusernameを基にします。

    2. password引数がnullでない場合、 パスワードを設定します。 parsedURLpasswordを基にします。

  9. asyncがfalseで、 現在のグローバルオブジェクトWindow オブジェクトであり、 thisタイムアウトが0でない、またはthisレスポンスタイプ が空文字列でない場合、 以下をスローします: "InvalidAccessError" DOMException

  10. このfetch controllerを終了します。 thisfetch controller

    この時点でfetch が進行中である可能性があります。

  11. 以下のようにオブジェクトに関連付けられた変数を設定します:

    MIMEタイプのオーバーライドは、 overrideMimeType()メソッドがopen()メソッドの前に呼び出される可能性があるため、 ここではオーバーライドされません。

  12. this状態オープンでない場合:

    1. this状態オープンに設定します。

    2. イベントを発火します。 名前はreadystatechange。 対象はthis

2つのopen()メソッドが定義されている理由は、 XMLHttpRequest現行標準を書く際に使用された編集ソフトウェアの制限によるものです。

3.5.2. setRequestHeader() メソッド

client . setRequestHeader(name, value)

既存のリクエストヘッダーに値を追加するか、新しいリクエストヘッダーを追加します。

InvalidStateError DOMException をスローします。もしstateopenedでない場合、またはsend()フラグが設定されている場合。

SyntaxError DOMException をスローします。もしnameがヘッダー名でない場合、またはvalueがヘッダー値でない場合。

setRequestHeader(name, value) メソッドは以下の手順を実行しなければなりません:

  1. this状態オープンでない場合、 以下をスローします: "InvalidStateError" DOMException

  2. thissend()フラグ が設定されている場合、 以下をスローします: "InvalidStateError" DOMException

  3. 値を正規化します。

  4. nameヘッダー名でないか、valueヘッダー値でない場合、 以下をスローします: "SyntaxError" DOMException

    空のバイトシーケンスは空のヘッダー値 を表します。

  5. (name, value)が禁止されたリクエストヘッダーである場合、終了します。

  6. 結合 (name, value) をthisオーサーリクエストヘッダー に行います。

同じヘッダーを2回設定した場合に何が起こるかを示す簡単なコード例:

// 以下のスクリプト:
var client = new XMLHttpRequest();
client.open('GET', 'demo.cgi');
client.setRequestHeader('X-Test', 'one');
client.setRequestHeader('X-Test', 'two');
client.send();

// …次のヘッダーが送信されます:
// X-Test: one, two

3.5.3. timeout ゲッターおよびセッター

client . timeout

ミリ秒単位の時間を設定できます。0以外の値が設定された場合、指定された時間が経過すると フェッチ が終了します。時間が経過し、リクエストがまだ完了しておらず、this同期フラグ が未設定の場合、 timeout イベントが ディスパッチされます。それ以外の場合(send()メソッド向け)には、 "TimeoutError" DOMException がスローされます。

設定時:以下をスローします: "InvalidAccessError" DOMException もし 同期フラグ が設定されており、 現在のグローバルオブジェクトWindow オブジェクトである場合。

timeout ゲッターの手順は thistimeout を返します。

timeout セッターの手順は以下の通りです:

  1. 現在のグローバルオブジェクトWindow オブジェクトであり、this同期フラグ が設定されている場合、 以下をスローします: "InvalidAccessError" DOMException

  2. thistimeout を指定された値に設定します。

これは、timeout 属性がフェッチ 中に設定される可能性があることを意味します。その場合でも、フェッチの開始時点から測定されます。

3.5.4. withCredentials ゲッターおよびセッター

client . withCredentials

オリジン間リクエストに資格情報を含める場合はtrue。オリジン間リクエストにそれらを含めず、レスポンスのクッキーを無視する場合はfalse。 初期値はfalse。

設定時:InvalidStateError DOMException をスローします。stateunsentまたはopenedでない場合、もしくはsend()フラグが設定されている場合。

withCredentials ゲッターの手順は、 thisクロスオリジン認証情報 を返します。

withCredentials セッターの手順は以下の通りです:

  1. this状態未送信 または オープン でない場合、 以下をスローします: "InvalidStateError" DOMException

  2. thissend()フラグが 設定されている場合、 以下をスローします: "InvalidStateError" DOMException

  3. thisクロスオリジン認証情報を指定された値に設定します。

3.5.5. upload ゲッター

client . upload

関連付けられた XMLHttpRequestUpload オブジェクトを返します。これは、データがサーバーに転送される際の送信情報を収集するために使用できます。

upload ゲッターの手順は、 thisアップロードオブジェクト を返します。

3.5.6. send() メソッド

client . send([body = null])

リクエストを開始します。body引数はリクエストボディを提供します(ある場合)、 ただしリクエストメソッドGETまたはHEADの場合は無視されます。

InvalidStateError DOMException をスローします。stateopenedでないか、 またはsend()フラグが設定されている場合。

send(body) メソッドの手順は以下の通りです:

  1. このthis状態オープンでない場合、 以下をスローします: "InvalidStateError" DOMException

  2. このthissend()フラグが 設定されている場合、 以下をスローします: "InvalidStateError" DOMException

  3. このthisリクエストメソッド が`GET`または`HEAD`の場合、 bodyをnullに設定します。

  4. bodyがnullでない場合:

    1. extractedContentTypeをnullに設定します。

    2. bodyDocument の場合、 thisリクエスト本文bodyシリアライズ変換、およびUTF-8エンコード されたものに設定します。

    3. それ以外の場合:

      1. bodyWithType安全に抽出されたbody の結果とします。

      2. thisリクエスト本文bodyWithType本文に設定します。

      3. extractedContentTypebodyWithTypeタイプに設定します。

    4. originalAuthorContentType取得した結果とします。 `Content-Type` を thisオーサーリクエストヘッダーから。

    5. originalAuthorContentTypeがnullでない場合:

      1. bodyDocument またはUSVString の場合:

        1. contentTypeRecord解析された originalAuthorContentTypeの結果とします。

        2. contentTypeRecordが失敗でなく、 contentTypeRecordパラメーター["charset"] が存在し、 パラメーター["charset"]が "UTF-8"と ASCII大文字小文字を区別せず一致しない 場合:

          1. 設定 contentTypeRecordパラメーター["charset"] を"UTF-8"に。

          2. newContentTypeSerializedシリアライズ されたcontentTypeRecordの結果とします。

          3. 設定 (`Content-Type`, newContentTypeSerialized) を thisオーサーリクエストヘッダー に。

    6. それ以外の場合:

      1. bodyHTMLドキュメントの場合、 設定 (`Content-Type`, `text/html;charset=UTF-8`) を thisオーサーリクエストヘッダーに。

      2. それ以外の場合、bodyXML ドキュメントの場合、 設定 (`Content-Type`, `application/xml;charset=UTF-8`) を thisオーサーリクエストヘッダーに。

      3. それ以外の場合、extractedContentTypeがnullでない場合、 設定 (`Content-Type`, extractedContentType) を thisオーサーリクエストヘッダーに。

  5. もしthisアップロードオブジェクト に1つ以上のイベントリスナーが登録されている場合、 thisアップロードリスナーフラグ を設定します。

  6. reqを以下に示すように初期化された新しい リクエストとして設定します:

    メソッド
    thisリクエストメソッド
    URL
    thisリクエストURL
    ヘッダーリスト
    thisオーサーリクエストヘッダー
    安全でないリクエストフラグ
    設定する。
    本文
    thisリクエスト本文
    クライアント
    this関連設定オブジェクト
    モード
    "cors"。
    CORSプリフライトフラグ
    thisアップロードリスナーフラグ が設定されている場合に設定します。
    認証モード
    thisクロスオリジン認証情報 がtrueの場合 "include"、それ以外の場合 "same-origin"。
    URL認証情報フラグを使用
    thisリクエストURL認証情報を含む場合に設定します。
    イニシエータタイプ
    "xmlhttprequest"。
  7. thisアップロード完了フラグ を未設定にします。

  8. thisタイムアウトフラグ を未設定にします。

  9. もしreq本文 がnullの場合、 thisアップロード完了フラグ を設定します。

  10. thissend()フラグ を設定します。

  11. もしthis同期フラグ が未設定の場合:

    1. 進捗イベントを発火 します。名前はloadstart、 対象はthis、値は0と0。

    2. requestBodyTransmittedを0に設定します。

    3. requestBodyLengthreq本文長さに設定します。 もしreq本文 がnullでない場合、それ以外の場合は0に設定します。

    4. アサート:requestBodyLengthは整数である。

    5. もしthisアップロード完了フラグ が未設定で、thisアップロードリスナーフラグ が設定されている場合、 進捗イベントを発火 します。名前はloadstart、 対象はthisアップロードオブジェクト、 値はrequestBodyTransmittedrequestBodyLength

    6. もしthis状態オープンでないか、 thissend()フラグ が未設定の場合、終了します。

    7. processRequestBodyChunkLengthを、bytesLengthを指定して以下の手順として定義します:

      1. requestBodyTransmittedbytesLength分増加させます。

      2. これらの手順が最後に実行されてから約50msが経過していない場合、終了します。

      3. もしthisアップロードリスナーフラグ が設定されている場合、 進捗イベントを発火 します。名前はprogress、 対象はthisアップロードオブジェクト、 値はrequestBodyTransmittedrequestBodyLength

      これらの手順は新しいバイトが送信された場合にのみ実行されます。

    8. processRequestEndOfBodyを以下の手順として定義します:

      1. thisアップロード完了フラグ を設定します。

      2. もしthisアップロードリスナーフラグ が未設定の場合、終了します。

      3. 進捗イベントを発火 します。名前はprogress、 対象はthisアップロードオブジェクト、 値はrequestBodyTransmittedrequestBodyLength

      4. 進捗イベントを発火 します。名前はload、 対象はthisアップロードオブジェクト、 値はrequestBodyTransmittedrequestBodyLength

      5. 進捗イベントを発火 します。名前はloadend、 対象はthisアップロードオブジェクト、 値はrequestBodyTransmittedrequestBodyLength

    9. processResponseを以下の手順として定義します:

      1. thisレスポンスresponseに設定します。

      2. エラー処理this に対して実行します。

      3. もしthisレスポンスネットワークエラーの場合、終了します。

      4. this状態ヘッダー受信済みに設定します。

      5. イベントを発火 します。名前はreadystatechange、 対象はthis

      6. もしthis状態ヘッダー受信済みでない場合、終了します。

      7. もしthisレスポンス本文 がnullの場合、 レスポンス終端処理this に対して実行し、終了します。

      8. lengthを以下の手順で導出された結果として設定します: 長さを抽出 します。対象はthisレスポンスヘッダーリスト

      9. もしlengthが整数でない場合、0に設定します。

      10. processBodyChunkbytesを指定して以下の手順として定義します:

        1. bytesthis受信バイト に追加します。

        2. これらの手順が最後に実行されてから約50msが経過していない場合、終了します。

        3. もしthis状態ヘッダー受信済みの場合、 this状態読み込み中に設定します。

        4. イベントを発火 します。名前はreadystatechange、 対象はthis

          Web互換性のため、readystatechangethis状態 の変化よりも頻繁に発火されます。

        5. 進捗イベントを発火 します。名前はprogress、 対象はthis、 値はthis受信バイト長さlength

      11. processEndOfBodyを以下の手順として定義します: レスポンス終端処理this に対して実行します。

      12. processBodyErrorを以下の手順として定義します:

        1. thisレスポンスネットワークエラー に設定します。

        2. エラー処理this に対して実行します。

      13. レスポンスの本文を逐次読み取る を実行します。対象はthisレスポンス本文、 引数はprocessBodyChunkprocessEndOfBodyprocessBodyError、およびthis関連グローバルオブジェクト

    10. thisフェッチコントローラー を、reqフェッチした結果に設定します。 このとき、processRequestBodyChunkLengthprocessRequestBodyChunkLengthに、 processRequestEndOfBodyprocessRequestEndOfBodyに、 processResponseprocessResponseに設定します。

    11. nowを現在の時間に設定します。

    12. 以下の手順を並行して実行します:

      1. req完了フラグ が設定されるか、またはthisタイムアウト が0でなく、thisタイムアウト ミリ秒がnowから経過したか、いずれかを待機します。

      2. もしreq完了フラグ が未設定の場合、thisタイムアウトフラグ を設定し、終了します。 対象はthisフェッチコントローラー

  12. それ以外の場合、もしthis同期フラグが設定されている場合:

    1. processedResponseをfalseに設定します。

    2. processResponseConsumeBodyを以下の手順として定義します: responsenullOrFailureOrBytesを引数とします。

      1. もしnullOrFailureOrBytesが失敗でない場合、 thisレスポンスresponseに設定します。

      2. もしnullOrFailureOrBytesバイト列の場合、 nullOrFailureOrBytesthis受信バイト に追加します。

      3. processedResponseをtrueに設定します。

    3. thisフェッチコントローラー を、reqフェッチした結果に設定します。 このとき、processResponseConsumeBodyprocessResponseConsumeBodyに、 useParallelQueue をtrueに設定します。

    4. nowを現在の時間に設定します。

    5. 一時停止します。 条件はprocessedResponseがtrueになるか、 thisタイムアウトが0でなく、 thisタイムアウト ミリ秒がnowから経過するまで。

    6. もしprocessedResponseがfalseの場合、 thisタイムアウトフラグ を設定し、終了します。 対象はthisフェッチコントローラー

    7. タイミングを報告します。 対象はthisフェッチコントローラー、 および現在のグローバルオブジェクト

    8. レスポンス終端処理thisに対して実行します。

次の手順を実行して、XMLHttpRequest オブジェクト xhrレスポンス終端処理 を行います:

  1. xhr に対して エラー処理 を実行します。

  2. もし xhrレスポンスネットワークエラー の場合、終了します。

  3. transmittedxhr受信バイト長さ として設定します。

  4. length を次の手順で取得された値として設定します: 長さを抽出 します。対象は thisレスポンスヘッダーリスト

  5. もし length が整数でない場合、0 に設定します。

  6. もし xhr同期フラグ が未設定の場合、 進捗イベントを発火 します。 名前は progress、 対象は xhr、値は transmittedlength

  7. xhr状態完了 に設定します。

  8. xhrsend() フラグ を未設定にします。

  9. xhr に対して イベントを発火 します。 名前は readystatechange

  10. xhr に対して 進捗イベントを発火 します。 名前は load、 値は transmittedlength

  11. xhr に対して 進捗イベントを発火 します。 名前は loadend、 値は transmittedlength

エラーを処理するためには、 XMLHttpRequest オブジェクトxhrに対して、以下の手順を実行します:

  1. もし xhrsend() フラグ が未設定の場合、終了します。

  2. もし xhrタイムアウトフラグ が設定されている場合、 リクエストエラー手順 を実行します。 xhrtimeout、 および "TimeoutError" DOMException を対象にします。

  3. それ以外の場合、もし xhrレスポンス中断フラグ が設定されている場合、 リクエストエラー手順 を実行します。 xhrabort、 および "AbortError" DOMException を対象にします。

  4. それ以外の場合、もし xhrレスポンスネットワークエラー の場合、 リクエストエラー手順 を実行します。 xhrerror、 および "NetworkError" DOMException を対象にします。

次の手順を実行して XMLHttpRequest オブジェクト xhrevent、および必要に応じて exception に対して リクエストエラー手順 を行います:

  1. xhr状態完了 に設定します。

  2. xhrsend() フラグ を未設定にします。

  3. xhrレスポンスネットワークエラー に設定します。

  4. もし xhr同期フラグ が設定されている場合、 例外をスロー します。 exception

  5. xhr に対して イベントを発火 します。 名前は readystatechange

    この時点で xhr同期フラグ が未設定であることが明らかです。

  6. もし xhrアップロード完了フラグ が未設定の場合:

    1. xhrアップロード完了フラグ を設定します。

    2. もし xhrアップロードリスナーフラグ が設定されている場合:

      1. xhrアップロードオブジェクト に対して 進捗イベントを発火 します。名前は event、値は 0 と 0。

      2. xhrアップロードオブジェクト に対して 進捗イベントを発火 します。名前は loadend、値は 0 と 0。

  7. xhr に対して 進捗イベントを発火 します。 名前は event、値は 0 と 0。

  8. xhr に対して 進捗イベントを発火 します。 名前は loadend、値は 0 と 0。

3.5.7. abort() メソッド

client . abort()
ネットワーク処理をキャンセルします。

abort() メソッドの手順は次の通りです:

  1. 中止します。 対象はthisフェッチコントローラー

  2. もしthis状態オープンで、 thissend()フラグ が設定されている場合、またはヘッダー受信済みもしくは読み込み中の場合、 リクエストエラー手順 を実行します。対象はthisabort

  3. もしthis状態完了の場合、 this状態未送信に設定し、thisレスポンスネットワークエラーに設定します。

    この時、readystatechangeイベントはディスパッチされません。

3.6. レスポンス

3.6.1. responseURL ゲッター

responseURL ゲッターの手順は次の通りです: thisレスポンスURL がnullの場合、空文字列を返します。それ以外の場合、フラグメントを除外した シリアライズされた値を返します。

3.6.2. status ゲッター

status ゲッターの手順は次の通りです: thisレスポンスステータスを返します。

3.6.3. statusText ゲッター

statusText ゲッターの手順は次の通りです: thisレスポンスステータスメッセージを返します。

3.6.4. getResponseHeader() メソッド

getResponseHeader(name) メソッドの手順は次の通りです: 取得したnameの結果を返します。 対象はthisレスポンスヘッダーリスト

Fetch 現行標準はthisレスポンスヘッダーリストをフィルタリングします。 [FETCH]

次のスクリプトの場合:

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

print()関数は次のような内容を処理します:

text/plain; charset=UTF-8

3.6.5. getAllResponseHeaders() メソッド

バイト列 a は、次の手順が true を返す場合、レガシー大文字バイト未満バイト列 bです:

  1. Aa大文字化したものとします。

  2. Bb大文字化したものとします。

  3. Aバイト未満 B である場合、true を返します。

getAllResponseHeaders() メソッドの手順は次の通りです:

  1. output を空のバイト列として設定します。

  2. initialHeaders を、次のソートおよび結合の結果として設定します。 対象はthisレスポンスヘッダーリスト

  3. headers を、昇順にソートした initialHeaders の結果として設定します。 このとき、ab より小さい場合、 a名前レガシー大文字バイト未満であるとします。

    残念ながら、これは展開済みのコンテンツとの互換性のために必要です。

  4. header について、 header名前に続けて 0x3A 0x20 バイトペアを追加し、 headerに続けて 0x0D 0x0A バイトペアを追加し、 output に追加します。

  5. output を返します。

Fetch 現行標準はthisレスポンスヘッダーリストをフィルタリングします。 [FETCH]

次のスクリプトの場合:

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

print()関数は次のような内容を処理します:

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

3.6.6. レスポンス本文

XMLHttpRequest オブジェクト xhr に対して レスポンス MIME タイプを取得 するには、次の手順を実行します:

  1. mimeType を、xhrレスポンスヘッダーリストから MIME タイプを抽出した結果として設定します。

  2. もし mimeType が失敗の場合、mimeTypetext/xml に設定します。

  3. mimeType を返します。

XMLHttpRequest オブジェクト xhr に対して 最終的な MIME タイプを取得 するには、次の手順を実行します:

  1. もし xhroverride MIME タイプ が null の場合、 xhr に対して レスポンス MIME タイプを取得 の結果を返します。

  2. xhroverride MIME タイプ を返します。

XMLHttpRequest オブジェクト xhr に対して 最終的なエンコーディングを取得 するには、次の手順を実行します:

  1. label を null に設定します。

  2. responseMIMExhr に対して レスポンス MIME タイプを取得した結果として設定します。

  3. もし responseMIMEパラメーター["charset"] が存在する場合、label をそれに設定します。

  4. もし xhroverride MIME タイプパラメーター["charset"] が存在する場合、label をそれに設定します。

  5. もし label が null の場合、null を返します。

  6. encodinglabel から エンコーディングを取得した結果として設定します。

  7. もし encoding が失敗の場合、null を返します。

  8. encoding を返します。

上記の手順は、最終的な MIME タイプを取得 を使用しないように意図的に設計されています。これはウェブ互換性のためです。


ドキュメントレスポンスを設定するためには、XMLHttpRequest オブジェクト xhr に対して、次の手順を実行します。

  1. xhrresponsebody が null の場合は、 処理を終了します。

  2. finalMIME を、xhr に対して 最終的な MIME タイプを取得する 結果とします。

  3. finalMIMEHTML MIME タイプ または XML MIME タイプ でない場合は、処理を終了します。

  4. xhrresponse type が空文字列であり、かつ finalMIMEHTML MIME タイプ である場合は、処理を終了します。

    これは、レガシーコンテンツの破壊を防ぐために、xhrresponse type が "document" に限定されています。

  5. finalMIMEHTML MIME タイプ である場合:

    1. charset を、xhr に対する 最終的なエンコーディングを取得する 結果とします。

    2. charset が null の場合は、 バイトストリームの最初の1024バイトを事前スキャン し、それが失敗しなければ charset をその戻り値に設定します。

    3. charset が null の場合は、charsetUTF-8 に設定します。

    4. document を、xhr受信バイト を HTML Standard の HTML パーサーの規則に従い、 スクリプトを無効にした状態で、既知の確定エンコーディング charset を用いて解析した結果を表す ドキュメント とします。 [HTML]

    5. documentHTML ドキュメント としてフラグ付けします。

  6. そうでない場合、documentxhr受信バイト に対して、XML パーサーXML スクリプトサポートを無効にした状態で 実行した結果を表す ドキュメント とします。それが失敗(未対応の文字エンコーディング、名前空間の整形式エラーなど)した場合、null を返します。 [HTML]

    参照されるリソースは読み込まれず、関連する XSLT は適用されません。

  7. charset が null の場合は、charsetUTF-8 に設定します。

  8. documentエンコーディングcharset に設定します。

  9. documentコンテンツタイプfinalMIME に設定します。

  10. documentURLxhrresponseURL に設定します。

  11. documentオリジンxhr関連する設定オブジェクトオリジン に設定します。

  12. xhrresponse objectdocument に設定します。

テキストレスポンスを取得するためには、 XMLHttpRequest オブジェクト xhr に対して、次の手順を実行します。

  1. xhrresponsebody が null の場合は、 空文字列を返します。

  2. charset を、xhr に対する 最終的なエンコーディングを取得する 結果とします。

  3. xhrresponse type が空文字列であり、charset が null であり、 かつ xhr に対して 最終的な MIME タイプを取得する 結果が XML MIME タイプ である場合は、 XML 仕様に記載された規則を使用してエンコーディングを決定します。charset をその決定されたエンコーディングとします。 [XML] [XML-NAMES]

    これは、非レガシーな response type 値 "text" を簡潔に保つために、 xhrresponse type を空文字列に限定しています。

  4. charset が null の場合は、charsetUTF-8 に設定します。

  5. xhr受信バイトデコード し、 フォールバックエンコーディングを charset として、その結果を返します。

作成者は、常にリソースを UTF-8 を使用してエンコードすることを強く推奨します。

3.6.7. overrideMimeType() メソッド

client . overrideMimeType(mime)

レスポンスの `Content-Type` ヘッダー値が mime であるかのように振る舞います。(ヘッダー自体は変更されません。)

loading または done 状態のときに、"InvalidStateError" DOMException をスローします。

overrideMimeType(mime) メソッドの手順は以下の通りです:

  1. thisstateloading または done の場合、スロー します: "InvalidStateError" DOMException

  2. thisoverride MIME typeパース した mime の結果に設定します。

  3. thisoverride MIME type が失敗した場合、thisoverride MIME typeapplication/octet-stream に設定します。

3.6.8. responseType ゲッターおよびセッター

client . responseType [ = value ]

レスポンスタイプを返します。

レスポンスタイプを変更するために設定できます。値は次の通りです: 空文字列 (デフォルト), "arraybuffer", "blob", "document", "json", および "text"。

設定時: 現在のグローバルオブジェクトWindow オブジェクトでない場合、"document" に設定することは無視されます。

設定時: loading または done 状態のときに、"InvalidStateError" DOMException をスローします。

設定時: 同期フラグ が設定されており、かつ 現在のグローバルオブジェクトWindow オブジェクトである場合、"InvalidAccessError" DOMException をスローします。

responseType ゲッターの手順は、thisresponse type を返すことです。

responseType セッターの手順は以下の通りです:

  1. 現在のグローバルオブジェクトWindow オブジェクトでなく、かつ与えられた値が "document" の場合、処理を終了します。

  2. thisstateloading または done の場合、スロー します: "InvalidStateError" DOMException

  3. 現在のグローバルオブジェクトWindow オブジェクトであり、かつ this同期フラグ が設定されている場合、スロー します: "InvalidAccessError" DOMException

  4. thisresponse type を与えられた値に設定します。

3.6.9. response ゲッター

client . response

レスポンスボディを返します。

response ゲッターの手順は以下の通りです:

  1. thisresponse type が空文字列または "text" の場合:

    1. thisstateloading または done でない場合、空文字列を返します。

    2. this に対して テキストレスポンスを取得する の結果を返します。

  2. thisstatedone でない場合、null を返します。

  3. thisresponse object が失敗の場合、null を返します。

  4. thisresponse object が null でない場合、それを返します。

  5. thisresponse type が "arraybuffer" の場合、 thisresponse object新しい ArrayBuffer オブジェクト (これは this受信バイト を表します) に設定します。例外がスローされた場合、thisresponse object を失敗に設定し、null を返します。

    ArrayBuffer オブジェクトの割り当てが必ず成功するとは限りません。[ECMASCRIPT]

  6. それ以外の場合、thisresponse type が "blob" の場合、 thisresponse object新しい Blob オブジェクト (これは this受信バイト を表し、 type最終的な MIME タイプを取得する の結果に設定します) に設定します。

  7. それ以外の場合、thisresponse type が "document" の場合、 ドキュメントレスポンスを設定するthis に対して実行します。

  8. それ以外の場合:

    1. アサート: thisresponse type が "json" であること。

    2. thisresponsebody が null の場合、null を返します。

    3. jsonObject を、JSON をバイトから JavaScript 値にパースするthis受信バイト に対して実行した結果に設定します。例外がスローされた場合、null を返します。

    4. thisresponse objectjsonObject に設定します。

  9. thisresponse object を返します。

3.6.10. responseText ゲッター

client . responseText

レスポンスをテキストとして返します。

InvalidStateError" DOMException をスローします。 responseType が空文字列または "text" でない場合。

responseText ゲッターの手順は以下の通りです:

  1. thisresponse type が空文字列または "text" でない場合、 スロー します: "InvalidStateError" DOMException

  2. thisstateloading または done でない場合、 空文字列を返します。

  3. テキストレスポンスを取得する の結果を this に対して返します。

3.6.11. responseXML ゲッター

client . responseXML

レスポンスをドキュメントとして返します。

InvalidStateError" DOMException をスローします。 responseType が空文字列または "document" でない場合。

responseXML ゲッターの手順は以下の通りです:

  1. thisresponse type が空文字列または "document" でない場合、 スロー します: "InvalidStateError" DOMException

  2. thisstatedone でない場合、null を返します。

  3. アサート: thisresponse object が失敗でないこと。

  4. thisresponse object が null でない場合、それを返します。

  5. ドキュメントレスポンスを設定するthis に対して実行します。

  6. thisresponse object を返します。

3.7. イベント概要

このセクションは規範的ではありません。

次のイベントが XMLHttpRequest または XMLHttpRequestUpload オブジェクト上でディスパッチされます:

イベント名 インターフェース ディスパッチされるタイミング…
readystatechange Event readyState 属性が値を変更したとき。ただし、UNSENT に変更される場合を除く。
loadstart ProgressEvent フェッチが開始されたとき。
progress ProgressEvent データを送信中。
abort ProgressEvent フェッチが中止されたとき。例えば、abort() メソッドを呼び出した場合。
error ProgressEvent フェッチが失敗したとき。
load ProgressEvent フェッチが成功したとき。
timeout ProgressEvent フェッチが完了する前に、著者が指定したタイムアウトが経過したとき。
loadend ProgressEvent フェッチが完了したとき(成功または失敗)。

4. インターフェース FormData

typedef (File or USVString) FormDataEntryValue;

[Exposed=(Window,Worker)]
interface FormData {
  constructor(optional HTMLFormElement form, optional HTMLElement? submitter = null);

  undefined append(USVString name, USVString value);
  undefined append(USVString name, Blob blobValue, optional USVString filename);
  undefined delete(USVString name);
  FormDataEntryValue? get(USVString name);
  sequence<FormDataEntryValue> getAll(USVString name);
  boolean has(USVString name);
  undefined set(USVString name, USVString value);
  undefined set(USVString name, Blob blobValue, optional USVString filename);
  iterable<USVString, FormDataEntryValue>;
};

FormData オブジェクトには関連付けられた エントリリストエントリリスト)が存在します。それは初期状態では空です。

このセクションでは以前、 エントリ、エントリの 名前および 、そして エントリを作成するアルゴリズムを定義していました。これらの定義は HTML標準に移動されました。[HTML]

new FormData(form, submitter) コンストラクタの手順は以下の通りです:

  1. formが指定された場合、以下を実行します:

    1. submitterがnullではない場合、以下を実行します:

      1. submitter送信ボタンでない場合、例外をスローします。 TypeError

      2. submitterフォーム所有者formでない場合、例外をスローします。 "NotFoundError" DOMException

    2. listを、エントリリストを構築する結果として formsubmitterを用いて取得します。

    3. listがnullの場合、例外をスローします。 "InvalidStateError" DOMException

    4. thisエントリリストlistに設定します。

append(name, value) メソッドと append(name, blobValue, filename) メソッドの手順は以下の通りです:

  1. valueを、指定された場合はvalue、それ以外の場合はblobValueとします。

  2. entryエントリを作成するの結果として namevalue、および指定された場合はfilenameを用いて取得します。

  3. 追加しますentrythisエントリリストに。

valueおよびblobValueという名前の引数がある理由は、 XMLHttpRequest標準を作成するために使用された編集ソフトウェアの制限によるものです。

delete(name) メソッドの手順は、削除することです。すべてのエントリ名前nameであるものを、thisエントリリストから。

get(name) メソッド の手順は以下の通りです:

  1. エントリが存在しない場合、 名前nameであるものが、thisエントリリストに含まれていない場合、nullを返します。

  2. 最初のを返します。それはエントリ の中で、名前nameであるものから、thisエントリリスト内で。

getAll(name) メソッドの手順は以下の通りです:

  1. エントリが存在しない場合、 名前nameであるものが、thisエントリリストに含まれていない場合、空のリストを返します。

  2. すべてのを返します。それはエントリ の中で、名前nameであるものから順に、 thisエントリリスト内で。

has(name) メソッドの手順は、 エントリが存在する場合、名前nameであるものがthisエントリリストに含まれていればtrueを返し、それ以外の場合はfalseを返します。

set(name, value) および set(name, blobValue, filename) メソッドの手順は以下の通りです:

  1. valueを、指定された場合はvalue、それ以外の場合はblobValueとします。

  2. entryエントリを作成するの結果として namevalue、および指定された場合はfilenameを用いて取得します。

  3. エントリが存在する場合、thisエントリリスト内で 名前nameである最初のエントリを entry置き換え、 その他のエントリを削除します。

  4. それ以外の場合、追加しますentrythisエントリリストに。

valueおよびblobValueという名前の引数がある理由は、 XMLHttpRequest標準を作成するために使用された編集ソフトウェアの制限によるものです。

反復するキーと値のペアは、 thisエントリリストに含まれる エントリで構成されます。キーは 名前であり、 値はです。

5. インターフェース ProgressEvent

[Exposed=(Window,Worker)]
interface ProgressEvent : Event {
  constructor(DOMString type, optional ProgressEventInit eventInitDict = {});

  readonly attribute boolean lengthComputable;
  readonly attribute double loaded;
  readonly attribute double total;
};

dictionary ProgressEventInit : EventInit {
  boolean lengthComputable = false;
  double loaded = 0;
  double total = 0;
};

イベントProgressEvent インターフェースを使用して、進行状況を示します。

lengthComputableloaded、 および total のゲッターステップは、それらが初期化された値を返すことです。

5.1. ProgressEvent インターフェースを使用してイベントを発火する

進行イベントを発火するには、 eという名前のイベントをtargetで発火することを意味します。transmittedlengthを指定して、ProgressEventを使用し、 loaded 属性をtransmittedに初期化し、lengthが0でない場合、 lengthComputable 属性をtrueに初期化し、 total 属性をlengthに初期化します。

5.2. ProgressEvent インターフェースを使用するイベントの推奨される名前

このセクションは非規範的です。

イベントProgressEvent インターフェースを使用する場合の推奨されるtype 属性値は以下の表にまとめられています。 仕様の編集者は、具体的なシナリオに合わせて詳細を調整する自由がありますが、 この分野に詳しい人々からの意見を得るため、WHATWGコミュニティと議論することを強く推奨します。

type 属性値 説明 回数 タイミング
loadstart 進行が開始された。 1回。 最初に。
progress 進行中。 1回以上。 loadstartディスパッチされた後。
error 進行に失敗した。 0回または1回(相互排他)。 progressの最後が ディスパッチされた後。
abort 進行が終了された。
timeout 設定された時間切れにより進行が終了した。
load 進行が成功した。
loadend 進行が停止した。 1回。 erroraborttimeout、またはloadディスパッチされた後。

erroraborttimeout、 およびloadイベントタイプは相互排他です。

ウェブプラットフォーム全体でerroraborttimeout、およびloadイベントタイプは、 bubbles およびcancelable 属性をfalseに初期化しているため、一貫性を保つために、 イベントProgressEvent インターフェースを使用する場合も同様にすることを推奨します。

5.3. セキュリティの考慮事項

オリジン間リクエストでは、例えばFetch標準で定義されている CORSプロトコル のようなオプトインが使用されなければなりません。 それにより、イベントProgressEvent インターフェースを使用して ディスパッチ される際に、通常は得られない情報(例: サイズ)が明らかになる可能性があるためです。 [FETCH]

5.4.

この例では、XMLHttpRequest と以前のセクションで定義された概念、 さらにHTMLの progress 要素を組み合わせて使用し、リソースを フェッチ するプロセスを表示します。

<!DOCTYPE html>
<title>マジカルユニコーンを待っています</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>

完全な動作コードは、もちろんより詳細で、ネットワークエラーやエンドユーザーによるリクエストの終了など、さらに多くのシナリオに対応する必要があります。

謝辞

次の方々に感謝します: 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、 Chirag S Kumar、 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、 Noam Rosenthal、 Odin Hørthe Omdal、 Olli Pettay、 Pawel Glowacki、 Peter Michaux、 Philip Jägenstedt、 Philip Taylor、 Rashika Jaggi、 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、 そしてZhenbin Xu。 この標準への貢献に感謝します。

特に、最初にXMLHttpRequest インターフェースを実装したMicrosoftの社員の皆様に感謝します。このインターフェースは最初にWindows Internet Explorerブラウザで広く展開されました。

Ian Hickson氏に特に感謝します。同氏がHTML標準(当時はWeb Applications 1.0)でこの仕様の初期バージョンを起草しました。[HTML]

W3C SVG WGに特に感謝します。同グループがProgressEvent クラスをSVG Micro DOMの一部として初めて起草しました。SVG Micro DOMを参照。

この標準は、 Anne van Kesteren氏(Appleannevk@annevk.nl)によって執筆されました。

知的財産権

Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。この作品はCreative Commons Attribution 4.0 International Licenseの下でライセンスされています。この中の一部がソースコードに取り込まれている場合、その部分はBSD 3-Clause Licenseの下でライセンスされます。

これは現行標準です。特許審査バージョンに興味がある方は現行標準レビュードラフトをご覧ください。

索引

この仕様で定義されている用語

参照で定義されている用語

参考文献

規範参照

[DOM]
Anne van Kesteren. DOM Standard. 現行標準. URL: https://dom.spec.whatwg.org/
[DOM-PARSING]
Travis Leithead. DOM Parsing and Serialization. URL: https://w3c.github.io/DOM-Parsing/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. 現行標準. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. 現行標準. URL: https://fetch.spec.whatwg.org/
[FILEAPI]
Marijn Kruisselbrink. File API. URL: https://w3c.github.io/FileAPI/
[HTML]
Anne van Kesteren; et al. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. URL: https://infra.spec.whatwg.org/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing Standard. 現行標準. URL: https://mimesniff.spec.whatwg.org/
[URL]
Anne van Kesteren. URL Standard. 現行標準. URL: https://url.spec.whatwg.org/
[WEBDRIVER-BIDI]
James Graham; Alex Rudenko; Maksim Sadym. WebDriver BiDi. URL: https://w3c.github.io/webdriver-bidi/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 現行標準. URL: https://webidl.spec.whatwg.org/
[XML]
Tim Bray; et al. Extensible Markup Language (XML) 1.0 (Fifth Edition). 2008年11月26日. REC. URL: https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray; et al. Namespaces in XML 1.0 (Third Edition). 2009年12月8日. REC. URL: https://www.w3.org/TR/xml-names/

IDL索引

[Exposed=(Window,DedicatedWorker,SharedWorker)]
interface XMLHttpRequestEventTarget : EventTarget {
  // event handlers
  attribute 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 handler
  attribute EventHandler onreadystatechange;

  // states
  const 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;

  // request
  undefined open(ByteString method, USVString url);
  undefined open(ByteString method, USVString url, boolean async, optional USVString? username = null, optional USVString? password = null);
  undefined setRequestHeader(ByteString name, ByteString value);
           attribute unsigned long timeout;
           attribute boolean withCredentials;
  [SameObject] readonly attribute XMLHttpRequestUpload upload;
  undefined send(optional (Document or XMLHttpRequestBodyInit)? body = null);
  undefined abort();

  // response
  readonly attribute USVString responseURL;
  readonly attribute unsigned short status;
  readonly attribute ByteString statusText;
  ByteString? getResponseHeader(ByteString name);
  ByteString getAllResponseHeaders();
  undefined overrideMimeType(DOMString mime);
           attribute XMLHttpRequestResponseType responseType;
  readonly attribute any response;
  readonly attribute USVString responseText;
  [Exposed=Window] readonly attribute Document? responseXML;
};

typedef (File or USVString) FormDataEntryValue;

[Exposed=(Window,Worker)]
interface FormData {
  constructor(optional HTMLFormElement form, optional HTMLElement? submitter = null);

  undefined append(USVString name, USVString value);
  undefined append(USVString name, Blob blobValue, optional USVString filename);
  undefined delete(USVString name);
  FormDataEntryValue? get(USVString name);
  sequence<FormDataEntryValue> getAll(USVString name);
  boolean has(USVString name);
  undefined set(USVString name, USVString value);
  undefined set(USVString name, Blob blobValue, optional USVString filename);
  iterable<USVString, FormDataEntryValue>;
};

[Exposed=(Window,Worker)]
interface ProgressEvent : Event {
  constructor(DOMString type, optional ProgressEventInit eventInitDict = {});

  readonly attribute boolean lengthComputable;
  readonly attribute double loaded;
  readonly attribute double total;
};

dictionary ProgressEventInit : EventInit {
  boolean lengthComputable = false;
  double loaded = 0;
  double total = 0;
};

MDN

FormData/FormData

In all current engines.

Firefox4+Safari5+Chrome5+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
MDN

FormData/append

In all current engines.

Firefox4+Safari5+Chrome5+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
MDN

FormData/delete

In all current engines.

Firefox39+Safari11.1+Chrome50+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FormData/get

In all current engines.

Firefox39+Safari11.1+Chrome50+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FormData/getAll

In all current engines.

Firefox39+Safari11.1+Chrome50+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FormData/has

In all current engines.

Firefox39+Safari11.1+Chrome50+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FormData/set

In all current engines.

Firefox39+Safari11.1+Chrome50+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

FormData

In all current engines.

Firefox4+Safari5+Chrome5+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari5+Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
Node.js18.0.0+
MDN

ProgressEvent/ProgressEvent

In all current engines.

Firefox18+Safari6+Chrome16+
Opera12.1+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

ProgressEvent/lengthComputable

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

ProgressEvent/loaded

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

ProgressEvent/total

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

ProgressEvent

In all current engines.

Firefox3.5+Safari3.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/XMLHttpRequest

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/abort

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/abort_event

In all current engines.

Firefox3.5+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/abort_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/abort_event

In all current engines.

Firefox3.5+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/abort_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/error_event

In all current engines.

Firefox1+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/error_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/error_event

In all current engines.

Firefox1+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/error_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/getAllResponseHeaders

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/getResponseHeader

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/load_event

In all current engines.

Firefox1+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/load_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/load_event

In all current engines.

Firefox1+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/load_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/loadend_event

In all current engines.

Firefox5+Safari4+Chrome18+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/loadend_event

In all current engines.

Firefox5+Safari4+Chrome18+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/loadend_event

In all current engines.

Firefox5+Safari4+Chrome18+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/loadend_event

In all current engines.

Firefox5+Safari4+Chrome18+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/loadstart_event

In all current engines.

Firefox3.5+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/loadstart_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/loadstart_event

In all current engines.

Firefox3.5+Safari1.3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/loadstart_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/open

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/overrideMimeType

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE11
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/progress_event

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/progress_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/progress_event

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+

XMLHttpRequestUpload/progress_event

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/readyState

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/readystatechange_event

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/readystatechange_event

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera9+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/response

In all current engines.

Firefox6+Safari5.1+Chrome9+
Opera11.6+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
MDN

XMLHttpRequest/responseText

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/responseType

In all current engines.

Firefox6+Safari5.1+Chrome31+
Opera18+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android50+iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile18+
MDN

XMLHttpRequest/responseURL

In all current engines.

Firefox32+Safari8+Chrome37+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

XMLHttpRequest/responseXML

In all current engines.

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android?iOS Safari1+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/send

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/setRequestHeader

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE5+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/status

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequest/statusText

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/timeout

In all current engines.

Firefox12+Safari7+Chrome29+
Opera17+Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile18+
MDN

XMLHttpRequest/timeout_event

In all current engines.

Firefox12+Safari7+Chrome29+
Opera?Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?

XMLHttpRequestUpload/timeout_event

In all current engines.

Firefox12+Safari7+Chrome29+
Opera?Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?
MDN

XMLHttpRequest/timeout_event

In all current engines.

Firefox12+Safari7+Chrome29+
Opera?Edge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?

XMLHttpRequestUpload/timeout_event

In all current engines.

Firefox12+Safari7+Chrome29+
Opera?Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet1.0+Opera Mobile?
MDN

XMLHttpRequest/upload

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequest/withCredentials

In all current engines.

Firefox3.5+Safari4+Chrome3+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12+
MDN

XMLHttpRequest

In all current engines.

Firefox1+Safari1.2+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile10.1+
MDN

XMLHttpRequestEventTarget

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE7+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

XMLHttpRequestUpload

In all current engines.

Firefox3.5+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari3+Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+