XMLHttpRequest不接收数据或仅接收“未定义”

时间:2012-05-29 21:29:41

标签: javascript firefox-addon xmlhttprequest

我尝试制作一个在Javascript中运行XMLHttp请求的Firefox Addon。我想从此请求中获取数据并将其发送到* .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();

3 个答案:

答案 0 :(得分:3)

更新已解决:

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

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

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

但现在它有效!谢谢大家!

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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();

确保您从网址http://xx.xxxxx.com收到正确的回复。您可能遇到跨域调用问题。如果您在域http://first.com有一个页面,并且您尝试从域http://second.com执行XMLHttpRequest,则Firefox将以静默方式失败(不会出现错误消息,没有响应,没有任何内容)。这是一种防止XSS(跨站点脚本)的安全措施。

无论如何,如果你从chrome://协议执行XMLHttpRequest,它被认为是安全的,它将起作用。因此,请确保使用此代码并从您的插件发出请求,而不是来自您的localhost或类似的请求。