1

我使用附加组件构建器构建具有基本功能的附加组件:
- 从页面获取评论 (A) http://youtube.com
- 调用 Web 服务器处理此文本 (A) 并返回 json
- 将 (A) 替换为 (B) 并显示给用户
我对服务器的请求有问题(请参阅浏览器控制台有很多行):

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"}
4

1 回答 1

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 变量。

于 2013-09-25T21:16:05.257 回答