0

我尝试制作一个在 Javascript 中运行 XMLHttp 请求的 Firefox 插件。我想从此请求中获取数据并将其发送到 *.body.innerhtml。

到目前为止,这是我的代码...

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://xx.xxxxx.com", true);
xhr.send();
setTimeout(function() { set_body(xhr.responseHtml); }, 6000);

我没有收到数据,而是“未定义”。如果我将 xhr.responseHtml 更改为 responseText,我什么也得不到。我不知道为什么我什么也得不到。我正在使用 Firefox 12.0 开发 Ubuntu 12.04 LTS。

如果您需要有关脚本的更多详细信息,请询问!

更新:

set_body 函数

document.body.innerHTML = '';
document.body.innerHTML = body;
document.close();
4

3 回答 3

3

更新已解决:

我必须确定 RequestHeaders(在 xhr.open 之后):

xhr.setRequestHeader("Host", "xxx");

对于以下项目:Host、Origin 和 Referer。因此,同源政策似乎确实存在问题。

但现在它起作用了!谢谢大家!

于 2012-06-06T21:18:51.177 回答
1

当您将 open 的最后一个参数设置为 true 时,您要求的是异步事件。所以你需要像这样向 xhr 添加一个回调:

xhr.onReadyStateChange = function(){
   // define what you want to happen when server returns
}

当服务器响应时调用。要在没有异步的情况下进行测试,请将第三个参数设置为 false。然后 send() 将阻塞并在那里等待,直到响应返回。设置 6 秒的任意超时不是处理此问题的正确方法。

于 2012-05-29T21:35:16.653 回答
1

此代码应该可以工作:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
  if (xhr.readyState == 4) {
    set_body(xhr.responseText);
  }
};
xhr.open("GET", "http://xx.xxxxx.com", true);
xhr.send();

确保您从 URL http://xx.xxxxx.com得到正确的响应。跨域调用可能有问题。如果您在域http://first.com有一个页面,并且您尝试从域http://second.com执行 XMLHttpRequest ,Firefox 将静默失败(不会有错误消息,没有响应,什么都没有)。这是防止 XSS(跨站点脚本)的安全措施。

无论如何,如果您从chrome://协议中执行 XMLHttpRequest,它被认为是安全的并且可以工作。因此,请确保您使用此代码并从您的插件发出请求,而不是从您的本地主机或类似的东西发出请求。

于 2012-05-30T09:45:33.167 回答