브라우저 객체(BOM)
모던 웹개발에서 XMLHttpRequest를 쓰는 이유 3가지:
1. 역사적인 이유: XMLHttpRequest를 사용하는 경우를 계속해서 지원해줘야함
2. 구형브라우저를 지원해주고 싶음(폴리필하는 방법 안쓰고도)
3.fetch
가 아직은 할 수 없는 것(예: track upload progress)을 해결하기 위해
🙄 여기서 잠깐!!
fetch가track upload progress
를 아직은 할 수 없다고 하네!
로딩의 프로그래스를 구현하려면 어떻게해야하징?!
그럴땐 XMLHttpRequest를 이용하는 방법밖에는 없는 건가?
let xhr = new XMLHttpRequest();
// 여기서 open은 이름과는 달리 connection을 연결하는 것이 아니라, request 설정을 하는 것임
// connection 연결은 xhr.opend()을 실행해야 시작됨
// timeout 설정도 할 수 있음, 설정된 시간내에 응답이 안오면, timeout 이벤트 발생
xhr.timeout = 10000; // timeout in ms, 10 seconds
// xhr.open(method, URL, [async, user, password]);
xhr.open('GET', '/article/xmlhttprequest/example/load');
// reponse 데이터의 타입을 설정할 수 있음 (디폴트는 문자열)
// 구형브라우저는 xhr.responseText과 xhr.responseXML이 있음
xhr.responseType = 'json';
xhr.send([body]);
Error ${xhr.status}: ${xhr.statusText}
); // e.g. 404: Not FoundDone, got ${xhr.response.length} bytes
); // response is the serverReceived ${event.loaded} of ${event.total} bytes
);Received ${event.loaded} bytes
); // no Content-Length
let xhr = new XMLHttpRequest();
// xhr.open(method, URL, [async, user, password]);
// async에 false를 넘기면, 동기적으로 요청을 함
xhr.open('GET', '/article/xmlhttprequest/hello.txt', false);
try {
xhr.send();
if (xhr.status != 200) {
alert(`Error ${xhr.status}: ${xhr.statusText}`);
} else {
alert(xhr.response);
}
} catch(err) { // instead of onerror
alert("Request failed");
}
UNSENT = 0; // initial state
OPENED = 1; // open called
HEADERS_RECEIVED = 2; // response headers received
LOADING = 3; // response is loading (a data packed is received)
DONE = 4; // request complete
xhr.onreadystatechange = function() {
if (xhr.readyState == 3) {
// loading
}
if (xhr.readyState == 4) {
// request finished
}
};
load
함수 밖에서 없어서 readystatechange 리스너를 사용할 수 밖에 없었음. 하지만 지금은 load/error/progress
handlers가 있으니까 크게 필요없어짐!