我正在为使用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,也会出现问题。
我现在几乎是空白,所以我对所有建议持开放态度。感谢。
答案 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