原型Ajax.Request只调用最后一个回调

时间:2009-11-19 00:18:41

标签: javascript firefox dom prototypejs xmlhttprequest

我正在为使用Prototype的网站编写用户脚本。我没有使用GM库(主要是因为我可以很容易地将它重新用于Chrome),而是决定使用已经加载的Prototype函数。

我通过检查其个人资料页面上的在线状态元素来遍历表格的行,每个表格都代表一个唯一的用户。

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("/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>";
                        }
        }
    );
}

观察在Firebug中执行的脚本,我看到所有GET都返回状态为200的有效响应主体。但是,“online”仅显示在最后一行。看起来好像没有调用前一行的回调。我在每行之后用console.log语句验证了这一点。

我搜索并发现FB和Firefox 3.5如何处理多个Ajax.Requests http://code.google.com/p/fbug/issues/detail?id=1948存在问题。我升级到最新的Firebug测试版,并拥有最新的非测试版Firefox,但仍然没有骰子。即使我完全禁用了FB,也会出现问题。

我现在几乎是空白,所以我对所有建议持开放态度。感谢。

1 个答案:

答案 0 :(得分: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