我使用附加组件构建一个具有基本功能的插件:
- 从第http://youtube.com
页获得评论(A)
- 调用Web服务器处理此文本(A)并返回json
- 用(B)代替(A)并将其显示给用户
我对服务器的请求有问题(参见浏览器控制台有很多行):
GET http://localhost:8084/Test/Test [HTTP/1.1 200 OK 8ms]
JSON.parse unexpected end of data fire fox addon.
但最后的请求是成功的。 我的代码不会更改评论,因为它在请求响应之前已更改。
LIB / main.js
var tag = "p";
var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
pageMod.PageMod({
include: "*.youtube.com",
contentScriptFile: data.url("element-getter.js"),
contentScriptWhen: "end"
});
数据/元素getter.js
var target = document.querySelector('#watch-discussion');
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var commenttexts = document.querySelectorAll(".comment-text");
for (var i = 0; i < commenttexts.length; ++i) {
var url = "http://localhost:8084/Test/Test";
var request = new XMLHttpRequest();
var cm = " hello ";
request.open("GET", url, true);
request.onload = function () {
var jsonResponse = JSON.parse(request.responseText);
var status = jsonResponse.status;
cm = status;
};
request.send();
commenttexts[i].innerHTML = cm;
}
});
});
var config = { childList: true };
observer.observe(target, config);
json服务器返回:
{"status":"1","label":"true"}
答案 0 :(得分:1)
您正在创建一个异步请求,所以这部分:
commenttexts[i].innerHTML = cm;
当请求响应时,即在request.onload函数内,而不是在request.send();
之后,应该调用。最后,它意味着它将在请求返回之前首先运行该部分。
你应该有这样的东西:
for (var i = 0; i < commenttexts.length; ++i) {
(function(i) {
var request = new XMLHttpRequest();
var cm = " hello ";
request.open("GET", url, true);
request.onload = function () {
var jsonResponse = JSON.parse(request.responseText);
var status = jsonResponse.status;
cm = status;
commenttexts[i].innerHTML = cm;
};
request.send();
})(i);
}
这种方式只有在它返回时才会被更改,并且您可以访问onload函数中的i变量。