【问题标题】:XMLHttpRequest receiving no data or just "undefined"XMLHttpRequest 没有接收到数据或只是“未定义”
【发布时间】:2012-06-07 21:42:20
【问题描述】:

我尝试制作一个在 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();

【问题讨论】:

    标签: javascript firefox-addon xmlhttprequest


    【解决方案1】:

    更新已解决:

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

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

    对于以下项目:Host、Origin 和 Referer。所以看来同源政策确实有问题。

    但是现在可以了!谢谢大家!

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • var xhr = new XMLHttpRequest(); xhr.open("GET", "http://w69b-groove.appspot.com", true); xhr.onReadyStateChange = function(){ if (xhr.readystate==4 && xhr.status==200) { set_body(xhr.responseText,doc); } else { alert('Connection didnt work...'); } } xhr.send();我改了但是不行...
      • 你用的是什么浏览器? XMLHttpRequest 在 IE 中不起作用。当你说它“不起作用”时,你到底看到了什么?
      • 如上所述,我使用的是 FF 12.0。我只是看到我的“正在连接...”文本。它就在 XMLHttpRequest 之前
      • 不是onReadyStateChange,而是onreadystatechange - JavaScript 区分大小写。
      【解决方案3】:

      这段代码应该可以工作:

      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,它被认为是安全的,并且可以正常工作。因此,请确保您使用此代码并从您的插件发出请求,而不是从您的本地主机或类似的东西发出请求。

      【讨论】:

      • 非常感谢您的回答!我实施了您的解决方案。但似乎我遇到了跨域错误。它只是默默地离开“连接......”,我的网络插件不会抛出任何新请求。我从 example.com 打电话,但我从 req.example2.com 请求。我怎样才能设法从我的插件发出 HTTP 请求? (正如你提到的 'chrome://')问候
      • 根据我的经验,进行跨域请求的最简单方法是在您的服务器上创建一个透明代理。例如,example.com/ajax/?test=something 的每个请求都从example2.com/?test=something 获取内容并原封不动地返回。
      • @pounty:Firefox 扩展没有同源限制。除非您的代码在内容脚本中运行,否则您应该能够发出跨域请求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多