javascript로 xmlhttprequest 객체를 작성중에..
글쓴이: sh. / 작성시간: 일, 2005/05/15 - 12:39오전
function AJAX() { this.Response; this.RequestObject; this.DOMDocument; this._constructor(); } AJAX.prototype._constructor = function() { log('call AJAX::_constructor'); this.Response = null; this.RequestObject = null; this.DOMDocument = null; this.initRequestObject(); } AJAX.prototype.initRequestObject = function() { log('call AJAX::initRequestObject'); try { if (window.XMLHttpRequest) { var obj = new XMLHttpRequest(); } else if (window.ActiveXObject) { var obj = new ActiveXObject("Msxml2.XMLHTTP.3.0");; } obj.onreadystatechange = this._httpHandler; this.RequestObject = obj; } catch(e) { log(e); } } AJAX.prototype._httpHandler = function() { log('call AJAX::_httpHandler state = [' + '' + ']'); /* switch (this.RequestObject.resdyState) { case 4: if (window.DOMParser) { var dom = new DOMParser(); this.DOMDocument = dom.parseFromString(this.RequestObject.responseText, 'text/xml'); } else if (window.ActiveXObject) { this.DOMDocument = new ActiveXObject("Msxml2.DOMDocument.3.0"); this.DOMDocument.async = false; this.DOMDocument.loadXML(this.RequestObject.responseText); } break; default: break; } */ } AJAX.prototype.sendRequest = function(method, url, body) { log('call::sendRequest([' + method + '], [' + url + '], [' + body + '])'); try { this.RequestObject.open(method, url, true); this.RequestObject.send(body); } catch(e) { if (e.indexOf('거부') != -1 || e.indexOf('denide') != -1) { log('exception AJAX::sendRequest ' + e); log(' domain확인'); } } }
대략 이런 스크립트를 만들고 있습니다
그런데 난감해진것이.. 막 코딩을 하다보니 onreadystatechange 이벤트 핸들러가 호출이 될때는 global 문맥에서 실행이 되기 때문에 AJAX._httphandler 에서 this 로 참조를 할수가 없다는 점입니다.
그렇다고 해서 xmlhttprequest객체를 global로 놓고 핸들러 역시 일반 함수로 만들자니.. 너무너무 찜찜하네요;;
혹시 이런 경우에 해법을 알고 계시는 분께 조언을 구합니다.
Forums:
onreadystatechange 이벤트 핸들러를 호출하는 부분을 AJA
onreadystatechange 이벤트 핸들러를 호출하는 부분을 AJAX 스코프 안에 두면 될 것 같네요. 이럴 경우에는 핸들러 함수를 익명함수로 전달해야 합니다.
크로스 브라우저 환경을 염두에 두고 코딩하시는 것 같은데, dojo.io.bind나 RubyOnRails 프레임웍을 지원하기 위해 만들어진 Prototype 라이브러리의 AJAX 부분을 보시면 참고가 될 것 같습니다. Prototype 라이브러리는 현재 AJAX와 FAT(Fade Anything Technique) 지원 정도가 들어있는데, 곧 Event쪽 코드도 추가될 예정이어서 라이브러리를 한 번 익히면 크로스 브라우징 문제를 상당 부분 해결할 수 있어서 기대하고 있습니다.
참고로 저는 XMLHttpRequest 인터페이스를 크로스 브라우저를 위한 wrapping 없이 직접 사용할 수 있도록 다음과 같이 클래스를 생성해둡니다.
----
http://nohmad.tumblr.com/
prototype 의 소스를 참고해보고 있습니다.그리고 같이 올려주신
prototype 의 소스를 참고해보고 있습니다.
그리고 같이 올려주신 방법도 아주 유용할거같네요.
감사합니다.
그런데 혹시 prototype에 대한 레퍼런스 문서는 없나요? 위에 알려주신 사이트에도 따로 문서가 나와있지는 않네요..
사실 프로토타입 라이브러리는 RubyOnRails 프레임웍을 지원할 목적
사실 프로토타입 라이브러리는 RubyOnRails 프레임웍을 지원할 목적으로 만들어져서, 다른 곳에서 직접 불러쓰기가 그렇게 쉽지는 않습니다. 자바스크립트 자체에 대한 문서도 없고, RubyOnRails 메일링리스트에나 간간이 팁들이 올라오는 정도입니다. 일단 제가 데모용으로 만든 페이지 하나를 알려드리겠습니다.
http://nohmad.sub-port.net/dummy/zipcode
프로토타입 라이브러리가 지원하는 Observer 패턴을 이용해서 주소 찾기 기능을 LiveSearch로 구현해본 것입니다.
----
http://nohmad.tumblr.com/
[quote]사실 프로토타입 라이브러리는 RubyOnRails 프레임웍을
한참을 prototype.js 를 쳐다봤습니다^^
Ajax.Updater 를 보고서 뭔가 이게 단순한 라이브러리는 아니구나 싶더라고요..
함수를 선언하는 방식등이 생소하네요. literal로 object를 만들 수 있는것은 알았지만 이렇게 사용한것은 처음 봤습니다.
Ajax.Request.prototype = (new Ajax.Base()).extend({ ....
이런식으로 된 코드도 뭔가 했더니 상속을 구현한것이네요
그리고 제가 해결하고자 했던 부분인 핸들러에 객체를 전달하는 방법은
이런 형식으로 해결을 했네요.
일단은 prototype적인 방법을 익힐 시간이 없어서 위의 bind를 차용해다가 해결했습니다.
[/code]
댓글 달기