Page 1 of 1

불여우 XMLHttpRequest.open()

Posted: 2006 02 11 18:05 01
by 박민권
[FireFox의 XMLHttpRequest.open() 메소드의 동기화 인수]

이번에도 제목 글자수가 적어서 표현하기 힘드네요. ㅠㅠ


보통 예제를 보면 XMLHttpRequest 객체를 통해 값을 전달받을시 아래와 같이 처리합니다.

Code: Select all

// xmlreq = XMLHttpRequest 객체

function UserFunction(){
    if(xmlreq.readyState == 4){
        //기타처리
    }
}

xmlreq.onreadystatechange = UserFunction;
xmlreq.open("GET","xml.xml",true);
xmlreq.send("");

XMLHttpRequest.open() 메소드의 3번째 인수는 동기(false)/비동기(true) 방식을 선택합니다.
비동기 방식은 send() 호출 후 서버의 응답이 없더라도 다음 과정을 진행하게 됩니다.
하지만 동기 방식은 서버의 응답을 받고 나서 다음 과정이 진행됩니다.

예를들어 DB에 데이터를 저장하거나 할 경우 비동기 방식 보다는 동기방식을 사용하는 것이 안전하겠죠.
그런데 동기 방식을 할 경우 불여우에서는 onreadystatechange 이벤트가 발생하지 않습니다.
때문에 onreadystatechange 이벤트를 이용하여 처리하는 대신 아래와 같이 처리하여야 합니다.

Code: Select all

xmlreq.open("GET","xml.xml",false);
xmlreq.send("");

//기타처리
alert(xmlreq.responseXML);

비동기 방식은 서버의 응답을 받지 않아도 처리되기 때문에 onreadystatechange 이벤트와 readyState 속성을 이용하여 응답을 받은 상태가 되었을때 처리하여야 하지만 동기방식으로 하면 위와 같이 하여도 응답을 받기 전까지는 다음 과정이 처리되지 않으므로 문제가 없습니다.

하지만 불여우도 동기 방식으로 처리하더라도 onreadystatechange 이벤트가 발생했으면 좋겠습니다.
IE와 오페라에서는 동기 방식에서도 onreadystatechange 이벤트가 발생합니다.

Posted: 2006 02 12 21:07 29
by 빛알갱이
https://bugzilla.mozilla.org/show_bug.cgi?id=313646
입니다. 오페라도 IE처럼 동작한다는 얘기를 덧붙이겠습니다. 고치는 것은 무척 쉬워 보입니다. 그냥 if에서 조건 하나 빼기만 하면 될 듯.....