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() 呼び出し済み
boolean。初期値は false。
タイムアウト
符号なし整数。初期値は 0。
オリジン間 資格情報
boolean。初期値は false。
要求メソッド
メソッド
要求 URL
URL
作者要求 ヘッダー
ヘッダーリスト。初期状態では空。
要求本体
初期値は null。
同期
boolean。初期値は false。
アップロード 完了
boolean。初期値は false。
アップロード リスナー
boolean。初期値は false。
タイムアウト済み
boolean。初期値は false。
応答
応答。初期値は ネットワークエラー
受信済みバイト
バイト列。初期状態では空のバイト列。
応答型
空文字列、"arraybuffer"、"blob"、 "document"、"json"、および "text" のいずれか。初期値は空文字列。
応答オブジェクト
オブジェクト、失敗、または null。初期値は null。
fetch コントローラー
fetch コントローラー。初期値は新しい fetch コントローラーsend() メソッドは、それを有用な fetch コントローラー に設定するが、簡潔にするため、これは常に fetch コントローラー を保持する。
上書き MIME 型
MIME 型 または null。初期値は null。 値を取得できる場合がある。 それは overrideMimeType() が呼び出されたときである。

3.1. コンストラクター

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

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

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

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

XMLHttpRequest オブジェクトは、その 状態 が、 send() 呼び出し済み が true である オープン済みヘッダー受信済み、または 読み込み中 のいずれかであり、かつ type が次のいずれかである イベントリスナー が 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. リクエスト

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

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)

既存の要求ヘッダーに値を追加するか、新しい要求ヘッダーを追加する。

状態オープン済み でない、または send() 呼び出し済み が true である場合、 "InvalidStateError" DOMException を投げる。

name がヘッダー名でない、または value がヘッダー値でない場合、"SyntaxError" DOMException を投げる。

setRequestHeader(name, value) メソッド手順は次のとおり:

  1. this状態オープン済み でない場合、"InvalidStateError" DOMException投げる

  2. thissend() 呼び出し済み が true である場合、"InvalidStateError" DOMException投げる

  3. value正規化する

  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 の値に設定すると、指定された時間が経過した後に fetching が終了される。時間が経過し、 要求がまだ完了しておらず、かつ 同期 が false である場合、 timeout イベントが配送され、そうでない場合は "TimeoutError" DOMException投げられるsend() メソッドの場合)。

設定時:同期 が true であり、かつ 現在のグローバルオブジェクトWindow オブジェクトである場合、"InvalidAccessError" DOMException を投げる。

timeout getter 手順は、 thisタイムアウト を返すことである。

timeout setter 手順は次のとおり:

  1. 現在のグローバルオブジェクトWindow オブジェクトであり、かつ this同期 が true である場合、"InvalidAccessError" DOMException投げる

  2. thisタイムアウト を指定された値に設定する。

これは、 timeout 属性を fetching が進行中である間にも 設定できることを意味する。その場合でも、 fetching の開始を基準として測定される。

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

client . withCredentials

オリジン間要求に 資格情報を含める場合は true。オリジン間要求で資格情報を 除外し、その応答内の Cookie を無視する場合は false。 初期値は false。

設定時:状態未送信 または オープン済み のいずれでもない、または send() 呼び出し済み が true である場合、 "InvalidStateError" DOMException を投げる。

withCredentials getter 手順は、 thisオリジン間 資格情報 を返すことである。

withCredentials setter 手順は次のとおり:

  1. this状態未送信 または オープン済み のいずれでもない場合、 "InvalidStateError" DOMException投げる

  2. thissend() 呼び出し済み が true である場合、"InvalidStateError" DOMException投げる

  3. thisオリジン間資格情報 を指定された値に設定する。

3.5.5. upload ゲッター

client . upload

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

upload getter 手順は、 thisアップロードオブジェクト を返すことである。

3.5.6. send() メソッド

client . send([body = null])

要求を開始する。body 引数は、存在する場合に 要求本体を提供し、 要求メソッドGET または HEAD である場合は無視される。

状態オープン済み でない、または send() 呼び出し済みが true である場合、 "InvalidStateError" DOMException を投げる。

send(body) メソッド 手順は次のとおり:

  1. this状態オープン済み でない場合、"InvalidStateError" DOMException投げる

  2. thissend() 呼び出し済み が true である場合、"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要求本体bodyWithTypebody に設定する。

      3. extractedContentTypebodyWithTypetype に設定する。

    4. originalAuthorContentType を、 取得する結果とする: `Content-Type` を、this作者要求ヘッダーから取得する。

    5. originalAuthorContentType が非 null である場合:

      1. bodyDocument オブジェクト、URLSearchParams オブジェクト、または 文字列である場合:

        1. contentTypeRecord を、 originalAuthorContentType解析した結果とする。

        2. contentTypeRecord が failure でなく、 contentTypeRecordparameters["charset"] が存在し、かつ parameters["charset"] が "UTF-8" に対する ASCII 大小無視一致でない場合:

          1. contentTypeRecordparameters["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. 1 つ以上のイベントリスナーが thisアップロードオブジェクトに登録されている場合、 thisアップロードリスナーを true に設定する。

  6. req を、次のように初期化された新しい 要求とする:

    method
    This要求メソッド
    URL
    This要求 URL
    ヘッダーリスト
    This作者要求ヘッダー
    unsafe-request フラグ
    設定済み。
    body
    This要求本体
    client
    This関連設定オブジェクト
    mode
    "cors"。
    use-CORS-preflight フラグ
    thisアップロードリスナーが true である場合に設定済み。
    credentials mode
    thisオリジン間資格情報が true である場合は "include"、 そうでない場合は "same-origin"。
    use-URL-credentials フラグ
    this要求 URL資格情報を含む場合に設定済み。
    initiator type
    "xmlhttprequest"。
  7. thisアップロード完了を false に設定する。

  8. thisタイムアウト済みを false に設定する。

  9. reqbody が null である場合、thisアップロード 完了を true に設定する。

  10. thissend() 呼び出し済みを true に設定する。

  11. this同期が false である場合:

    1. 進捗イベントを発火するloadstart という名前のイベントを this に対して、0 および 0 で。

    2. requestBodyTransmitted を 0 とする。

    3. requestBodyLength を、reqbodyが非 null である場合は、その 長さとし、 そうでない場合は 0 とする。

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

    5. thisアップロード完了が false であり、かつ thisアップロードリスナーが true である場合、進捗イベントを発火するloadstart という名前のイベントを thisアップロードオブジェクト に対して、 requestBodyTransmitted および requestBodyLength で。

    6. this状態オープン済み でない、または thissend() 呼び出し済みが false である場合、返す。

    7. bytesLength が与えられた processRequestBodyChunkLength を、次の手順とする:

      1. requestBodyTransmittedbytesLength だけ増加させる。

      2. これらの手順が前回呼び出されてからおおよそ 50ms が経過していない場合、返す。

      3. thisアップロード リスナーが true である場合、進捗イベントを発火するprogress という名前のイベントを thisアップロードオブジェクトに対して、 requestBodyTransmitted および requestBodyLength で。

      これらの手順は、新しいバイトが送信されたときにのみ呼び出される。

    8. processRequestEndOfBody を次の手順とする:

      1. thisアップロード 完了を true に設定する。

      2. thisアップロード リスナーが false である場合、返す。

      3. 進捗イベントを発火するprogress という名前のイベントを thisアップロード オブジェクトに対して、requestBodyTransmitted および requestBodyLength で。

      4. 進捗イベントを発火するload という名前のイベントを thisアップロード オブジェクトに対して、requestBodyTransmitted および requestBodyLength で。

      5. 進捗イベントを発火するloadend という名前のイベントを thisアップロード オブジェクトに対して、requestBodyTransmitted および requestBodyLength で。

    9. response が与えられた processResponse を、次の手順とする:

      1. this応答response に設定する。

      2. エラーを処理するthis について。

      3. this応答ネットワークエラーである場合、 返す。

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

      5. イベントを発火するreadystatechange という名前のイベントを this に対して。

      6. this状態ヘッダー 受信済みでない場合、返す。

      7. this応答bodyが null である場合、 応答の本体終了を処理するthis について実行し、返す。

      8. length を、 this応答ヘッダーリストから長さを抽出した結果とする。

      9. length が整数でない場合、それを 0 に設定する。

      10. bytes が与えられた processBodyChunk を次の手順とする:

        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応答bodyを、processBodyChunkprocessEndOfBodyprocessBodyError、および this関連グローバルオブジェクトを与えて、増分的に読み取る

    10. thisfetch コントローラーを、 reqfetchingした結果に設定する。このとき、 processRequestBodyChunkLengthprocessRequestBodyChunkLength に設定し、processRequestEndOfBodyprocessRequestEndOfBody に設定し、かつ processResponseprocessResponse に設定する。

    11. now を現在時刻とする。

    12. 次の手順を並列に実行する:

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

      2. reqdone フラグが未設定である場合、thisタイムアウト 済みを true に設定し、thisfetch コントローラー終了する。

  12. そうでなく、this同期が true である場合:

    1. processedResponse を false とする。

    2. response および nullOrFailureOrBytes が与えられた processResponseConsumeBody を、次の手順とする:

      1. nullOrFailureOrBytes が failure でない場合、this応答response に設定する。

      2. nullOrFailureOrBytesバイト列である場合、 nullOrFailureOrBytesthis受信済みバイトに追加する。

      3. processedResponse を true に設定する。

    3. thisfetch コントローラーを、 reqfetchingした結果に設定する。このとき、 processResponseConsumeBodyprocessResponseConsumeBody に設定し、 かつ useParallelQueue は true に設定する。

    4. now を現在時刻とする。

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

    6. processedResponse が false である場合、thisタイムアウト済み を true に設定し、 thisfetch コントローラー終了する。

    7. 現在のグローバルオブジェクトを与えて、タイミングを報告するthisfetch コントローラーについて。

    8. 応答の本体終了を処理するthis について実行する。

XMLHttpRequest オブジェクト xhr について、応答の本体終了を処理するには、次の手順を実行する:

  1. エラーを処理するxhr について。

  2. xhr応答ネットワークエラーである場合、 返す。

  3. transmitted を、xhr受信済みバイト長さとする。

  4. length を、 this応答ヘッダーリストから長さを抽出した結果とする。

  5. length が整数でない場合、それを 0 に設定する。

  6. xhr同期が false である場合、進捗 イベントを発火するprogress という名前のイベントを xhr に対して、 transmitted および length で。

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

  8. xhrsend() 呼び出し済みを false に設定する。

  9. イベントを発火するreadystatechange という名前のイベントを xhr に対して。

  10. 進捗イベントを発火するload という名前のイベントを xhr に対して、transmitted および length で。

  11. 進捗イベントを発火するloadend という名前のイベントを xhr に対して、 transmitted および length で。

XMLHttpRequest オブジェクト xhr について、エラーを処理するには、次の手順を実行する:

  1. xhrsend() 呼び出し済みが false である場合、返す。

  2. xhrタイムアウト 済みが true である場合、xhrtimeout、および "TimeoutError" DOMException について、要求エラー手順を実行する。

  3. そうでなく、xhr応答中止済みフラグが設定されている場合、xhrabort、および "AbortError" DOMException について、要求エラー手順を実行する。

  4. そうでなく、xhr応答ネットワークエラーである場合、xhrerror、 および "NetworkError" DOMException について、要求エラー手順を実行する。

XMLHttpRequest オブジェクト xhrevent、および任意で exception についての 要求エラー 手順は次のとおり:

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

  2. xhrsend() 呼び出し済みを false に設定する。

  3. xhr応答ネットワークエラーに設定する。

  4. xhr同期が true である場合、 exception投げる

  5. イベントを発火するreadystatechange という名前のイベントを xhr に対して。

    この時点で、xhr同期が false であることは明らかである。

  6. xhrアップロード完了が false である場合:

    1. xhrアップロード完了を true に設定する。

    2. xhrアップロードリスナーが true である場合:

      1. 進捗イベントを発火するevent という名前のイベントを xhrアップロード オブジェクトに対して、0 および 0 で。

      2. 進捗イベントを発火するloadend という名前のイベントを xhrアップロード オブジェクトに対して、0 および 0 で。

  7. 進捗イベントを発火するevent という名前のイベントを xhr に対して、0 および 0 で。

  8. 進捗イベントを発火するloadend という名前のイベントを xhr に対して、0 および 0 で。

3.5.7. abort() メソッド

client . abort()
すべてのネットワーク活動を取り消す。

abort() メソッド手順は次のとおり:

  1. 中止するthisfetch コントローラーを。

  2. this状態が、thissend() 呼び出し済み が true である オープン済みヘッダー受信済み、または 読み込み中 である場合、 要求エラー 手順this および abort について実行する。

  3. this状態完了 である場合、this状態未送信 に設定し、this応答ネットワークエラーに設定する。

    readystatechange イベントは配送されない。

3.6. レスポンス

3.6.1. responseURL ゲッター

responseURL getter 手順は、 this応答URL が null である場合は空文字列を返し、そうでない場合は exclude fragment flag を 設定した、その 直列化を返すことである。

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. this状態読み込み中 または 完了 である場合、"InvalidStateError" DOMException投げる

  2. this上書き MIME 型を、 mime解析した結果に設定する。

  3. this上書き MIME 型が failure である場合、this上書き MIME 型application/octet-stream に設定する。

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

client . responseType [ = value ]

応答型を返す。

応答型を変更するために設定できる。値は次のとおり: 空文字列(既定)、 "arraybuffer"、 "blob"、 "document"、 "json"、および "text"。

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

設定時:状態読み込み中 または 完了 である場合、"InvalidStateError" DOMException を投げる。

設定時: 同期が true であり、かつ 現在のグローバルオブジェクトWindow オブジェクトである場合、"InvalidAccessError" DOMException を投げる。

responseType getter 手順は、 this応答型を返すことである。

responseType setter 手順は次のとおり:

  1. 現在のグローバルオブジェクトWindow オブジェクトでなく、かつ指定された値が "document" である場合、返す。

  2. this状態読み込み中 または 完了 である場合、"InvalidStateError" DOMException投げる

  3. 現在のグローバルオブジェクトWindow オブジェクトであり、かつ this同期が true である場合、"InvalidAccessError" DOMException投げる

  4. this応答型を指定された値に設定する。

3.6.9. response ゲッター

client . response

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

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

  1. this応答型が空文字列または "text" である場合:

    1. this状態読み込み中 または 完了 でない場合、空文字列を返す。

    2. this についてテキスト応答を取得する結果を返す。

  2. this状態完了 でない場合、null を返す。

  3. this応答オブジェクトが failure である場合、null を返す。

  4. this応答オブジェクトが非 null である場合、それを返す。

  5. this応答型が "arraybuffer" である場合、this応答オブジェクトを、 this受信済みバイトを表す 新しい ArrayBuffer オブジェクトに設定する。これが例外を投げる場合、this応答オブジェクト を failure に設定し、null を返す。

    ArrayBuffer オブジェクトの割り当ては、成功することが保証されていない。 [ECMASCRIPT]

  6. そうでなく、this応答型が "blob" である場合、 this応答オブジェクトを、 this受信済みバイトを表し、 typethis について 最終 MIME 型を取得する結果に設定された、新しい Blob オブジェクトに設定する。

  7. そうでなく、this応答型が "document" である場合、 文書 応答を設定するthis について行う。

  8. そうでない場合:

    1. アサート:this応答型は "json" である。

    2. this応答bodyが null である場合、 null を返す。

    3. jsonObject を、 this受信済みバイトに対してバイトから JSON を解析するを実行した結果とする。 それが例外を投げた場合、null を返す。

    4. this応答オブジェクトjsonObject に設定する。

  9. this応答オブジェクトを返す。

3.6.10. responseText ゲッター

client . responseText

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

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

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

  1. this応答型が空文字列でも "text" でもない場合、 "InvalidStateError" DOMException投げる

  2. this状態読み込み中 または 完了 でない場合、 空文字列を返す。

  3. this についてテキスト応答を取得する結果を返す。

3.6.11. responseXML ゲッター

client . responseXML

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

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

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

  1. this応答型が空文字列でも "document" でもない場合、 "InvalidStateError" DOMException投げる

  2. this状態完了 でない場合、null を返す。

  3. アサート:this応答オブジェクトは failure でない。

  4. this応答オブジェクトが非 null である場合、それを返す。

  5. 文書 応答を設定するthis について行う。

  6. this応答オブジェクトを返す。

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標準を作成するために使用された編集ソフトウェアの制限によるものです。

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

The get(name) メソッド 手順は次のとおり:

  1. エントリーのうち、その名前name であるものが、thisエントリーリスト内に存在しない場合、null を返す。

  2. を返す:エントリーのうち、その 名前name である最初のものの値を、thisエントリーリストから返す。

The getAll(name) メソッド手順は次のとおり:

  1. エントリーのうち、その名前name であるものが、thisエントリーリスト内に存在しない場合、空のリストを返す。

  2. を返す:すべての エントリーのうち、その 名前name であるものの値を、順に、thisエントリーリストから返す。

The has(name) メソッド 手順は、エントリーのうち、その 名前name であるものが、thisエントリー リスト内に存在する場合は true を返し、そうでない場合は false を返すことである。

The set(name, value) および set(name, blobValue, filename) メソッド手順は次のとおり:

  1. value を、与えられている場合は value、そうでない場合は blobValue とする。

  2. entry を、 namevalue、および与えられている場合は filename を用いてエントリーを作成する結果とする。

  3. エントリーのうち、その名前name であるものが、thisエントリーリスト 内に存在する場合、そのような最初の エントリーentry置換し、その他を削除する

  4. そうでない場合、entrythisエントリーリスト追加する

value という名前の引数と blobValue が存在する理由は、XMLHttpRequest Standard を記述するために使用されている編集ソフトウェアの制限によるものである。

反復処理する値ペアは、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+