0

这是我的简单网页:

<!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 控制台中弹出任何错误。任何人都知道为什么我没有从请求中得到正确的响应?

4

2 回答 2

2

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

您只能将 AJAX 请求发送到生成脚本的域。在您的情况下,您正在尝试向其发送请求,http://data.mtgox.com并且只有当您的页面托管在同一个域上时,这才有效,我怀疑这不是您的情况。

当然,如果服务器支持CORS或者JSONP有可能执行这样的请求。

于 2013-09-10T08:36:50.787 回答
1

onreadystatechange每次readyState属性更改时都会触发处理程序。这意味着您的 else 部分将始终执行到readyState第 4 轮。

问题是您正在尝试访问 的responseText属性httpResult,即onreadystatechange处理程序。而是使用httpRequest.responseText.

if (httpRequest.readyState === 4 && httpRequest.status === 200){
            alert(httpResult.responseText);
}

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

jsFiddle 演示

顺便说一句,您必须使用onerror处理程序来检测XHR错误。

于 2013-09-10T08:44:05.393 回答