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 의 확장(예: 진행 이벤트 및 교차 출처 요청)은 별도의 초안(XMLHttpRequest Level 2)으로 2011년 말까지 개발되었으며, 그 후 두 초안이 병합되어 표준 관점에서 XMLHttpRequest 는 다시 하나의 엔터티가 되었습니다. 2012년 말에는 WHATWG로 다시 이동했습니다.

현재 초안으로 이어진 논의는 다음 메일링 리스트 아카이브에서 찾을 수 있습니다:

2. 용어

이 명세는 Infra 표준에 의존합니다. [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 객체.
상태
unsent, opened, headers received, loading, done 중 하나; 초기값은 unsent.
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 객체는 상태opened이고 send() 플래그가 설정되었거나, headers received, 또는 loading이며, 이벤트 리스너가 등록되어 있고, 해당 타입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 getter 단계는 아래 표에서 첫 번째 열의 값이 this상태인 행에서 두 번째 열의 값을 반환하는 것입니다:

unsent UNSENT (숫자 값 0) 객체가 생성되었습니다.
opened OPENED (숫자 값 1) open() 메서드가 성공적으로 호출되었습니다. 이 상태에서는 요청 헤더를 setRequestHeader() 메서드를 사용하여 설정할 수 있으며, send() 메서드를 사용하여 페치를 시작할 수 있습니다.
headers received HEADERS_RECEIVED (숫자 값 2) 모든 리디렉션(있는 경우)이 따라졌으며 응답의 모든 헤더가 수신되었습니다.
loading LOADING (숫자 값 3) 응답 본문이 수신되고 있습니다.
done DONE (숫자 값 4) 데이터 전송이 완료되었거나 전송 중에 문제가 발생했습니다(e.g., 무한 리디렉션).

3.5. 요청

XMLHttpRequestUpload 객체에 하나 이상의 이벤트 리스너를 등록하면 CORS-사전 요청이 발생합니다. (이유는 이벤트 리스너를 등록하면 업로드 리스너 플래그가 설정되고, 이는 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 는 최종 사용자 경험에 해로운 영향을 미치기 때문에 웹 플랫폼에서 제거되는 과정에 있습니다. (이는 여러 해에 걸친 긴 과정입니다.) 개발자는 현재 전역 객체Window 객체일 때 async 인수로 false를 전달해서는 안 됩니다. 사용자 에이전트는 개발자 도구에서 이러한 사용에 대해 강력하게 경고하도록 권장되며, 발생 시 "InvalidAccessError" DOMException 을 던지는 실험을 수행할 수 있습니다.

open(method, url)open(method, url, async, username, password) 메서드 단계는 다음과 같습니다:

  1. 만약 this관련 전역 객체(relevant global object)Window 객체이고 그 객체의 연결된 Document완전히 활성화(fully active)되지 않았다면, throw an "InvalidStateError" DOMException.

  2. 만약 methodmethod가 아니라면, throw an "SyntaxError" DOMException.

  3. 만약 method금지된 메서드(forbidden method)라면, throw an "SecurityError" DOMException.

  4. method를 정규화합니다.

  5. parsedURLURL을 인코딩-파싱한 결과로 설정합니다. 이는 this관련 설정 객체를 기준으로 수행됩니다.

  6. 만약 parsedURL이 실패(failure)라면, throw an "SyntaxError" DOMException.

  7. async 인수가 생략된 경우, async를 true로 설정하고, usernamepassword를 null로 설정합니다.

    레거시 콘텐츠로 인해 async 인수가 undefined일 때와 생략될 때를 동일하게 처리하는 것이 불가능합니다.

  8. parsedURLhost가 null이 아니라면:

    1. username 인수가 null이 아니면, parsedURL과 username을 사용하여 username을 설정합니다.

    2. password 인수가 null이 아니면, parsedURL과 password를 사용하여 password를 설정합니다.

  9. 만약 async가 false이고, 현재 전역 객체(current global object)Window 객체이며, thistimeout이 0이 아니거나 thisresponse type이 빈 문자열이 아니라면, throw an "InvalidAccessError" DOMException.

  10. this의 fetch 컨트롤러를 종료합니다.

    fetch가 이 시점에서 진행 중일 수 있습니다.

  11. 객체와 관련된 변수를 다음과 같이 설정합니다:

    MIME 유형 재정의overrideMimeType() 메서드가 open() 메서드 전에 호출될 수 있으므로 여기에서 재정의되지 않습니다.

  12. 상태opened가 아니면:

    1. 상태를 opened로 설정합니다.

    2. readystatechange 이벤트를 발생시킵니다.

open() 메서드가 두 개 정의된 이유는 XMLHttpRequest 표준을 작성하는 데 사용된 편집 소프트웨어의 제한 때문입니다.

3.5.2. setRequestHeader() 메서드

client . setRequestHeader(name, value)

기존 요청 헤더에 값을 추가하거나 새로운 요청 헤더를 추가합니다.

"InvalidStateError" DOMException 을 던집니다. 만약 상태opened이 아니거나 send() 플래그가 설정되어 있는 경우.

"SyntaxError" DOMException 을 던집니다. 만약 name이 헤더 이름이 아니거나 value가 헤더 값이 아닌 경우.

setRequestHeader(name, value) 메서드는 다음 단계를 실행해야 합니다:

  1. this상태opened이 아니면, "InvalidStateError" DOMException을 던집니다.

  2. thissend() 플래그가 설정되어 있으면, "InvalidStateError" DOMException을 던집니다.

  3. value를 정규화합니다.

  4. name헤더 이름이 아니거나 value헤더 값이 아니면, "SyntaxError" DOMException을 던집니다.

    빈 바이트 시퀀스는 빈 헤더 값을 나타냅니다.

  5. (name, value)가 금지된 요청 헤더라면, 반환합니다.

  6. this의 작성자 요청 헤더에 (name, value)를 결합합니다.

같은 헤더를 두 번 설정할 때의 결과를 보여주는 간단한 코드 예제:

// 다음 스크립트:
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 getter와 setter

client . timeout

밀리초 단위로 시간을 설정할 수 있습니다. 0이 아닌 값으로 설정되면 지정된 시간이 지난 후 fetch가 종료됩니다. 시간이 지나고 요청이 아직 완료되지 않았으며, this동기 플래그가 해제된 경우, timeout 이벤트가 디스패치되거나, 그렇지 않으면 (예: send() 메서드에 대해) "TimeoutError" DOMException던져집니다.

설정 시: "InvalidAccessError" DOMException을 던집니다. 만약 동기 플래그가 설정되어 있고, 현재 전역 객체Window 객체인 경우.

timeout getter 단계는 thistimeout을 반환하는 것입니다.

timeout setter 단계는 다음과 같습니다:

  1. 만약 현재 전역 객체Window 객체이고, this동기 플래그가 설정되어 있으면, "InvalidAccessError" DOMException을 던집니다.

  2. thistimeout을 주어진 값으로 설정합니다.

이것은 timeout 속성이 fetch가 진행 중일 때 설정될 수 있음을 의미합니다. 이 경우에도 이는 fetch가 시작된 시점을 기준으로 측정됩니다.

3.5.4. withCredentials getter와 setter

client . withCredentials

교차 출처 요청에서 자격 증명을 포함할 때 true입니다. 교차 출처 요청에서 이를 제외하고 응답에서 쿠키를 무시할 때는 false입니다. 기본값은 false입니다.

설정 시: 만약 상태unsent 또는 opened가 아니거나, send() 플래그가 설정된 경우, "InvalidStateError" DOMException을 던집니다.

withCredentials getter 단계는 this교차 출처 자격 증명을 반환하는 것입니다.

withCredentials setter 단계는 다음과 같습니다:

  1. this상태unsent 또는 opened가 아니면, "InvalidStateError" DOMException을 던집니다.

  2. thissend() 플래그가 설정되어 있으면, "InvalidStateError" DOMException을 던집니다.

  3. this교차 출처 자격 증명을 주어진 값으로 설정합니다.

3.5.5. upload getter

client . upload

연관된 XMLHttpRequestUpload 객체를 반환합니다. 이는 데이터를 서버로 전송할 때 전송 정보를 수집하는 데 사용될 수 있습니다.

upload getter 단계는 this업로드 객체를 반환하는 것입니다.

3.5.6. send() 메서드

client . send([body = null])

요청을 시작합니다. body 인수는 요청 본문을 제공하며(있는 경우), 요청 메서드GET 또는 HEAD인 경우 무시됩니다.

만약 상태opened가 아니거나 send() 플래그가 설정된 경우, "InvalidStateError" DOMException을 던집니다.

send(body) 메서드 단계는 다음과 같습니다:

  1. 만약 thisstateopened가 아니라면, throw an "InvalidStateError" DOMException.

  2. 만약 thissend() 플래그가 설정되어 있다면, throw an "InvalidStateError" DOMException.

  3. 만약 this요청 메서드가 `GET` 또는 `HEAD`라면, body를 null로 설정합니다.

  4. 만약 body가 null이 아니면:

    1. extractedContentType을 null로 설정합니다.

    2. 만약 bodyDocument 라면, this요청 본문body, 직렬화된, 변환된, 그리고 UTF-8 인코딩된 값으로 설정합니다.

    3. 그 외의 경우:

      1. bodyWithTypebody를 안전하게 추출한 결과로 설정합니다.

      2. this요청 본문bodyWithType본문으로 설정합니다.

      3. extractedContentTypebodyWithType유형으로 설정합니다.

    4. originalAuthorContentTypethis의 작성자 요청 헤더에서 `Content-Type`를 가져온 결과로 설정합니다.

    5. 만약 originalAuthorContentType이 null이 아니면:

      1. 만약 bodyDocument 또는 USVString 이라면:

        1. contentTypeRecordoriginalAuthorContentType을 파싱한 결과로 설정합니다.

        2. 만약 contentTypeRecord가 실패하지 않았고, contentTypeRecord매개변수["charset"]이 존재하며, 매개변수["charset"]이 "UTF-8"와 ASCII 대소문자 구분 없이 일치하지 않는다면:

          1. contentTypeRecord의 매개변수["charset"]을 "UTF-8"로 설정합니다.

          2. newContentTypeSerializedcontentTypeRecord를 직렬화한 결과로 설정합니다.

          3. this의 작성자 요청 헤더에 (`Content-Type`, newContentTypeSerialized)을 설정합니다.

    6. 그 외의 경우:

      1. 만약 bodyHTML 문서라면, this의 작성자 요청 헤더에 (`Content-Type`, `text/html;charset=UTF-8`)을 설정합니다.

      2. 그 외의 경우, 만약 bodyXML 문서라면, this의 작성자 요청 헤더에 (`Content-Type`, `application/xml;charset=UTF-8`)을 설정합니다.

      3. 그 외의 경우, 만약 extractedContentType이 null이 아니면, this의 작성자 요청 헤더에 (`Content-Type`, extractedContentType)을 설정합니다.

  5. 만약 this업로드 객체에 하나 이상의 이벤트 리스너가 등록되어 있다면, this업로드 리스너 플래그를 설정합니다.

  6. req를 아래와 같이 초기화한 새로운 요청(request)으로 설정합니다:

    메서드
    this요청 메서드.
    URL
    this요청 URL.
    헤더 목록
    this작성자 요청 헤더.
    비안전 요청 플래그
    설정됨.
    본문(body)
    this요청 본문.
    클라이언트
    this관련 설정 객체.
    모드
    "cors".
    use-CORS-preflight 플래그
    만약 this업로드 리스너 플래그가 설정되어 있다면 설정됩니다.
    자격 증명 모드
    만약 this교차 출처 자격 증명이 true라면, "include"; 아니라면 "same-origin".
    use-URL-credentials 플래그
    만약 this요청 URL자격 증명을 포함한다면 설정됩니다.
    초기화자 타입
    "xmlhttprequest".
  7. this업로드 완료 플래그를 해제합니다.

  8. this시간 초과 플래그를 해제합니다.

  9. 만약 req본문(body)이 null이라면, this업로드 완료 플래그를 설정합니다.

  10. thissend() 플래그를 설정합니다.

  11. 만약 this동기 플래그가 해제되어 있다면:

    1. 진행(progress) 이벤트loadstartthis에서 0과 0을 사용해 발생시킵니다.

    2. requestBodyTransmitted를 0으로 설정합니다.

    3. requestBodyLengthreq본문(body)길이로 설정합니다. 만약 req본문(body)이 null이 아니라면; 그렇지 않으면 0으로 설정합니다.

    4. 단언: requestBodyLength는 정수입니다.

    5. 만약 this업로드 완료 플래그가 해제되어 있고, this업로드 리스너 플래그가 설정되어 있다면, 진행(progress) 이벤트loadstartthis업로드 객체에서 requestBodyTransmittedrequestBodyLength로 발생시킵니다.

    6. 만약 this상태opened가 아니거나, thissend() 플래그가 해제된 경우, 반환합니다.

    7. processRequestBodyChunkLengthbytesLength로 주어진 단계로 설정합니다:

      1. requestBodyTransmittedbytesLength를 더합니다.

      2. 이 단계가 마지막으로 호출된 이후 대략 50ms가 지나지 않은 경우 반환합니다.

      3. 만약 this업로드 리스너 플래그가 설정되어 있다면, 진행(progress) 이벤트progressthis업로드 객체에서 requestBodyTransmittedrequestBodyLength로 발생시킵니다.

      이 단계는 새로운 바이트가 전송될 때만 호출됩니다.

    8. processRequestEndOfBody를 아래 단계로 설정합니다:

      1. this업로드 완료 플래그를 설정합니다.

      2. 만약 this업로드 리스너 플래그가 해제되어 있다면, 반환합니다.

      3. 진행(progress) 이벤트progressthis업로드 객체에서 requestBodyTransmittedrequestBodyLength로 발생시킵니다.

      4. 진행(progress) 이벤트loadthis업로드 객체에서 requestBodyTransmittedrequestBodyLength로 발생시킵니다.

      5. 진행(progress) 이벤트loadendthis업로드 객체에서 requestBodyTransmittedrequestBodyLength로 발생시킵니다.

    9. processResponseresponse로 주어진 아래 단계로 설정합니다:

      1. this응답(response)response로 설정합니다.

      2. 오류를 처리합니다. 대상: this.

      3. 만약 this응답(response)네트워크 오류라면, 반환합니다.

      4. this상태headers received로 설정합니다.

      5. 이벤트를 발생시킵니다. 이름: readystatechange. 대상: this.

      6. 만약 this상태headers received가 아니라면, 반환합니다.

      7. 만약 this응답(response)본문(body)이 null이라면, 응답 본문 종료를 처리하고 반환합니다. 대상: this.

      8. length헤더 목록에서 길이를 추출한 결과로 설정합니다. 대상: this응답(response).

      9. 만약 length가 정수가 아니라면, 0으로 설정합니다.

      10. processBodyChunkbytes로 주어진 아래 단계로 설정합니다:

        1. bytesthis수신된 바이트(received bytes)에 추가합니다.

        2. 이 단계가 마지막으로 호출된 이후 대략 50ms가 지나지 않은 경우, 반환합니다.

        3. 만약 this상태headers received라면, this상태loading으로 설정합니다.

        4. 이벤트를 발생시킵니다. 이름: readystatechange. 대상: this.

          웹 호환성 때문에 readystatechange 이벤트가 this상태 변경보다 더 자주 발생합니다.

        5. 진행(progress) 이벤트progressthis에서 this수신된 바이트(received bytes)길이length로 발생시킵니다.

      11. processEndOfBody를 아래 단계로 설정합니다: 응답 본문 종료를 처리합니다. 대상: this.

      12. processBodyError를 아래 단계로 설정합니다:

        1. this응답(response)네트워크 오류로 설정합니다.

        2. 오류를 처리합니다. 대상: this.

      13. this의 응답 본문을 점진적으로 읽습니다. 대상: this, 추가 단계: processBodyChunk, processEndOfBody, processBodyError, 그리고 this관련 전역 객체.

    10. thisfetch 컨트롤러req를 fetch한 결과로 설정합니다. 이때 processRequestBodyChunkLengthprocessRequestBodyChunkLength로, processRequestEndOfBodyprocessRequestEndOfBody로, processResponseprocessResponse로 설정합니다.

    11. now를 현재 시간으로 설정합니다.

    12. 다음 단계를 병렬로 실행합니다:

      1. reqdone 플래그가 설정되거나, thistimeout이 0이 아니고 thistimeout 밀리초가 now 이후로 경과될 때까지 대기합니다.

      2. 만약 reqdone 플래그가 해제된 경우, this시간 초과 플래그를 설정하고, this의 fetch 컨트롤러를 종료합니다.

  12. 그렇지 않고, 만약 this동기 플래그가 설정되어 있다면:

    1. processedResponse를 false로 설정합니다.

    2. processResponseConsumeBody를 아래 단계로 설정합니다. 매개변수로는 responsenullOrFailureOrBytes를 받습니다:

      1. 만약 nullOrFailureOrBytes가 실패가 아니라면, this응답(response)response로 설정합니다.

      2. 만약 nullOrFailureOrBytes바이트 시퀀스라면, nullOrFailureOrBytesthis수신된 바이트(received bytes)에 추가합니다.

      3. processedResponse를 true로 설정합니다.

    3. thisfetch 컨트롤러req를 fetch한 결과로 설정합니다. 이때 processResponseConsumeBodyprocessResponseConsumeBody로, useParallelQueue는 true로 설정합니다.

    4. now를 현재 시간으로 설정합니다.

    5. 중지합니다. 이때 조건은 processedResponse가 true이거나, thistimeout이 0이 아니고 thistimeout 밀리초가 now 이후로 경과했을 때까지입니다.

    6. 만약 processedResponse가 false라면, this시간 초과 플래그를 설정하고, this의 fetch 컨트롤러를 종료합니다.

    7. 타이밍을 보고합니다. 대상: thisfetch 컨트롤러. 추가 조건: 현재 전역 객체.

    8. 응답 본문 종료를 처리합니다. 대상: this.

응답 본문 종료 처리XMLHttpRequest 객체 xhr에 대해 실행하려면, 다음 단계를 수행하십시오:

  1. 오류를 처리합니다. 대상: xhr.

  2. 만약 xhr응답네트워크 오류라면, 반환합니다.

  3. transmittedxhr수신된 바이트길이로 설정합니다.

  4. length길이를 추출한 결과로 설정합니다. 대상: this응답헤더 목록.

  5. 만약 length가 정수가 아니라면, 0으로 설정합니다.

  6. 만약 xhr동기 플래그가 해제되어 있다면, 진행 이벤트를 발생시킵니다. 이름: progress. 대상: xhr, 매개변수: transmittedlength.

  7. xhr상태done으로 설정합니다.

  8. xhrsend() 플래그를 해제합니다.

  9. 이벤트를 발생시킵니다. 이름: readystatechange. 대상: xhr.

  10. 진행 이벤트를 발생시킵니다. 이름: load. 대상: xhr, 매개변수: transmittedlength.

  11. 진행 이벤트를 발생시킵니다. 이름: loadend. 대상: xhr, 매개변수: transmittedlength.

XMLHttpRequest 객체 xhr오류를 처리(handle errors)하려면, 다음 단계를 실행하십시오:

  1. 만약 xhrsend() 플래그가 해제되어 있다면, 반환합니다.

  2. 만약 xhr시간 초과 플래그가 설정되어 있다면, 요청 오류 단계를 실행합니다. 대상: xhr, timeout, "TimeoutError" DOMException.

  3. 그렇지 않고, 만약 xhr응답중단 플래그가 설정되어 있다면, 요청 오류 단계를 실행합니다. 대상: xhr, abort, "AbortError" DOMException.

  4. 그렇지 않고, 만약 xhr응답네트워크 오류라면, 요청 오류 단계를 실행합니다. 대상: xhr, error, "NetworkError" DOMException.

요청 오류 단계XMLHttpRequest 객체 xhr, event 및 선택적으로 exception에 대해 실행하려면:

  1. xhr상태done으로 설정합니다.

  2. xhrsend() 플래그를 해제합니다.

  3. xhr응답네트워크 오류로 설정합니다.

  4. 만약 xhr동기 플래그가 설정되어 있다면, exception을 던집니다.

  5. 이벤트를 발생시킵니다. 이름: readystatechange. 대상: xhr.

    이 시점에서 xhr동기 플래그가 해제되어 있음이 명확합니다.

  6. 만약 xhr업로드 완료 플래그가 해제되어 있다면:

    1. xhr업로드 완료 플래그를 설정합니다.

    2. 만약 xhr업로드 리스너 플래그가 설정되어 있다면:

      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상태opened이고, thissend() 플래그가 설정되어 있거나, headers received, 또는 loading이라면, 요청 오류 단계를 실행합니다. 대상: thisabort.

  3. 만약 this상태done이라면, this상태unsent로 설정하고, this응답네트워크 오류로 설정합니다.

    readystatechange 이벤트는 디스패치되지 않습니다.

3.6. 응답

3.6.1. responseURL getter

responseURL getter 단계는 this응답URL이 null이라면 빈 문자열을 반환합니다. 그렇지 않으면, exclude fragment flag가 설정된 직렬화된 값을 반환합니다.

3.6.2. status getter

status getter 단계는 this응답상태를 반환합니다.

3.6.3. statusText getter

statusText getter 단계는 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() 메서드

바이트 시퀀스 alegacy-uppercased-byte보다 작은 바이트 시퀀스 b라면, 다음 단계가 true를 반환합니다:

  1. Aabyte-uppercased 값으로 설정합니다.

  2. Bbbyte-uppercased 값으로 설정합니다.

  3. A바이트 기준으로 작은지 B와 비교해 반환합니다.

getAllResponseHeaders() 메서드 단계는 다음과 같습니다:

  1. output을 빈 바이트 시퀀스로 설정합니다.

  2. initialHeaders정렬 및 결합 결과로 설정합니다. 대상: this응답헤더 목록.

  3. headersinitialHeaders오름차순 정렬한 결과로 설정합니다. 조건: a이름legacy-uppercased-byte 기준으로 b이름보다 작다면.

    안타깝게도, 이는 배포된 콘텐츠와의 호환성을 위해 필요합니다.

  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. 응답 본문

응답 MIME 타입 가져오기XMLHttpRequest 객체 xhr에 대해 실행하려면, 다음 단계를 따르십시오:

  1. mimeTypeMIME 타입 추출 결과로 설정합니다. 대상: xhr응답헤더 목록.

  2. 만약 mimeType이 실패라면, mimeTypetext/xml로 설정합니다.

  3. mimeType을 반환합니다.

최종 MIME 타입 가져오기XMLHttpRequest 객체 xhr에 대해 실행하려면, 다음 단계를 따르십시오:

  1. 만약 xhroverride MIME 타입이 null이라면, 응답 MIME 타입 가져오기 결과를 반환합니다. 대상: xhr.

  2. xhroverride MIME 타입을 반환합니다.

최종 인코딩 가져오기XMLHttpRequest 객체 xhr에 대해 실행하려면, 다음 단계를 따르십시오:

  1. label을 null로 설정합니다.

  2. responseMIME응답 MIME 타입 가져오기 결과로 설정합니다. 대상: xhr.

  3. 만약 responseMIME매개변수["charset"]이 존재하면, label을 해당 값으로 설정합니다.

  4. 만약 xhroverride MIME 타입매개변수["charset"]이 존재하면, label을 해당 값으로 설정합니다.

  5. 만약 label이 null이라면, null을 반환합니다.

  6. encoding인코딩 가져오기 결과로 설정합니다. 대상: label.

  7. 만약 encoding이 실패라면, null을 반환합니다.

  8. encoding을 반환합니다.

위 단계는 최종 MIME 타입 가져오기를 사용하지 않도록 의도적으로 설계되었습니다. 이는 웹 호환성을 위해 필요합니다.


문서 응답 설정XMLHttpRequest 객체 xhr에 대해 실행하려면, 다음 단계를 따르십시오:

  1. 만약 xhr응답본문(body)이 null이라면, 반환합니다.

  2. finalMIME최종 MIME 타입 가져오기 결과로 설정합니다. 대상: xhr.

  3. 만약 finalMIMEHTML MIME 타입 또는 XML MIME 타입이 아니라면, 반환합니다.

  4. 만약 xhr응답 타입이 빈 문자열이고, finalMIMEHTML MIME 타입이라면, 반환합니다.

    이는 xhr응답 타입이 "document"인 경우로 제한되어 기존 콘텐츠를 깨뜨리는 것을 방지합니다.

  5. 만약 finalMIMEHTML MIME 타입이라면:

    1. charset최종 인코딩 가져오기 결과로 설정합니다. 대상: xhr.

    2. 만약 charset이 null이라면, 바이트 스트림의 처음 1024 바이트를 사전 스캔합니다. 이 작업이 실패하지 않으면, charset을 해당 반환값으로 설정합니다.

    3. 만약 charset이 null이라면, charsetUTF-8로 설정합니다.

    4. document문서(document)로 설정합니다. 이는 HTML 표준의 HTML 파서 규칙에 따라 스크립팅이 비활성화된 상태로 xhr수신된 바이트를 구문 분석한 결과를 나타냅니다. 이때 확실히 알려진 인코딩charset입니다. [HTML]

    5. documentHTML 문서로 플래그를 설정합니다.

  6. 그 외의 경우, document문서(document)로 설정합니다. 이는 XML 파서XML 스크립팅 지원 비활성화 상태로 xhr수신된 바이트에서 실행한 결과를 나타냅니다. 이 작업이 실패하면(지원되지 않는 문자 인코딩, 네임스페이스 잘못된 형식 오류 등), null을 반환합니다. [HTML]

    참조된 리소스는 로드되지 않으며, 관련된 XSLT도 적용되지 않습니다.

  7. 만약 charset이 null이라면, charsetUTF-8로 설정합니다.

  8. document인코딩charset으로 설정합니다.

  9. document컨텐츠 타입finalMIME으로 설정합니다.

  10. documentURLxhr응답URL로 설정합니다.

  11. document원점(origin)xhr관련 설정 객체원점(origin)으로 설정합니다.

  12. xhr응답 객체document로 설정합니다.

텍스트 응답 가져오기XMLHttpRequest 객체 xhr에 대해 실행하려면, 다음 단계를 따르십시오:

  1. 만약 xhr응답본문(body)이 null이라면, 빈 문자열을 반환합니다.

  2. charset최종 인코딩 가져오기 결과로 설정합니다. 대상: xhr.

  3. 만약 xhr응답 타입이 빈 문자열이고, charset이 null이며, 최종 MIME 타입 가져오기 결과가 XML MIME 타입이라면, XML 명세에 설정된 규칙을 사용해 인코딩을 결정합니다. charset을 결정된 인코딩으로 설정합니다. [XML] [XML-NAMES]

    이는 xhr응답 타입이 빈 문자열로 유지되도록 제한하며, 비-레거시 응답 타입 값 "text"를 간단하게 유지합니다.

  4. 만약 charset이 null이라면, charsetUTF-8로 설정합니다.

  5. 디코드를 실행한 결과를 반환합니다. 대상: xhr수신된 바이트, 사용된 폴백 인코딩: charset.

작성자는 항상 리소스를 UTF-8로 인코딩하도록 강력히 권장됩니다.

3.6.7. overrideMimeType() 메서드

client . overrideMimeType(mime)

응답의 `Content-Type` 헤더 값을 mime로 간주합니다. (헤더를 변경하지는 않습니다.)

InvalidStateError DOMException을 발생시킵니다. 조건: stateloading 또는 done인 경우.

overrideMimeType(mime) 메서드 단계는 다음과 같습니다:

  1. 만약 thisstateloading 또는 done이라면, 다음 예외를 발생시킵니다: "InvalidStateError" DOMException.

  2. thisoverride MIME 타입parsing mime 결과로 설정합니다.

  3. 만약 thisoverride MIME 타입이 실패라면, thisoverride MIME 타입application/octet-stream으로 설정합니다.

3.6.8. responseType getter 및 setter

client . responseType [ = value ]

응답 타입을 반환합니다.

응답 타입을 변경할 수 있습니다. 가능한 값은 다음과 같습니다: 빈 문자열(기본값), "arraybuffer", "blob", "document", "json", 그리고 "text".

설정 시: 현재 전역 객체Window 객체가 아닌 경우, "document"로 설정하는 것은 무시됩니다.

설정 시: InvalidStateError DOMException이 발생합니다. 조건: stateloading 또는 done인 경우.

설정 시: InvalidAccessError DOMException이 발생합니다. 조건: synchronous 플래그가 설정되어 있고, 현재 전역 객체Window 객체인 경우.

responseType getter 단계는 thisresponse type을 반환합니다.

responseType setter 단계는 다음과 같습니다:

  1. 현재 전역 객체Window 객체가 아니고, 주어진 값이 "document"인 경우, 반환합니다.

  2. 만약 thisstateloading 또는 done이라면, 다음 예외를 발생시킵니다: "InvalidStateError" DOMException.

  3. 만약 현재 전역 객체Window 객체이고, thissynchronous 플래그가 설정되어 있다면, 다음 예외를 발생시킵니다: "InvalidAccessError" DOMException.

  4. thisresponse type을 주어진 값으로 설정합니다.

3.6.9. response getter

client . response

응답 본문을 반환합니다.

response getter 단계는 다음과 같습니다:

  1. 만약 this응답 타입이 빈 문자열 또는 "text"라면:

    1. 만약 this상태loading 또는 done이 아니라면, 빈 문자열을 반환합니다.

    2. 텍스트 응답 가져오기 결과를 반환합니다. 대상: this.

  2. 만약 this상태done이 아니라면, null을 반환합니다.

  3. 만약 this응답 객체가 실패라면, null을 반환합니다.

  4. 만약 this응답 객체가 null이 아니라면, 이를 반환합니다.

  5. 만약 this응답 타입이 "arraybuffer"라면, this응답 객체새로운 ArrayBuffer 객체로 설정합니다. 이는 this수신된 바이트를 나타냅니다. 이 작업이 예외를 발생시키면, this응답 객체를 실패로 설정하고 null을 반환합니다.

    ArrayBuffer 객체를 할당하는 작업이 항상 성공하는 것은 아닙니다. [ECMASCRIPT]

  6. 그 외의 경우, 만약 this응답 타입이 "blob"라면, this응답 객체새로운 Blob 객체로 설정합니다. 이는 this수신된 바이트를 나타내며, 타입(type)최종 MIME 타입 가져오기 결과로 설정됩니다. 대상: this.

  7. 그 외의 경우, 만약 this응답 타입이 "document"라면, 문서 응답 설정을 실행합니다. 대상: this.

  8. 그 외의 경우:

    1. 단언: this응답 타입은 "json"입니다.

    2. 만약 this응답본문(body)이 null이라면, null을 반환합니다.

    3. jsonObject바이트에서 JSON 파싱 결과로 설정합니다. 대상: this수신된 바이트. 이 작업이 예외를 발생시키면, null을 반환합니다.

    4. this응답 객체jsonObject로 설정합니다.

  9. this응답 객체를 반환합니다.

3.6.10. responseText 가져오기

client . responseText

응답을 텍스트로 반환합니다.

InvalidStateError DOMException을 발생시킵니다. 조건: responseType이 빈 문자열 또는 "text"가 아닌 경우.

responseText getter 단계는 다음과 같습니다:

  1. 만약 this응답 타입이 빈 문자열 또는 "text"가 아니라면, 다음 예외를 발생시킵니다: "InvalidStateError" DOMException.

  2. 만약 this상태loading 또는 done이 아니라면, 빈 문자열을 반환합니다.

  3. 텍스트 응답 가져오기 결과를 반환합니다. 대상: this.

3.6.11. responseXML 가져오기

client . responseXML

응답을 문서로 반환합니다.

InvalidStateError DOMException을 발생시킵니다. 조건: responseType이 빈 문자열 또는 "document"가 아닌 경우.

responseXML getter 단계는 다음과 같습니다:

  1. 만약 this응답 타입이 빈 문자열 또는 "document"가 아니라면, 다음 예외를 발생시킵니다: "InvalidStateError" DOMException.

  2. 만약 this상태done이 아니라면, null을 반환합니다.

  3. 단언: this응답 객체는 실패가 아닙니다.

  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 객체에는 연관된 entry list (즉, entry list)가 있습니다. 이는 초기에는 비어 있습니다.

이 섹션은 이전에 entry, entry의 namevalue, 그리고 create an entry 알고리즘을 정의했습니다. 이러한 정의는 HTML 표준으로 이동되었습니다. [HTML]

new FormData(form, submitter) 생성자의 단계는 다음과 같습니다:

  1. form이 주어졌다면:

    1. submitter가 null이 아니라면:

      1. submittersubmit button이 아니라면, throw a TypeError.

      2. submitterform ownerform이 아니라면, throw a "NotFoundError" DOMException.

    2. listconstructing the entry list의 결과로 formsubmitter를 사용해 설정합니다.

    3. list가 null이라면, throw an "InvalidStateError" DOMException.

    4. thisentry listlist로 설정합니다.

append(name, value)append(name, blobValue, filename) 메소드의 단계는 다음과 같습니다:

  1. value를 주어진 경우 value로, 그렇지 않으면 blobValue로 설정합니다.

  2. entrycreating an entry의 결과로 name, valuefilename (주어진 경우)을 사용해 설정합니다.

  3. Append entrythisentry list에 추가합니다.

valueblobValue라는 매개변수가 존재하는 이유는 XMLHttpRequest 표준을 작성하는 데 사용된 편집 소프트웨어의 제한 때문입니다.

delete(name) 메서드의 단계는 모두 제거하는 것입니다. entrynamename인 항목을 thisentry list에서 제거합니다.

get(name) 메서드의 단계는 다음과 같습니다:

  1. 만약 entry가 없고 namename인 경우, thisentry list에서 null을 반환합니다.

  2. 첫 번째 value를 반환합니다. entrynamename인 경우, thisentry list에서 반환합니다.

getAll(name) 메서드의 단계는 다음과 같습니다:

  1. entry가 없고 namename인 경우, thisentry list에서 빈 리스트를 반환합니다.

  2. values를 반환합니다. entriesnamename인 경우, 순서대로 thisentry list에서 반환합니다.

has(name) 메서드의 단계는 entry가 있고 namename인 경우, thisentry list에서 true를 반환하고, 그렇지 않으면 false를 반환합니다.

set(name, value)set(name, blobValue, filename) 메서드의 단계는 다음과 같습니다:

  1. value를 주어진 경우 value로, 그렇지 않으면 blobValue로 설정합니다.

  2. entrycreating an entry의 결과로 name, value, 그리고 filename (주어진 경우)을 사용해 설정합니다.

  3. entries가 있고 thisentry list에서 namename인 경우, 첫 번째 entryentry로 교체하고 나머지를 제거합니다.

  4. 그렇지 않으면, append entrythisentry list에 추가합니다.

valueblobValue라는 매개변수가 존재하는 이유는 XMLHttpRequest 표준을 작성하는 데 사용된 편집 소프트웨어의 제한 때문입니다.

반복할 값 쌍thisentry listentries이며, 키는 name이고 값은 value입니다.

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 인터페이스를 사용하여 어떤 종류의 진행 상황을 나타냅니다.

lengthComputable, loaded, 그리고 total getter 단계는 이들이 초기화된 값을 반환하도록 합니다.

5.1. ProgressEvent 인터페이스를 사용하여 이벤트 발생

진행 이벤트를 발생시키려면 이름이 e이고 target, transmitted, length가 주어졌을 때, 이벤트를 발생시킨다 이름이 e이고 target에서, ProgressEvent를 사용하며, loaded 속성이 transmitted으로 초기화되고, length가 0이 아닌 경우, lengthComputable 속성이 true로 초기화되며, total 속성이 length로 초기화됩니다.

5.2. ProgressEvent 인터페이스를 사용하는 이벤트에 대한 권장 이름

이 섹션은 규범적이지 않습니다.

다음을 사용하는 경우 권장되는 type 속성 값은 이벤트입니다. ProgressEvent 인터페이스는 아래 표에 요약되어 있습니다. 사양 편집자는 특정 시나리오에 맞게 세부 사항을 조정할 수 있지만, 관련 주제에 익숙한 사람들의 의견을 받을 수 있도록 WHATWG 커뮤니티와 사용에 대해 논의할 것을 강력히 권장합니다.

type 속성 값 설명 횟수 시기
loadstart 진행이 시작되었습니다. 한 번. 처음.
progress 진행 중입니다. 한 번 이상. loadstart발생한 후.
error 진행 실패. 0회 또는 1회(상호 배타적). 마지막 progress발생한 후.
abort 진행이 종료되었습니다.
timeout 설정된 시간이 만료되어 진행이 종료되었습니다.
load 진행이 성공적으로 완료되었습니다.
loadend 진행이 중단되었습니다. 한 번. error, abort, timeout 또는 load 중 하나가 발생한 후.

error, abort, timeout, 그리고 load 이벤트 타입은 상호 배타적입니다.

웹 플랫폼 전반에서 error, abort, timeout, 그리고 load 이벤트 타입은 bubblescancelable 속성이 false로 초기화되므로, 일관성을 위해 이벤트ProgressEvent 인터페이스를 사용하여 동일하게 초기화하는 것이 제안됩니다.

5.3. 보안 고려 사항

교차 출처 요청의 경우, Fetch 표준에서 정의된 CORS 프로토콜과 같은 어떤 형태의 옵트인이 필요하며, 이는 이벤트ProgressEvent 인터페이스를 사용하여 디스패치 되기 전에 사용되어야 하며, 그렇지 않으면 정보(예: 크기)가 공개될 수 있습니다. [FETCH]

5.4. 예시

이 예시에서는 XMLHttpRequest와, 이전 섹션에서 정의된 개념들 그리고 HTML progress 요소를 결합하여 리소스를 페치(fetch)하는 과정을 표시합니다.

<!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 이 표준에 기여해 주신 모든 분들께 감사를 표합니다.

특별히 Microsoft 직원들에게 감사를 드립니다. 이들은 XMLHttpRequest 인터페이스를 처음 구현했으며, 이는 Windows Internet Explorer 브라우저에서 처음 널리 배포되었습니다.

특별히 Ian Hickson에게 감사를 드립니다. HTML 표준(당시 Web Applications 1.0)에서 이 사양의 초기 버전을 작성해 주셨습니다. [HTML]

특별히 W3C SVG WG에게 감사를 드립니다. 이들은 ProgressEvent 클래스를 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 하에 라이선스가 부여됩니다.

이는 현행 표준입니다. 특허 검토 버전에 관심이 있는 분은 Living Standard Review Draft를 확인하시기 바랍니다.

색인

이 사양에서 정의된 용어

참조에 의해 정의된 용어

참고 문헌

규범적 참고 문헌

[DOM]
Anne van Kesteren. DOM 표준. 현행 표준. URL: https://dom.spec.whatwg.org/
[DOM-PARSING]
Travis Leithead. DOM Parsing 및 Serialization. URL: https://w3c.github.io/DOM-Parsing/
[ECMASCRIPT]
ECMAScript 언어 사양. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. 인코딩 표준. 현행 표준. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch 표준. 현행 표준. URL: https://fetch.spec.whatwg.org/
[FILEAPI]
Marijn Kruisselbrink. 파일 API. URL: https://w3c.github.io/FileAPI/
[HTML]
Anne van Kesteren; et al. HTML 표준. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. 현행 표준. URL: https://infra.spec.whatwg.org/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing 표준. 현행 표준. URL: https://mimesniff.spec.whatwg.org/
[URL]
Anne van Kesteren. URL 표준. 현행 표준. 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 표준. 현행 표준. URL: https://webidl.spec.whatwg.org/
[XML]
Tim Bray; et al. Extensible Markup Language (XML) 1.0 (5판). 2008년 11월 26일. REC. URL: https://www.w3.org/TR/xml/
[XML-NAMES]
Tim Bray; et al. Namespaces in XML 1.0 (3판). 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+