我尝试制作一个在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();
答案 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或类似的请求。