// Common values for the ReadyState of the XMLHttpRequest object var READYSTATE_UNINITIALIZED = 0; var READYSTATE_LOADING = 1; var READYSTATE_LOADED = 2; var READYSTATE_INTERACTIVE = 3; var READYSTATE_COMPLETE = 4;
// Common values for HTTP status codes var HTTPSTATUS_OK = 200; // XML HTTP Request 객체생성, 반환 function CreateXmlHttpRequestObject() { if(window.XMLHttpRequest) xmlHttpObj = new XMLHttpRequest(); // for non-MS browsers else { // for MS browser by version. try { xmlHttpObj = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { xmlHttpObj = new ActiveXObject("Msxml2.XMLHTTP"); } }
<bodyonload="LoadCustomers();"> <formid="form1"> <div> <selectid="ddlCustomers"onchange="DisplayCustomerDetails ();"> <optionvalue="">- Select a Customer -</option> </select> <hr/> <div> <p>Details:</p> <spanid="spnDetailDisplay">(You have no made a selection yet.)</span> </div> </div> </form> </body>
<scripttype="text/javascript"src="./CommonAJAXLibrary.js"></script> <scripttype="text/javascript"> // A "global" variable that is our XMLHttpRequest object reference. var xmlHttpObj = CreateXmlHttpRequestObject(); function LoadCustomers() { if(xmlHttpObj) { // We want this request synchronous xmlHttpObj.open("GET", "./DataFile.xml", false); // Execute the request xmlHttpObj.send(null); // If the request was ok (ie. equal to a Http Status code of 200) if(xmlHttpObj.status == HTTPSTATUS_OK) { var xmlDoc = xmlHttpObj.responseXML; // Our lists of <CUSTOMER> nodes selected using the X P ath argument
var nodes = xmlDoc.selectNodes ("//Customers/Customer/Lastname/text()");
// Obtain a reference to the <SELECT> drop list control. var ctrl = document.getElementById("ddlCustomers");
for (var i=0; i < nodes.length; i++) { // Get the lastname element from our XML data document var lastName = nodes[i].nodeValue; // Create a new <OPTION> node. var htmlCode = document.createElement('option'); // Add the new <OPTION> node to our <SELECT> drop list ctrl.options.add(htmlCode) // Set the <OPTION> display text and value htmlCode.text = lastName; htmlCode.value = lastName; } } else { alert("There was a problem accessing the Customer data on the server.!"); } } }
AJAX라는 것은 기존에 없던 새로운 언어가 아닙니다. "Java Script에서 XML을 비동기적으로 요청하여 기존 웹프로그래밍의 문제점을 해결한다"라고 하는 기존 기술에 대한 재발견이지요. 이미 AJAX가 이야기 된지도 오래 되었기에, 이미 다들 알고 있는 사실이 아닌가 생각됩니다. 앞에서 이야기한 기술의 핵심인 '그' 비동기적 요청이라는 것을 해보도록 하겠습니다.
Java Script에서 HTTP를 요청하려면 HTTP 객체를 먼저 생성하여야 합니다. 브라우저에 따라 조금 다른데요. 비 MS Explore에서는 xmlHttpObj = new XMLHttpRequest(); MS Explore에서는 버전에 따라 xmlHttpObj = new ActiveXObject("Microsoft.XMLHTTP"); 또는 xmlHttpObj = new ActiveXObject("Msxml2.XMLHTTP"); 의 방식으로 객체를 생성할 수 있습니다. 이를 코드로 표현하여 본다면 if(window.XMLHttpRequest) xmlHttpObj = new XMLHttpRequest(); else { try { xmlHttpObj = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { xmlHttpObj = new ActiveXObject("Msxml2.XMLHTTP"); } } 정도로 표현할 수 있겠습니다. 객체 생성시 마다 매번 이를 기술하는 것보다 함수로 만들어 호출하는 것이 좋으리라 생각됩니다. 저는 다음과 같이 작성하여 이를 CommonAJAXLibrary.js라는 파일로 저장하였습니다. 함수명에 XML글자가 들어있는 것은 이 함수의 주목적이 XML을 다루것에 있기 때문입니다. 꼭 XML만 요청할 수 있어서 그런 것은 아니며 HTML페이지도 요청할 수 있습니다. CreateXmlHttpRequestObject() 함수 위에 존재하는 5개의 변수는 이후에 사용될 상수값입니다. 이에 대해서는 잠시 후 설명드리겠습니다. 여기서는 상수 4만 필요하지만, 코드에 4만 적혀있으면 이해하기 더욱 힘들 것 같아 모두 기록해둡니다. 변수명을 보시면 각각이 무었인지 추측하실 수 있으리라 생각됩니다. 일단 넘어갑시다.