XMLHttpRequest
μλ²μμ λΉλκΈ° λ°μ΄ν° ν΅μ μ νκΈ° μν΄μ XMLHttpRequest κ°μ²΄λ₯Ό ν  μ μλ€.
κΈ°μ‘΄μ μλ°μ€ν¬λ¦½νΈμ ajax μ μ¬μ©νλ κ²κ³Ό λμΌνλ€.
1. HTTP Request μμ±
λͺ¨λ λΈλΌμ°μ μμ μ¬μ© κ°λ₯ν μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
var xhr
if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
 2. μλ΅ λ°μ΄ν°λ₯Ό μ²λ¦¬ν  callback ν¨μλ₯Ό μ μ
 var successCallback = function () {
    // μλ²μμ λ°μ μλ΅μ νλ‘μΈμ±
}
xhr.onreadystatechange = successCallback;
3. μμ² (Request) μ μλ΅ (Response) μ μ μ
xhr.open('GET', '/json', true);
xhr.send(null);
openParameter- method
- GET, POST, HEAD
 - λλ¬Έμ λ‘ νκΈ°νλ κ²μ κΆνλ€ (μΌλΆ λΈλΌμ°μ μμλ λΉ λμν μ μμ)
 
 - url
- μμ²ν μλ²μ κ²½λ‘λ₯Ό μ λ ₯νλ€.
 
 - async
- μν λ°©μμ κ²°μ νλ€ (λκΈ° / λΉ λκΈ°)
 
 
- method
 sendParameter- POST λ°©μμΌλ‘ μꡬ ν κ²½μ° μλ²λ‘ λ³΄λΌ λ°μ΄ν°λ₯Ό μ μνλ€
 json,soapνΉμ 쿼리 μ€νΈλ§μΌλ‘ νν κ°λ₯
POST λ‘ ν΅μ ν κ²½μ° μμ² (request) MINE typeμ μ€μ  ν΄μΌ ν©λλ€.
μλ₯Ό λ€λ©΄sendλ₯Ό νΈμΆνκΈ° μ μ μλμ κ°μ ννλ‘sendλ‘ λ³΄λΌ μΏΌλ¦¬λ₯Ό μ΄μ©ν΄μΌ νλ€.
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
4. μλ΅ λ°μ΄ν° μ²λ¦¬
λ°μ΄ν° μμ² (request) νμμλμ μλ΅ (response) μ²λ¦¬λ₯Ό ν΄μΌ νλ€.
μλ΅μ μ¬μ©λλ callback ν¨μμμ XMLHttpRequest κ°μ²΄λ readyState λ€μκ³Ό κ°μ μλ΅ μꡬ μνκ°μ κ°μ§λ€.
readyState κ° κ°μ§ μ μλ μλ΅ μν κ°
- 0 (uninitialized)
- κ°μ²΄κ° λ§ μμ±λμλ€.
 openλ©μλκ° μν λμ§ μμλ€.
 - 1 (loading)
sendλ©μλκ° μν λμ§ μμλ€.
 - 2 (loaded)
sendλ©μλκ° μν λμμ§λ§ μμ² ν€λλ₯Ό μ¬μ©ν μ μλ€.
 - 3 (interactive)
- μΌλΆ λ°μ΄ν°λ§ μμ ν μνμ΄λ©°, μν λ° μλ΅ ν€λλ μ¬μ©κ°λ₯
 - μμ² μνμ€
 
 - 4 (complete)
- μμ²ν λ°μ΄ν°λ₯Ό μ λΆ λ°μ μνμ΄λ€.
 - μμ² λ° μλ΅μ΄ μλ£λ¨
 
 
λμΌνκ²  XMLHttpRequest κ°μ²΄λ state λ€μκ³Ό κ°μ μνκ°μ κ°μ§λ€.
- 200
- μ μ
 
 - 403
- κΆν λΆμ‘± νΉμ μ κ·Ό κΈμ§
 
 - 404
- νμ΄μ§λ₯Ό μ°Ύμ μ μμ
 
 
var successCallback = function () {
    if (xhr.readState === 4 && xhr.status === 200) {
        console.log('Success');
    } else {
        console.log('Failed');
    }
}
5. μ΅μ’ μλ£ μ½λ
var xhr = new XMLHttpRequest();
xhr.open('GET', '/json', true);
xhr.onreadystatechange = function (obj) {
    if (xhr.readyState === 4 && xhr.status === 200) {
        /* μ±κ³΅ μ½λ */
        var responseObj = JSON.stringify(xhr.responseText);
    } else {
        /* μ€ν¨ μ½λ */
    }
};
xhr.send(null);
νλ‘κ·Έλμ€ λͺ¨λν°λ§
XMLHttpRequest κ° μ§μνλ nsIJSXMLHttpRequest μΈν°νμ΄μ€λ μμ²μ΄ μ²λ¦¬λλ λμ λ°μλλ μ΄λ²€νΈκ° μμ  κ°λ₯νλ©° μ£ΌκΈ°μ μΈ μ§νμν μλ¦Ό λ° μλ¬ μλ¦Ό λ±μ νμΈ κ°λ₯ νλ€
var onProgress = function (e) {
    var percent = (e.position / e.totalSize) * 100;
    ...
}
var onError = function (e) {
    console.log('Error ', e.target.status, ' occurred while receving the document'); 
}
...
var xhr = new XMLHttpRequest();
xhr.open('GET', '/json', true);
xhr.onprogress = onProgress;
xhr.onload = onLoad;
xhr.onerror = onError;
xhr.send(null);
onprogress μ μμ±μΈ position κ³Ό totalSize λ λ°μ λ°μ΄ν°κ° λͺ λ°μ΄νΈμΈμ§, μ μ²΄ λ°μ΄ν° ν¬κΈ°κ° λͺ λ°μ΄νΈμΈμ§ κ°κ° λνλ
λλ€.
λͺ¨λ  μ΄λ²€νΈλ κ·Έμ λμνλ XMLHttpRequest λ₯Ό target μμ±μΌλ‘ κ°μ§κ³  μμ΅λλ€.
CORS κ΄λ ¨ μ€μ  μ΄μ
ν¬λ‘μ€ λλ©μΈκ°μ μΏ ν€ μ€μ μ λμ§ μκΈ° λλ¬Έμ μ μ± νΉμ λ°μ΄ν° λͺ μΈμ λ³κ²½μ ν΅ν΄ ν΄κ²°νλ€.
Request Header νΉμ Body μ νμν λ°μ΄ν°λ₯Ό μΆκ°νμ¬ λ³΄λ΄μ€λ€.
$.ajax({
    ...
    beforeSend: function (xhr) {
        xhr.setRequestHeader('param', $.cookie('value'));
    },
    ...
})
jQuery Ajax μ¬μ©μμλ λ€μκ³Ό κ°μ΄ μ¬μ©
$.ajax({
    ...
    xhrFields: { withCredentials: true },
    ...
})
jQuery 1.5.1 μμ μΆκ°λ κΈ°λ₯ μΌλ‘ ν΄λΉ νμ λ²μ μ μ§μ λΆκ°
β Window Intersection Observer β