2013-04-01 2 views
0
var xhr=new XMLHttpRequest(); 
xhr.open('GET','example.php'); 
xhr.myVar=0; 
xhr.onreadystatechange=function(){ 
    this.myVar=this.responseText.length; 
    var s=this.readyState+":"+this.myVar+":"+this.responseText; 
    document.getElementById('x').innerHTML=s; 
    }; 

이 스크립트는 웹 페이지 (및 <p id="x"></p>)에 있습니다. onreadystatechange 함수에 사용할 변수를 첨부하고 싶습니다. (실제 코드에서는 분명히 여기보다 더 흥미로운 부분이 있습니다.)XMLHttpRequest에 변수를 연결하는 최선의 방법은 무엇입니까?

시도해 본 브라우저에서 정상적으로 작동하지만 긴장됩니다. 내가 따라야하는 대회가 있습니까? 예 : 맞춤 변수 앞에 밑줄을 붙이거나 그런 식으로?

다른 말로하면 구성원 변수를 연결하는 것이 정확하다고 느낍니다. 주된 대안은 전역 변수를 사용하는 것입니다.이 변수는 전혀 마음에 들지 않습니다 (페이지에 두 개의 XMLHttpRequest 객체가있을 수 있습니다).

답변

2

closures을 사용할 수 있습니다.

이 Ajax 요청이 함수 본문 내에 있다고 가정하면 var 키워드를 사용하여 myVar을 선언하고 onreadystatechange 함수 내에서 로컬 변수 인 것처럼 사용할 수 있습니다.

+0

감사 아룬 :

var myCallback = function(a,b,c) { console.log(a); console.log(b); }; callCObject([1,6], myCallback); 

그냥 구현을 증명하기 위해. 'this.myVar = ...'또는'myVar = ... '의 오자였습니까? –

+0

클로저를 사용하고 싶다면'this.myVar'가 아닙니다. 클로저를 사용하려면'var myVar = 0; '이어야합니다. –

+0

Arun, 내 뜻은 : onreadystatechange()의 첫 번째 줄은'this '부분과 같습니다. 오타가있어'myVar = this.responseText.length;'를 읽어야합니다. (그러나 나는 당신의 의도를 오해했을 때를 대비해 답을 편집하고 싶지 않고 오타가 아닙니다.) –

1

당신이하고있는 일은 이미 꽤 괜찮습니다. 전역 범위를 오염시키지 않고 함수에서 이미 알고있는 것으로 연결합니다 (onreadystatechange 함수는 this이 XHR 개체로 설정되어 있기 때문에). 그러나 다음과 같이 개선해야 할 몇 가지 사항이 있습니다.

  • 변수 이름은 이제와 마찬가지입니다. 변수 중 하나를 호출하고 싶거나 필요가 있다면 responseText?
  • 범위 지정이 유용 할 수 있습니다.
  • XHR을 읽고 그 방법을 알고 싶을 수도 있습니다. 지금은 코드가 IE7/8에서 실행되지 않습니다.

우려의 많은 XHR은 다시 한 번 전화로이 적용되지만이 상황을 상상하지 않습니다 당신이 클로저를 받아 feedback라는 콜백을 가지고이 신비 클래스 C 있습니다. 이 콜백은 네 번 발생하며, 과 동일한 변수를 네 개의 콜백에 전달해야 콜백이이 변수를 변경할 수 없습니다. 귀하의 코드는이 코드에서 분해됩니다. 사소한 일이지만, 첫 번째 장면에서 최고로 갈 가치가 있습니다. DRY 방법론을 따르는 중이다.

내가 이런 짓을 했을까 방법 : 다음과 같이

function callCObject(_c_init_vars, callback) { 
    var tempObject = new C(); // Instantiating my "C" object, whatever it may be 
    var tCallback = function() { 
    callback.apply(this,_c_init_vars); 
    } 
    tempObject.callback = tCallback; 
    tempObject.run(); 
} 

을 대신 수동으로 인스턴스화 C, 나는 그것을 할 것이다 : http://jsfiddle.net/d3yAg/

+0

Thanks Sebastien. IE7/8과 관련하여 "XHR을 올바르게 수행하는 방법"을 확장 할 수 있습니까?('readyState == 4'가 될 때까지'this.responseText'가 정의되지 않은 IE "기능"을 의미하는 것 같습니다.) –

+0

http://snook.ca/archives/javascript/xmlhttprequest_activex_ie는 모든 정보를 가지고 있습니다! :-) –

+0

Sebastien, 요점은 XMLHttpRequest 지원을 확인하지 않고 대신 사용할 수 있다고 가정했기 때문입니다. StackOverflow 질문을 위해 (특히 XMLHttpRequest는 IE7/8에서 사용 가능합니다.) 괜찮습니다. IE7/8에서'readyState == 4'가 될 때까지'this.responseText'가 정의되어 있지 않다는 것을 제외하고는, 여러분이 말하는 것에 대해 정확히 말해주십시오. –

관련 문제