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 handlersattribute EventHandler onloadstart ;attribute EventHandler onprogress ;attribute EventHandler onabort ;attribute EventHandler onerror ;attribute EventHandler onload ;attribute EventHandler ontimeout ;attribute EventHandler onloadend ; }; [Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :
XMLHttpRequestUpload XMLHttpRequestEventTarget { };enum {
XMLHttpRequestResponseType ,
"" ,
"arraybuffer" ,
"blob" ,
"document" ,
"json" }; [
"text" Exposed =(Window ,DedicatedWorker ,SharedWorker )]interface :
XMLHttpRequest XMLHttpRequestEventTarget {constructor (); // event handlerattribute EventHandler onreadystatechange ; // statesconst unsigned short UNSENT = 0;const unsigned short OPENED = 1;const unsigned short HEADERS_RECEIVED = 2;const unsigned short LOADING = 3;const unsigned short DONE = 4;readonly attribute unsigned short readyState ; // requestundefined 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 (); // responsereadonly 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()
コンストラクターの手順は次の通りです:
-
thisの アップロードオブジェクトを新しい
XMLHttpRequestUpload
オブジェクトに設定します。
3.2. ガベージコレクション
XMLHttpRequest
オブジェクトは、その状態がオープンで
が設定されている場合、
ヘッダー受信済み、または読み込み中であり、さらに
イベントリスナーが1つ以上登録されており、そのタイプが
send()
フラグreadystatechange
、
progress
、
abort
、
error
、
load
、
timeout
、
および
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)
メソッドの手順は以下の通りです:
-
このthisの 関連するグローバルオブジェクトが
Window
オブジェクトであり、 関連付けられたDocument
が完全にアクティブでない場合、 以下をスローします: "InvalidStateError
"DOMException
。 -
methodがメソッド でない場合、 以下をスローします: "
SyntaxError
"DOMException
。 -
methodが禁止されたメソッド の場合、 以下をスローします: "
SecurityError
"DOMException
。 -
メソッドを正規化します。
-
parsedURLをURLをエンコード・解析した結果とし、 それをthis の関連設定オブジェクトに相対的なものとします。
-
parsedURLが失敗した場合、 以下をスローします: "
SyntaxError
"DOMException
。 -
async引数が省略された場合、asyncをtrueに設定し、 usernameとpasswordをnullに設定します。
残念ながら、レガシーコンテンツにより、async引数が
undefined
であることと省略されたことを同一視することが妨げられています。 -
parsedURLのホスト がnullでない場合:
-
asyncがfalseで、 現在のグローバルオブジェクトが
Window
オブジェクトであり、 thisのタイムアウトが0でない、またはthisのレスポンスタイプ が空文字列でない場合、 以下をスローします: "InvalidAccessError
"DOMException
。 -
このfetch controllerを終了します。 thisのfetch controller。
この時点でfetch が進行中である可能性があります。
-
以下のようにオブジェクトに関連付けられた変数を設定します:
-
thisのアップロードリスナーフラグを未設定にします。
-
asyncがfalseの場合、 thisの同期フラグを設定します。 それ以外の場合、thisの同期フラグを未設定にします。
-
thisのレスポンスオブジェクトをnullに設定します。
MIMEタイプのオーバーライドは、
overrideMimeType()
メソッドがopen()
メソッドの前に呼び出される可能性があるため、 ここではオーバーライドされません。 -
-
イベントを発火します。 名前は
readystatechange
。 対象はthis。
2つのopen()
メソッドが定義されている理由は、
XMLHttpRequest現行標準を書く際に使用された編集ソフトウェアの制限によるものです。
3.5.2.
setRequestHeader()
メソッド
-
client . setRequestHeader(name, value)
-
既存のリクエストヘッダーに値を追加するか、新しいリクエストヘッダーを追加します。
InvalidStateError
DOMException
をスローします。もしstateがopenedでない場合、またはsend()
フラグが設定されている場合。SyntaxError
DOMException
をスローします。もしnameがヘッダー名でない場合、またはvalueがヘッダー値でない場合。
setRequestHeader(name, value)
メソッドは以下の手順を実行しなければなりません:
-
thisの 状態がオープンでない場合、 以下をスローします: "
InvalidStateError
"DOMException
。 -
thisの
send()
フラグ が設定されている場合、 以下をスローします: "InvalidStateError
"DOMException
。 -
値を正規化します。
-
nameがヘッダー名でないか、valueがヘッダー値でない場合、 以下をスローします: "
SyntaxError
"DOMException
。空のバイトシーケンスは空のヘッダー値 を表します。
-
(name, value)が禁止されたリクエストヘッダーである場合、終了します。
-
結合 (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
ゲッターの手順は
this の timeout を返します。
timeout
セッターの手順は以下の通りです:
-
現在のグローバルオブジェクトが
Window
オブジェクトであり、this の 同期フラグ が設定されている場合、 以下をスローします: "InvalidAccessError
"DOMException
。
これは、timeout
属性がフェッチ
中に設定される可能性があることを意味します。その場合でも、フェッチの開始時点から測定されます。
3.5.4.
withCredentials
ゲッターおよびセッター
-
client . withCredentials
-
オリジン間リクエストに資格情報を含める場合はtrue。オリジン間リクエストにそれらを含めず、レスポンスのクッキーを無視する場合はfalse。 初期値はfalse。
設定時:InvalidStateError
DOMException
をスローします。stateがunsentまたはopenedでない場合、もしくはsend()
フラグが設定されている場合。
withCredentials
ゲッターの手順は、
this の クロスオリジン認証情報
を返します。
withCredentials
セッターの手順は以下の通りです:
-
this の 状態が 未送信 または オープン でない場合、 以下をスローします: "
InvalidStateError
"DOMException
。 -
this の
send()
フラグが 設定されている場合、 以下をスローします: "InvalidStateError
"DOMException
。 -
this の クロスオリジン認証情報を指定された値に設定します。
3.5.5. upload
ゲッター
client . upload
-
関連付けられた
XMLHttpRequestUpload
オブジェクトを返します。これは、データがサーバーに転送される際の送信情報を収集するために使用できます。
upload
ゲッターの手順は、
this の アップロードオブジェクト
を返します。
3.5.6. send()
メソッド
-
client . send([body = null])
-
リクエストを開始します。body引数はリクエストボディを提供します(ある場合)、 ただしリクエストメソッドが
GET
またはHEAD
の場合は無視されます。InvalidStateError
DOMException
をスローします。stateがopenedでないか、 またはsend()
フラグが設定されている場合。
send(body)
メソッドの手順は以下の通りです:
-
このthisの 状態がオープンでない場合、 以下をスローします: "
InvalidStateError
"DOMException
。 -
このthisの
send()
フラグが 設定されている場合、 以下をスローします: "InvalidStateError
"DOMException
。 -
bodyがnullでない場合:
-
extractedContentTypeをnullに設定します。
-
bodyが
Document
の場合、 thisのリクエスト本文を bodyのシリアライズ、 変換、およびUTF-8エンコード されたものに設定します。 -
それ以外の場合:
-
originalAuthorContentTypeを取得した結果とします。 `
Content-Type
` を thisのオーサーリクエストヘッダーから。 -
originalAuthorContentTypeがnullでない場合:
-
それ以外の場合:
-
bodyがHTMLドキュメントの場合、 設定 (`
Content-Type
`, `text/html;charset=UTF-8
`) を thisのオーサーリクエストヘッダーに。 -
それ以外の場合、bodyがXML ドキュメントの場合、 設定 (`
Content-Type
`, `application/xml;charset=UTF-8
`) を thisのオーサーリクエストヘッダーに。 -
それ以外の場合、extractedContentTypeがnullでない場合、 設定 (`
Content-Type
`, extractedContentType) を thisのオーサーリクエストヘッダーに。
-
-
-
もしthisのアップロードオブジェクト に1つ以上のイベントリスナーが登録されている場合、 thisのアップロードリスナーフラグ を設定します。
-
reqを以下に示すように初期化された新しい リクエストとして設定します:
- メソッド
- thisのリクエストメソッド。
- URL
- thisのリクエストURL。
- ヘッダーリスト
- thisのオーサーリクエストヘッダー。
- 安全でないリクエストフラグ
- 設定する。
- 本文
- thisのリクエスト本文。
- クライアント
- thisの関連設定オブジェクト。
- モード
- "
cors
"。 - CORSプリフライトフラグ
- thisのアップロードリスナーフラグ が設定されている場合に設定します。
- 認証モード
- thisのクロスオリジン認証情報
がtrueの場合 "
include
"、それ以外の場合 "same-origin
"。 - URL認証情報フラグを使用
- thisのリクエストURL が認証情報を含む場合に設定します。
- イニシエータタイプ
- "
xmlhttprequest
"。
-
thisのアップロード完了フラグ を未設定にします。
-
もしreqの本文 がnullの場合、 thisの アップロード完了フラグ を設定します。
-
-
requestBodyTransmittedを0に設定します。
-
requestBodyLengthをreqの本文の 長さに設定します。 もしreqの本文 がnullでない場合、それ以外の場合は0に設定します。
-
アサート:requestBodyLengthは整数である。
-
もしthisのアップロード完了フラグ が未設定で、thisのアップロードリスナーフラグ が設定されている場合、 進捗イベントを発火 します。名前は
loadstart
、 対象はthisのアップロードオブジェクト、 値はrequestBodyTransmittedとrequestBodyLength。 -
processRequestBodyChunkLengthを、bytesLengthを指定して以下の手順として定義します:
-
requestBodyTransmittedをbytesLength分増加させます。
-
これらの手順が最後に実行されてから約50msが経過していない場合、終了します。
-
もしthisのアップロードリスナーフラグ が設定されている場合、 進捗イベントを発火 します。名前は
progress
、 対象はthisのアップロードオブジェクト、 値はrequestBodyTransmittedとrequestBodyLength。
これらの手順は新しいバイトが送信された場合にのみ実行されます。
-
-
processRequestEndOfBodyを以下の手順として定義します:
-
thisのアップロード完了フラグ を設定します。
-
もしthisのアップロードリスナーフラグ が未設定の場合、終了します。
-
進捗イベントを発火 します。名前は
progress
、 対象はthisの アップロードオブジェクト、 値はrequestBodyTransmittedとrequestBodyLength。 -
進捗イベントを発火 します。名前は
load
、 対象はthisの アップロードオブジェクト、 値はrequestBodyTransmittedとrequestBodyLength。 -
進捗イベントを発火 します。名前は
loadend
、 対象はthisの アップロードオブジェクト、 値はrequestBodyTransmittedとrequestBodyLength。
-
-
processResponseを以下の手順として定義します:
-
イベントを発火 します。名前は
readystatechange
、 対象はthis。 -
lengthを以下の手順で導出された結果として設定します: 長さを抽出 します。対象はthisのレスポンスのヘッダーリスト。
-
もしlengthが整数でない場合、0に設定します。
-
processBodyChunkをbytesを指定して以下の手順として定義します:
-
processBodyErrorを以下の手順として定義します:
-
レスポンスの本文を逐次読み取る を実行します。対象はthisのレスポンス の本文、 引数はprocessBodyChunk、processEndOfBody、 processBodyError、およびthisの 関連グローバルオブジェクト。
-
thisのフェッチコントローラー を、reqをフェッチした結果に設定します。 このとき、processRequestBodyChunkLengthを processRequestBodyChunkLengthに、 processRequestEndOfBodyを processRequestEndOfBodyに、 processResponseを processResponseに設定します。
-
nowを現在の時間に設定します。
-
以下の手順を並行して実行します:
-
それ以外の場合、もしthisの同期フラグが設定されている場合:
-
processedResponseをfalseに設定します。
-
processResponseConsumeBodyを以下の手順として定義します: responseとnullOrFailureOrBytesを引数とします。
-
thisのフェッチコントローラー を、reqをフェッチした結果に設定します。 このとき、processResponseConsumeBody をprocessResponseConsumeBodyに、 useParallelQueue をtrueに設定します。
-
nowを現在の時間に設定します。
-
一時停止します。 条件はprocessedResponseがtrueになるか、 thisのタイムアウトが0でなく、 thisのタイムアウト ミリ秒がnowから経過するまで。
-
もしprocessedResponseがfalseの場合、 thisのタイムアウトフラグ を設定し、終了します。 対象はthisのフェッチコントローラー。
-
タイミングを報告します。 対象はthisのフェッチコントローラー、 および現在のグローバルオブジェクト。
-
次の手順を実行して、XMLHttpRequest
オブジェクト xhr の レスポンス終端処理 を行います:
-
xhr に対して エラー処理 を実行します。
-
length を次の手順で取得された値として設定します: 長さを抽出 します。対象は this の レスポンス の ヘッダーリスト。
-
もし length が整数でない場合、0 に設定します。
-
もし xhr の 同期フラグ が未設定の場合、 進捗イベントを発火 します。 名前は
progress
、 対象は xhr、値は transmitted と length。 -
xhr の 状態 を 完了 に設定します。
-
xhr の
send()
フラグ を未設定にします。 -
xhr に対して イベントを発火 します。 名前は
readystatechange
。 -
xhr に対して 進捗イベントを発火 します。 名前は
loadend
、 値は transmitted と length。
エラーを処理するためには、
XMLHttpRequest
オブジェクトxhrに対して、以下の手順を実行します:
-
もし xhr の
send()
フラグ が未設定の場合、終了します。 -
もし xhr の タイムアウトフラグ が設定されている場合、 リクエストエラー手順 を実行します。 xhr、
timeout
、 および "TimeoutError
"DOMException
を対象にします。 -
それ以外の場合、もし xhr の レスポンス の 中断フラグ が設定されている場合、 リクエストエラー手順 を実行します。 xhr、
abort
、 および "AbortError
"DOMException
を対象にします。 -
それ以外の場合、もし xhr の レスポンス が ネットワークエラー の場合、 リクエストエラー手順 を実行します。 xhr、
error
、 および "NetworkError
"DOMException
を対象にします。
次の手順を実行して XMLHttpRequest
オブジェクト xhr、event、および必要に応じて exception に対して
リクエストエラー手順
を行います:
-
xhr の 状態 を 完了 に設定します。
-
xhr の
send()
フラグ を未設定にします。 -
xhr に対して イベントを発火 します。 名前は
readystatechange
。この時点で xhr の 同期フラグ が未設定であることが明らかです。
-
もし xhr の アップロード完了フラグ が未設定の場合:
-
xhr の アップロード完了フラグ を設定します。
-
もし xhr の アップロードリスナーフラグ が設定されている場合:
-
xhr の アップロードオブジェクト に対して 進捗イベントを発火 します。名前は event、値は 0 と 0。
-
xhr の アップロードオブジェクト に対して 進捗イベントを発火 します。名前は
loadend
、値は 0 と 0。
-
-
-
xhr に対して 進捗イベントを発火 します。 名前は event、値は 0 と 0。
3.5.7. abort()
メソッド
client . abort()
- ネットワーク処理をキャンセルします。
abort()
メソッドの手順は次の通りです:
-
中止します。 対象はthisの フェッチコントローラー。
-
もしthisの状態がオープンで、 thisの
send()
フラグ が設定されている場合、またはヘッダー受信済みもしくは読み込み中の場合、 リクエストエラー手順 を実行します。対象はthisとabort
。 -
もし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です:
getAllResponseHeaders()
メソッドの手順は次の通りです:
-
output を空のバイト列として設定します。
-
initialHeaders を、次のソートおよび結合の結果として設定します。 対象はthisの レスポンスの ヘッダーリスト。
-
headers を、昇順にソートした initialHeaders の結果として設定します。 このとき、a が b より小さい場合、 a の名前が レガシー大文字バイト未満であるとします。
残念ながら、これは展開済みのコンテンツとの互換性のために必要です。
-
各 header について、 header の名前に続けて 0x3A 0x20 バイトペアを追加し、 header の値に続けて 0x0D 0x0A バイトペアを追加し、 output に追加します。
-
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 タイプを取得
するには、次の手順を実行します:
-
mimeType を、xhr の レスポンス の ヘッダーリストから MIME タイプを抽出した結果として設定します。
-
もし mimeType が失敗の場合、mimeType を
text/xml
に設定します。 -
mimeType を返します。
XMLHttpRequest
オブジェクト xhr に対して 最終的な MIME タイプを取得
するには、次の手順を実行します:
-
もし xhr の override MIME タイプ が null の場合、 xhr に対して レスポンス MIME タイプを取得 の結果を返します。
-
xhr の override MIME タイプ を返します。
XMLHttpRequest
オブジェクト xhr に対して 最終的なエンコーディングを取得
するには、次の手順を実行します:
-
label を null に設定します。
-
responseMIME を xhr に対して レスポンス MIME タイプを取得した結果として設定します。
-
もし responseMIME の パラメーター["
charset
"] が存在する場合、label をそれに設定します。 -
もし xhr の override MIME タイプ の パラメーター["
charset
"] が存在する場合、label をそれに設定します。 -
もし label が null の場合、null を返します。
-
encoding を label から エンコーディングを取得した結果として設定します。
-
もし encoding が失敗の場合、null を返します。
-
encoding を返します。
上記の手順は、最終的な MIME タイプを取得 を使用しないように意図的に設計されています。これはウェブ互換性のためです。
ドキュメントレスポンスを設定するためには、XMLHttpRequest
オブジェクト
xhr に対して、次の手順を実行します。
-
finalMIME を、xhr に対して 最終的な MIME タイプを取得する 結果とします。
-
finalMIME が HTML MIME タイプ または XML MIME タイプ でない場合は、処理を終了します。
-
xhr の response type が空文字列であり、かつ finalMIME が HTML MIME タイプ である場合は、処理を終了します。
これは、レガシーコンテンツの破壊を防ぐために、xhr の response type が "
document
" に限定されています。 -
finalMIME が HTML MIME タイプ である場合:
-
charset を、xhr に対する 最終的なエンコーディングを取得する 結果とします。
-
charset が null の場合は、 バイトストリームの最初の1024バイトを事前スキャン し、それが失敗しなければ charset をその戻り値に設定します。
-
charset が null の場合は、charset を UTF-8 に設定します。
-
document を、xhr の 受信バイト を HTML Standard の HTML パーサーの規則に従い、 スクリプトを無効にした状態で、既知の確定エンコーディング charset を用いて解析した結果を表す ドキュメント とします。 [HTML]
-
document を HTML ドキュメント としてフラグ付けします。
-
-
そうでない場合、document を xhr の 受信バイト に対して、XML パーサー を XML スクリプトサポートを無効にした状態で 実行した結果を表す ドキュメント とします。それが失敗(未対応の文字エンコーディング、名前空間の整形式エラーなど)した場合、null を返します。 [HTML]
参照されるリソースは読み込まれず、関連する XSLT は適用されません。
-
charset が null の場合は、charset を UTF-8 に設定します。
-
document の エンコーディング を charset に設定します。
-
document の コンテンツタイプ を finalMIME に設定します。
-
document の オリジン を xhr の 関連する設定オブジェクト の オリジン に設定します。
-
xhr の response object を document に設定します。
テキストレスポンスを取得するためには、
XMLHttpRequest
オブジェクト xhr に対して、次の手順を実行します。
-
charset を、xhr に対する 最終的なエンコーディングを取得する 結果とします。
-
xhr の response type が空文字列であり、charset が null であり、 かつ xhr に対して 最終的な MIME タイプを取得する 結果が XML MIME タイプ である場合は、 XML 仕様に記載された規則を使用してエンコーディングを決定します。charset をその決定されたエンコーディングとします。 [XML] [XML-NAMES]
これは、非レガシーな response type 値 "
text
" を簡潔に保つために、 xhr の response type を空文字列に限定しています。 -
charset が null の場合は、charset を UTF-8 に設定します。
-
xhr の 受信バイト を デコード し、 フォールバックエンコーディングを charset として、その結果を返します。
作成者は、常にリソースを UTF-8 を使用してエンコードすることを強く推奨します。
3.6.7.
overrideMimeType()
メソッド
client . overrideMimeType(mime)
-
レスポンスの `
Content-Type
` ヘッダー値が mime であるかのように振る舞います。(ヘッダー自体は変更されません。)loading または done 状態のときに、"
InvalidStateError
"DOMException
をスローします。
overrideMimeType(mime)
メソッドの手順は以下の通りです:
-
this の state が loading または done の場合、スロー します: "
InvalidStateError
"DOMException
。 -
this の override MIME type を パース した mime の結果に設定します。
-
this の override MIME type が失敗した場合、this の override MIME type を
application/octet-stream
に設定します。
3.6.8.
responseType
ゲッターおよびセッター
client . responseType [ = value ]
-
レスポンスタイプを返します。
レスポンスタイプを変更するために設定できます。値は次の通りです: 空文字列 (デフォルト), "
arraybuffer
", "blob
", "document
", "json
", および "text
"。設定時: 現在のグローバルオブジェクト が
Window
オブジェクトでない場合、"document
" に設定することは無視されます。設定時: loading または done 状態のときに、"
InvalidStateError
"DOMException
をスローします。設定時: 同期フラグ が設定されており、かつ 現在のグローバルオブジェクト が
Window
オブジェクトである場合、"InvalidAccessError
"DOMException
をスローします。
responseType
ゲッターの手順は、this の response type を返すことです。
responseType
セッターの手順は以下の通りです:
-
現在のグローバルオブジェクト が
Window
オブジェクトでなく、かつ与えられた値が "document
" の場合、処理を終了します。 -
this の state が loading または done の場合、スロー します: "
InvalidStateError
"DOMException
。 -
現在のグローバルオブジェクト が
Window
オブジェクトであり、かつ this の 同期フラグ が設定されている場合、スロー します: "InvalidAccessError
"DOMException
。 -
this の response type を与えられた値に設定します。
3.6.9.
response
ゲッター
client . response
-
レスポンスボディを返します。
response
ゲッターの手順は以下の通りです:
-
this の response type が空文字列または "
text
" の場合:-
this に対して テキストレスポンスを取得する の結果を返します。
-
this の response object が失敗の場合、null を返します。
-
this の response object が null でない場合、それを返します。
-
this の response type が "
arraybuffer
" の場合、 this の response object を 新しいArrayBuffer
オブジェクト (これは this の 受信バイト を表します) に設定します。例外がスローされた場合、this の response object を失敗に設定し、null を返します。ArrayBuffer
オブジェクトの割り当てが必ず成功するとは限りません。[ECMASCRIPT] -
それ以外の場合、this の response type が "
blob
" の場合、 this の response object を 新しいBlob
オブジェクト (これは this の 受信バイト を表し、type
を 最終的な MIME タイプを取得する の結果に設定します) に設定します。 -
それ以外の場合、this の response type が "
document
" の場合、 ドキュメントレスポンスを設定する を this に対して実行します。 -
それ以外の場合:
-
アサート: this の response type が "
json
" であること。 -
jsonObject を、JSON をバイトから JavaScript 値にパースする を this の 受信バイト に対して実行した結果に設定します。例外がスローされた場合、null を返します。
-
this の response object を jsonObject に設定します。
-
-
this の response object を返します。
3.6.10.
responseText
ゲッター
client . responseText
-
レスポンスをテキストとして返します。
InvalidStateError
"DOMException
をスローします。responseType
が空文字列または "text
" でない場合。
responseText
ゲッターの手順は以下の通りです:
-
this の response type が空文字列または "
text
" でない場合、 スロー します: "InvalidStateError
"DOMException
。 -
テキストレスポンスを取得する の結果を this に対して返します。
3.6.11.
responseXML
ゲッター
client . responseXML
-
レスポンスをドキュメントとして返します。
InvalidStateError
"DOMException
をスローします。responseType
が空文字列または "document
" でない場合。
responseXML
ゲッターの手順は以下の通りです:
-
this の response type が空文字列または "
document
" でない場合、 スロー します: "InvalidStateError
"DOMException
。 -
アサート: this の response object が失敗でないこと。
-
this の response object が null でない場合、それを返します。
-
ドキュメントレスポンスを設定する を this に対して実行します。
-
this の response 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)
コンストラクタの手順は以下の通りです:
-
formが指定された場合、以下を実行します:
-
submitterがnullではない場合、以下を実行します:
-
submitterのフォーム所有者がformでない場合、例外をスローします。 "
NotFoundError
"DOMException
。
-
listを、エントリリストを構築する結果として formとsubmitterを用いて取得します。
-
listがnullの場合、例外をスローします。 "
InvalidStateError
"DOMException
。
-
append(name, value)
メソッドと
append(name, blobValue, filename)
メソッドの手順は以下の通りです:
-
valueを、指定された場合はvalue、それ以外の場合はblobValueとします。
-
entryをエントリを作成するの結果として name、value、および指定された場合はfilenameを用いて取得します。
valueおよびblobValueという名前の引数がある理由は、 XMLHttpRequest標準を作成するために使用された編集ソフトウェアの制限によるものです。
delete(name)
メソッドの手順は、削除することです。すべてのエントリの
名前がnameであるものを、thisの
エントリリストから。
get(name)
メソッド
の手順は以下の通りです:
getAll(name)
メソッドの手順は以下の通りです:
has(name)
メソッドの手順は、
エントリが存在する場合、名前がnameであるものがthisの
エントリリストに含まれていればtrueを返し、それ以外の場合はfalseを返します。
set(name, value)
および
set(name, blobValue, filename)
メソッドの手順は以下の通りです:
-
valueを、指定された場合はvalue、それ以外の場合はblobValueとします。
-
entryをエントリを作成するの結果として name、value、および指定された場合はfilenameを用いて取得します。
-
エントリが存在する場合、thisのエントリリスト内で 名前がnameである最初のエントリを entryに置き換え、 その他のエントリを削除します。
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 = 0;
loaded double = 0; };
total
イベント
にProgressEvent
インターフェースを使用して、進行状況を示します。
lengthComputable
、
loaded
、
および
total
のゲッターステップは、それらが初期化された値を返すことです。
5.1. ProgressEvent
インターフェースを使用してイベントを発火する
進行イベントを発火するには、
eという名前のイベントをtargetで発火することを意味します。transmittedと
lengthを指定して、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回。 | error 、abort 、
timeout 、またはload が
ディスパッチされた後。
|
error
、abort
、timeout
、
およびload
イベントタイプは相互排他です。
ウェブプラットフォーム全体でerror
、abort
、
timeout
、および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氏(Apple、 annevk@annevk.nl)によって執筆されました。
知的財産権
Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。この作品はCreative Commons Attribution 4.0 International Licenseの下でライセンスされています。この中の一部がソースコードに取り込まれている場合、その部分はBSD 3-Clause Licenseの下でライセンスされます。
これは現行標準です。特許審査バージョンに興味がある方は現行標準レビュードラフトをご覧ください。