【发布时间】:2010-12-18 02:53:15
【问题描述】:
我正在为使用 Prototype 的网站编写用户脚本。我决定使用已经加载的 Prototype 函数,而不是使用 GM 库(主要是为了我可以轻松地将其重新用于 Chrome)。
我正在遍历表格的各行,每行都表示一个唯一的用户,方法是检查他们的个人资料页面上的在线状态元素。
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 的有效响应主体。但是,“在线”仅显示在最后一行。似乎没有调用前几行的回调。我已经用每行之后的 console.log 语句验证了这一点。
我搜索并发现 FB 和 Firefox 3.5 如何处理多个 Ajax.Requests http://code.google.com/p/fbug/issues/detail?id=1948 存在问题。我升级到最新的 Firebug 测试版并拥有最新的非测试版 Firefox,但仍然没有骰子。即使我完全禁用了 FB,也会出现问题。
在这一点上我几乎是空白,所以我愿意接受任何和所有建议。谢谢。
【问题讨论】:
-
这是一个常见问题解答。见stackoverflow.com/questions/1061622/…
-
“元素”从何而来?它是如何实例化的?
-
@o.k.w:感谢您的捕获 - 元素是我将代码从函数移回主 ajax 回调的结果。 @Chetan:感谢您的链接,但我认为这不是关闭问题。我已经用 console.log 语句替换了回调的内容,尽管发出了所有请求,但我仍然只看到最后一行得到回调。
标签: javascript firefox dom prototypejs xmlhttprequest