2009-11-19 29 views
0

我正在爲使用Prototype的網站編寫一個userscript。我決定使用已經加載的Prototype函數,而不是使用GM庫(主要是我可以輕鬆地爲Chrome重新設計它)。原型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的狀態返回有效響應機構然而,「在線」僅被顯示的最後一行。看起來好像前面的行的回調沒有被調用。我已在每行之後用console.log語句驗證了這一點。

我搜索了一下,發現FB和Firefox 3.5如何處理多個Ajax.Requests http://code.google.com/p/fbug/issues/detail?id=1948。我升級到了最新的Firebug測試版,並且擁有最新的非beta版Firefox,但仍然沒有骰子。即使我完全禁用FB,也會出現問題。

在這一點上,我非常在空白,所以我願意接受任何和所有的建議。謝謝。

+1

這是一個常見問題。請參閱http://stackoverflow.com/questions/1061622/javascript-onclick-anonymous-function-help/1061671#1061671 – 2009-11-19 00:22:30

+0

'元素'從哪裏來?它是如何實例化的? – 2009-11-19 00:24:37

+0

此外 - http://james.padolsey.com/javascript/closures-in-javascript/ – 2009-11-19 00:27:08

回答

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的那一刻,就會發出請求。 – 2009-11-19 11:37:26

+0

對不起,我不明白你爲什麼不能這樣綁定;函數「bind」返回一個函子,這正是onSuccess參數所期望的。 – Dereleased 2009-11-19 18:09:40

+0

我不能像這個函數(param){...} .bind(scope vars)那樣調用綁定,我得到了js錯誤。 – 2009-11-19 21:50:20

相關問題