Wiki_JS_XHR - inoueshinichi/Wiki_Web GitHub Wiki
- https://qiita.com/hisamura333/items/e3ea6ae549eb09b7efb9
- https://www.webdesignleaves.com/pr/jquery/js-XMLHttpRequest.html
- https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/load_event
- https://qiita.com/ShinyaKato/items/64b6726c361f5377b0f3
- https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest_API/Synchronous_and_Asynchronous_Requests
- 非同期通信 (旧: XMLHttpRequest, 新: fetch API)
- XMLHttpRequestオブジェクトは, パラメータ設定により同期通信も可能.
- 通信に使用できるボディのデータ構造は, "arraybuffer", "blob", "json", "document"(xml), "text"
- クライアントとサーバーの間でデータを伝送するための機能をクライアント側で提供するAPI.
- ページ全体(*.html)を再読み込みすることなく, URLからデータを読み出す簡単な方法を提供.
- ユーザの作業を中断させることなくWebページの一部を更新することができる.
| 数値 | 状態 | 説明 |
|---|---|---|
| 0 | UNSENT | XHRオブジェクト作成直後 |
| 1 | OPENED | open()メソッドの呼び出し直後 |
| 2 | HEADERS_RECEIVED | レスポンスヘッダの受信直後 |
| 3 | LOADING | レスポンスボディを受信中(定期的に繰り返される) |
| 4 | DONE | XHR通信完了後 |
| プロパティ | 型 | 内容 |
|---|---|---|
| *.readState | number | 読み取り専用. リクエスト状態を示す数値. |
| *.responseType | string or null | "arraybuffer":ArrayBuffer, "blob": Blob, "document": Document(XML), "json": Json, "text": plane text |
| *.response | ArrayBuffer or Blob or Document or JSON or string | 読み取り専用. *.responseTypeで判別. |
| *.responseText | string or null | 読み取り専用. レスポンスボディを文字列で取得する. 失敗or未送信時null |
| *.responseXML | Document or null | 読み取り専用. レスポンスボディをDocumentで取得する. 失敗or未送信時null. ※ WebWorkerで使えない. |
| *.status | number | HTTPレスポンスのステータスコード |
| *.statusText | string | HTTPレスポンスステータスコードに対応した文字列. |
| *.timeout | number | リクエストを自動的に閉じるまでのタイムアウト時間. 単位ミリ秒 |
| *.upload | - | XMLHttpRequestUploadでuploadプロセスを表す. |
| *.withCredentials | boolean | CORSのリクエスト時にクッキーや認証情報をヘッダーを介して渡すか否か |
- 受信した内容(ボディ)は, XMLHttpRequestオブジェクトの
responseプロパティで参照できる.
| プロパティ | 型 | 内容 |
|---|---|---|
| *.channel | number | 読み取り専用. リクエスト実行の際にオブジェクトによって使われるチャネル. |
| *.mozAnon | boolean | 読み取り専用. リクエストをクッキーや認証ヘッダーなしで送信. |
| *.mozSystem | boolean | 読み取り専用. 同一オリジンポリシーはリクエストで適用されない. |
| *.mozBackgroundRequest | boolean | このオブジェクトがバックグラウンドサービスのリクエストを表しているか否か |
| メソッド | 戻り値の型 | 内容 |
|---|---|---|
| *.abort() | void | リクエストが既に送信されている場合、リクエストを中止する. |
| *.getAllResponseHeaders() | string or null | すべてのレスポンスヘッダーをCRLF区切りで文字列として返す. レスポンスを受け取っていない場合, null. |
| *.open() | void | リクエストの初期化 |
| *.overrideMimeType() | void | サーバから帰ってくるMIMEタイプを上書きする |
| *.send() | void | リクエストを送信(非同期が規定). 制御がすぐに戻り, レスポンス到着時にCallbackが実行される |
| *.setRequestHeader() | void | HTTPリクエストヘッダーを指定する |
| メソッド | 戻り値の型 | 内容 |
|---|---|---|
| *.onabort | void | リクエスト送信中止時 |
| *.onerror | void | リクエスト失敗時(受信完了) |
| *.onload | void | リクエスト成功時(受信完了) |
| *.onloadend | void |
load,abort,errorいずれのイベントの後にも発生するイベント(finally相当). |
| *.onloadstart | void | リクエストがデータを読み込み始めた時. open()メソッドが呼ばれたとき. |
| *.onprogress | void | リクエストが複数チャンクに分割されてレスポンスを受信するときに定期的に発生 |
| *.onreadystatechange | void | readSatateプロパティが変化する時 |
| *.ontimeout | void | リクエストのタイムアウト時 |
- 非同期通信なので受信時用のハンドラを設定する
- XMLHttpRequestオブジェクトが通信している間に, 状況が変化したときに何度も呼び出されるイベント
- readyStateプロパティから状況を確認する
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
for (let i = 0; i < this.response.length; i++) {
let data = this.response[i];
let imgElem = document.createElement('img');
imgElem.setAttribute('src', data.path);
imgElem.setAttribute('width', data.width);
imgElem.setAttribute('height', data.height);
let captionElem = document.createElement('div');
captionElem.className = 'inner';
captionElem.innerHTML = '<p>' + data.memo + '<span>' + data.date + '</span></p>';
let divElem = document.createElement('div');
divElem.className = 'photo';
divElem.appendChild(imgElem);
divElem.appendChild(captionElem);
document.getElementById('img_unit').appendChild(divElem);
}
}
};
| プロパティ値 | データ型 |
|---|---|
| text | DOMString |
| arraybuffer | arraybuffer |
| blob | blob |
| document | Document |
| json | JSON |
const xhr = new XMLHttpRequest();
// リクエスト初期化
xhr.open('GET', url, /*非同期*/true /*同期*/false);
// リクエストヘッダーの設定
xhr.setRequestHeader("Key1", "Value1");
xhr.responseType = "json"; // "arraybuffer", "blob", "document", "json", "text"
// コールバック設定 (下記, 4つを設定しないとレスポンスの取りこぼしが発生する場合があるので注意)
xhr.onload = (e) => { ... };
xhr.onerror = (e) => { ... };
xhr.abort = (e) => { ... };
xhr.timeout = (e) => { ... }
// xhr.onload = (e) => { ... }; は下記と同じ
// xhr.addEventListener("load", (e) => { ... });
// HTTPリクエストを送信
xhr.send(ボディ値 or null(ボディなし));