如何在AJAX中创建正确的XHR请求

时间:2013-09-10 08:34:25

标签: javascript xml ajax

这是我简单的网页:

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body onload="start()">
  </body>
</html>

这是我的XMLHttpRequest:

function start(){
  //Name the function that will perform request
  var httpRequest;  

  //cross browser instance
  if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    httpRequest = new XMLHttpRequest();
  } else if (window.ActiveXObject){ //if IE 8 and older
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  }  

  httpRequest.onreadystatechange = httpResult; //what to do after response
  httpRequest.open("GET","http://data.mtgox.com/api/2/BTCUSD/money/ticker_fast?pretty", true);
  httpRequest.send();

  function httpResult(){
    if (httpRequest.readyState === 4 && httpRequest.status === 200){
      alert(httpResult.responseText);
    } else {
      alert("problem making request");
    }
  } 
}

当我加载页面时,它运行代码并返回“问题请求”警报3次。我没有看到JavaScript控制台中弹出任何错误。任何人都有一个线索,为什么我没有从请求中得到适当的回应?

2 个答案:

答案 0 :(得分:2)

您似乎违反了浏览器中内置的same origin policy限制,阻止您发送跨域AJAX请求。

您只能将AJAX请求发送到发起脚本的域。在您的情况下,您尝试向http://data.mtgox.com发送请求,这只有在您的网页托管在同一个域名时才有效,我怀疑这不是您的情况。

当然,如果服务器支持CORSJSONP,则可以执行此类请求。

答案 1 :(得分:1)

每次onreadystatechange属性更改时都会触发readyState处理程序。这意味着你的其他部分将一直执行,直到readyState变为4。

问题是您是否正在尝试访问responseText的{​​{1}}属性,即httpResult处理程序。而是使用onreadystatechange

httpRequest.responseText

这不是与CORS相关的问题,您的URL允许CORS请求。

jsFiddle Demo

顺便说一句,您必须使用if (httpRequest.readyState === 4 && httpRequest.status === 200){ alert(httpResult.responseText); } 处理程序来检测onerror错误。