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 パートが常にreadyState4 ターン目まで実行されることを意味します。

問題は、ハンドラである のresponseTextプロパティにアクセスしようとしていることです。代わりに を使用します。httpResultonreadystatechangehttpRequest.responseText

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

これは CORS 関連の問題ではありません。URL で CORS リクエストが許可されています。

jsFiddle デモ

onerrorところで、エラーを検出するにはハンドラーを使用する必要がありますXHR

于 2013-09-10T08:44:05.393 に答える