- 비동기 자바스크립트와 XML (Asynchronous JavaScript And XML)을 말함
- 자바스크립트를 이용해서 비동기식으로 XML을 이용하여 서버와 통신하는 방식
🖊️가능한 작업
- 페이지 새로고침 없이 서버에 요청
- 서버로부터 데이터를 받고 작업을 수행
📌 클라이언트 풀링(client pooling)방식이란?
- 사용자가 직접 원하는 정보를 서버에게 요청하여 얻는 방식
📌 서버 푸시(server pushing) 방식이란?
- 사용자가 요청하지 않아도 서버가 알아서 자동으로 특정 정보를 제공하는 것
- AJAX를 이용한 웹 응용 프로그램은 자바스크립트 코드를 통해 웹서버와 통신을 함
사용자에 의한 요청이벤트 발생
요청이벤트가 발생하면 event handler에 의해 자바스크립트가 호출됨
자바스크립트는 XMLHttpRequest 객체를 사용하여 서버로 요청을 보냄
(웹 브라우저는 요청을 보내고 나서 서버의 응답을 기다릴 필요없이 다른 작업 처리 가능)
서버는 전달받은 XMLHttpRequest 객체를 가지고 AJAX 요청을 처리
5,6. 서버는 처리한 결과를 HTML, XML 또는 JSON형태의 테이터로 웹브라우저에 전달
var 변수이름 = new XMLHttpRequest();
서버로 보낼 AJAX 요청의 형식을 설정
open(전달방식,url주소,동기여부);
send() // GET 방식
send(문자열) //POST 방식
// GET 방식으로 요청을 보내면서 데이터를 동시에 전달함.
httpRequest.open("GET", "/examples/media/request_ajax.php?city=Seoul&zipcode=06141", true);
httpRequest.send();
if (httpRequest.readyState == XMLHttpRequest.DONE && httpRequest.status == 200 ) {
...
}
// httpRequest.readyState == XMLHttpRequest.DONE : 서버에 요청한 데이터의 처리가 완료되어 응답할 준비가 완료됨
// httpRequest.status == 200 : 요청한 문서가 서버 상에 존재함
// POST 방식의 요청은 데이터를 Http 헤더에 포함시켜 전송함.
httpRequest.open("POST", "/examples/media/request_ajax.php", true);
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
httpRequest.send("city=Seoul&zipcode=06141");
XMLHttpRequest 객체의 property
XMLHttpRequest 객체의 현재 상태
서버의 문서상태
XMLHttpRequest 객체의 readyState property 값이 변할 때마다 자동으로 호출되는 함수를 설정
서버에서 응답이 도착할때까지 readyState property값의 변화에 따라 총 5번 호출됨
서버에 요청한 데이터가 존재하고 서버로부터 응답이 도착하는 순간을 특정할 수 있음
switch (httpRequest.readyState) {
case XMLHttpRequest.UNSET:
currentState += "현재 XMLHttpRequest 객체의 상태는 UNSET 입니다.<br>";
break;
case XMLHttpRequest.OPENED:
currentState += "현재 XMLHttpRequest 객체의 상태는 OPENED 입니다.<br>";
break;
case XMLHttpRequest.HEADERS_RECIEVED:
currentState += "현재 XMLHttpRequest 객체의 상태는 HEADERS_RECEIVED 입니다.<br>";
break;
case XMLHttpRequest.LOADING:
currentState += "현재 XMLHttpRequest 객체의 상태는 LOADING 입니다.<br>";
break;
case XMLHttpRequest.DONE:
currentState += "현재 XMLHttpRequest 객체의 상태는 DONE 입니다.<br>";
break;
}
document.getElementById("status").innerHTML = currentState;
if (httpRequest.readyState == XMLHttpRequest.DONE && httpRequest.status == 200 ) {
document.getElementById("text").innerHTML = httpRequest.responseText;
}
$.ajax(URL [,옵션])
, $.ajax([옵션])
$.ajax({
url: "/examples/media/request_ajax.php", // 클라이언트가 요청을 보낼 서버의 URL 주소
data: { name: "홍길동" }, // HTTP 요청과 함께 서버로 보낼 데이터
type: "GET", // HTTP 요청 방식(GET, POST)
dataType: "json" // 서버에서 보내줄 데이터의 타입
})
// HTTP 요청이 성공하면 요청한 데이터가 done() 메소드로 전달됨.
.done(function(json) {
$("<h1>").text(json.title).appendTo("body");
$("<div class=\"content\">").html(json.html).appendTo("body");
})
// HTTP 요청이 실패하면 오류와 상태에 관한 정보가 fail() 메소드로 전달됨.
.fail(function(xhr, status, errorThrown) {
$("#text").html("오류가 발생했습니다.<br>")
.append("오류명: " + errorThrown + "<br>")
.append("상태: " + status);
})
// HTTP 요청이 성공하거나 실패하는 것에 상관없이 언제나 always() 메소드가 실행됨.
.always(function(xhr, status) {
$("#text").html("요청이 완료되었습니다!");
});
$(function() {
$("#requestBtn").on("click", function() {
$.ajax("/examples/media/request_ajax.php")
.done(function() {
alert("요청 성공");
})
.fail(function() {
alert("요청 실패");
})
.always(function() {
alert("요청 완료");
});
});
});
$.get(URL주소[,콜백함수]);
$(function() {
$("#requestBtn").on("click", function() {
// GET 방식으로 서버에 HTTP 요청을 보냄.
$.get("/examples/media/jquery_ajax_data.txt",
function(data, status) {
$("#text").html(data + status); // 전송받은 데이터와 전송 성공 여부를 보여줌.
});
});
});
$.post(URL주소[,데이터][,콜백함수]);
$(function() {
$("#requestBtn").on("click", function() {
// POST 방식으로 서버에 HTTP 요청을 보냄.
$.post("/examples/media/request_ajax.php",
{ name: "이순신", grade: "A+" }, // 서버가 필요한 정보를 같이 보냄.
function(data, status) {
$("#text").html(data + "<br>" + status); // 전송받은 데이터와 전송 성공 여부를 보여줌.
}
);
});
});
$(function() {
$("#requestBtn").on("click", function() {
// URL 주소에 존재하는 HTML 코드에서 <li>요소를 읽은 후에 id가 "list"인 요소에 배치함.
$("#list").load("/examples/tryit/htmlexample/jq_elementTraversing_etc_01.html li");
});
});