2009-11-19 9 views
0

Prototype을 사용하는 웹 사이트의 사용자 스크립트를 작성하고 있습니다. GM libs를 사용하기보다는 (주로 Chrome 용으로 재사용 할 수 있음), 이미로드 된 Prototype 함수를 사용하기로 결정했습니다.프로토 타입 Ajax.Request는 마지막 콜백 만 호출합니다.

각각의 프로필 페이지에서 온라인 상태 요소를 확인하여 고유 한 사용자를 나타내는 테이블 행을 반복합니다.

dom = unsafeWindow; //shortening unsafewindow 

console.log("main start"); 
var rows = dom.$$("#users tbody>tr"); 
var users = dom.$$("#users tbody>tr .user_avatar"); 
console.log(rows); 
for (var i=0; i < users.length; i++) { 
    var row = rows[i]; 
    var user = users[i]; 
    new dom.Ajax.Request("https://stackoverflow.com/users/" + user["title"] + ".html", { //user["title"] is the username 
      method:'get', 
      onSuccess:  function(response) { 
           var state = "offline"; 
           if (response.responseText.indexOf("now_online") > -1) { 
            state = "online"; 
           } 
           row.childElements()[1].innerHTML += "<br /><b>" + state + "</b>"; 
         }, 
      onFailure: function(request) { 
          row.childElements()[1].innerHTML += "<br /><b>Error</b>"; 
         } 
     } 
    ); 
} 

방화범에서 실행되는 스크립트를 관찰, 난 단지 마지막 행에 표시됩니다 "온라인"은 그러나 200의 상태로 유효한 응답 본문을 반환 GET을 모두 볼. 이전 행에 대한 콜백이 호출되지 않는 것처럼 보입니다. 나는 각 줄 다음에 console.log 문으로이를 확인했다.

FB와 Firefox 3.5가 다중 Ajax를 처리하는 방법에 문제가 있음을 발견했습니다. 요청. http://code.google.com/p/fbug/issues/detail?id=1948. 필자는 Firebug의 최신 베타 버전으로 업그레이드했으며 Firefox의 가장 최근 베타 버전이 아니며 여전히 주사위가 없습니다. FB가 완전히 비활성화 된 경우에도 문제가 발생합니다.

저는 지금이 시점에서 공백을 그리기 때문에 모든 제안에 대해 공개하고 있습니다. 감사.

+1

확인하십시오. http://stackoverflow.com/questions/1061622/javascript-onclick-anonymous-function-help/1061671#1061671 –

+0

'요소'의 출처는 어디입니까?를 참조하십시오. 그것이 어떻게 인스턴스화 되었습니까? –

+0

또한 - http://james.padolsey.com/javascript/closures-in-javascript/ –

답변

0

function.bind()을 사용하여 범위를 설정하거나 변수 앞에 추가하십시오.

 onSuccess:  function(response) { 
          var state = "offline"; 
          if (response.responseText.indexOf("now_online") > -1) { 
           state = "online"; 
          } 
          arguments[0].innerHTML += "<br /><b>" + state + "</b>"; 
        }.bind(this,row), 

편집 : 또는 이것은 질문입니다 This Way Of Doing It

+0

그런 함수에 바인딩 할 수 없습니다. 이러한 상황에서 작동 할 수있는 유일한 바인딩 기술은 ajaxReq.onSuccess.bind (this, row)를 수행 할 수있는 경우입니다.하지만 onSuccess를 인스턴스화하는 순간 요청이 이루어집니다. –

+0

죄송합니다. 왜 이렇게 바인딩 할 수 없는지 이해가 안됩니다. 함수 "bind"는 onSuccess 인수가 기대하는 것과 똑같은 functor를 반환합니다. – Dereleased

+0

이 함수 (param) {...} .bind (scope vars)와 같이 bind를 호출 할 수 없으므로 js 오류가 발생합니다. –