2012-01-12 9 views
4

これはクロスサイトリクエストの問題ではなく、私の質問に対するほとんどのグーグルの回答は次のようなものです。Jquery ajaxrequest xhr.status code 0 but html status code 200

jquery関数.getおよび.loadを使用してajaxリクエストを作成しようとすると、xhr.status 0 och xhr.statusText "error"が表示されます。しかし、Firebugでは、リクエストされたページにhtmlステータスコード200がロードされ、レスポンスのテキストを読むことができ、レスポンスヘッダーが正常に表示されます。

マイコード:

function GetProjectTask(e) { 
    var loader = $('#' + e + 'tasks div.loader'); 
    var content = $('#' + e + 'tasks div.content'); 
    var img = $('#' + e + 'tasks img.collapseimg'); 
    if (loader.html() == null || loader.html().trim() == '') { 
     if (content.html() == null || content.html() == '') { 
      img.attr('src', 'images/expanded.gif'); 
      loader.html('<img src="images/loading.gif" alt="Wait..."> Loading support tasks'); 
      content.load('includes/my' + e + 'tasks.php', 
       function (response, status, xhr) { 
        if (status == "error") { 
         var msg = "Sorry but there was an error: "; 
         alert(msg + xhr.status + " - " + xhr.statusText); 
        } 
       } 
      ); 
      return; 
     } 
    } 
    content.empty(); 
    loader.empty(); 
    img.attr('src', 'images/collapsed.gif'); 
    } 

サーバー:IISのv.7.5 のjQuery:v1.6.2

任意のアイデア?

+0

代替リソースを読み込もうとしましたか?例えば、静的なhtmlファイルのように。 あなたのPHPファイルからのあなたの応答のコンテンツタイプは何ですか? – Lewis

+0

うん。私の応答ファイルの内容は純粋なhtmlです。 – moiran

+0

jqueryも最新バージョンに更新しようとしましたが、問題はないと私は疑っていました。そして問題は残っています。 – moiran

答えて

3

localhostの同じサーバーに自分のローカルサーバーによって提供されたページからのxhr要求を作成することで、レスポンスステータスコード0が発生しました(私の場合はウェブサイトを開発していました)。 (可能な解決策と)

他の理由は、ここで見つけることができます:

「あなたはAJAX要求のための相対URLを使用していることを確認してください。」 - invalid HTTP response code ‘0’

+0

リクエストされたページとリクエストしているページは同じサーバーにあり、上記のように提出されたコードでは、相対URLが使用されています。 – moiran

+0

私の答えのlocalhostの部分はここで重要でした - 多分あなたのローカルマシン上で開発している(そしてそこにもサーバがあります)。私の場合、それは問題であり、ローカルマシンで開発していた限り、ステータスコード0を200として扱わなければなりませんでした。以前に "壊れた" Ajaxリクエストのリモートサーバー応答コードにアプリケーションをデプロイすると、正常(200)に戻りました。 – WTK

+0

Aha!不幸なことに、私のローカルマシンとデプロイメントサーバーの両方に問題があります。 – moiran

9

ステータスコードがゼロであると考えられます。私の場合、要求応答サイクルが完了する前に、ユーザーがページを離れるためにステータスコード0を受け取りました。サーバーとの通信が失敗した場合は、ステータスコードが0になることもあります。私は基本的にこれを送信者からのアウトバウンド通信の失敗として要約しました。それがクロスサイト要求やクライアント側の他の理由も出てくる理由です。

W3 XMLHttpRequest specification section 4.8.1状態:状態はUNSENTまたは開かれている場合、
0を返し、これらの手順を終了します。

ステータス属性は、これらの手順を実行した結果を返す必要があります。
エラーフラグが設定されている場合は、0を返してこれらの手順を終了します。
HTTPステータスコードを返します。

私が仕様を正しく読んだら、UNSENTとOPENEDは要求が送信される前の状態であることを示します。そして、もしフラグが設定されているエラー:要求がで中止された場合は、エラーフラグがネットワークエラーまたは要求中絶のいくつかのタイプを示す

...

は、私はこのステータスコードを持っている問題がありますユーザーがナビゲートしないようにするには、ユーザーの意図的な操作であるため、これはエラー状態ではありません。ネットワークの問題私はエラーと考えます。たとえば、ユーザーがエラーページにリダイレクトするエラーハンドラを持つajaxリクエストを返すアクションを呼び出すとします。ユーザが現在のページを離れ、ユーザビリティの観点からリクエストを中止する場合、エラーページにリダイレクトすることは意味がありません。仕様の実装は、ゼロのステータスコードが中止された要求やその他の理由から来たことを知る方法をまだ決定していないことを除いて、問題ありません。私がその違いを知ることができれば、私は適切な措置を講じることができます。

EDIT:2013年8月9日に@arieraによってコメントに反応して2014年3月18日

が、私は回避策が何であったかの大まかな説明を供給しています。しかし、問題は私がこれを解決して私の記憶があいまいであることがしばらくありました。

私が正しく覚えていれば、ステータスコード0が間接的に要求を中止したために起こったのかどうかを判断する考えは、エラー処理コードをエラーコールバックとは別に独自のコールバックに入れることでした。次に、エラーコールバックで、ステータスコードがゼロであるかどうかを確認します。そうである場合は、タイムアウトの遅延でエラーコールバックを呼び出し、そうでなければエラーコールバックを呼び出します。ここでのアイデアは、エラーコードがゼロの場合、そのエラーの処理に遅延をかけると、ブラウザは実際にナビゲーションを実行できます。ブラウザがナビゲーションを実行できるようにするには、実行中のJavaScriptがすべてクリアされる必要があります。したがって、エラーハンドラは起動しません。

これはクルーギーであり、再び機能しないかもしれませんが、私は実際に問題の複雑さを覚えていませんが、うまくいけば誰かが正しい経路を導いてくれるはずです。

+2

これを約8時間実行した後、接続が中止されたかどうか、または状態コード0が他の何らかの障害によって引き起こされたかどうかを判断する方法(kludge)を見つけることができました。私はjQuery 1.4.xを使用しています。ソースコードとXMLHttpRequest仕様を見てから、開発者に必要なすべてのフィードバックを提供するためにjQueryの実装がかなり不十分だと言わなければなりません。うまくいけばそれは将来のバージョンで修正されました。私の実装について興味があるなら、教えてください。 – loesak

+0

+1私から。これは私の問題を見つけるのに役立ちました。前述のように、私は非同期呼び出しの応答が来る前に別のページに移動していました。私は問題を見つけるためにほぼ一日を無駄にして、助けてくれてありがとう。 – Thanushka

+1

はい@loesak、世界のすべての美しさと美しさのために、あなたはあなたの解決策を分かち合うことができますか? 0:) – ariera

関連する問題