2009-09-18 1 views
17

私のページがXHR経由でコンテンツを読み込んでいるときに、ユーザーが停止ボタンをクリックするか、別のページに移動するためにクリックすると、XHRエラー()機能が呼び出されます。これは通常、ページ上にたくさんの(赤い)エラーメッセージが表示されるというユーザーのショックを除いて大きな問題にはなりません。XHRエラーが実際にブラウザの停止や新しいページへのクリックによるものです

メッセージは有効です。実際にはコンテンツの取得中にエラーが発生しましたが、システムの障害のためではなく、ユーザーの操作によるものです。

(404 | 500 |タイムアウトエラー)と、ユーザーがブラウザの停止ボタンを押したことによるエラーを区別する方法はありますか?

EDIT:私はDojoを使用しています(エラー関数参照)。しかし、これはどのXHR実装でも共通する状況になると思います。私はエラーが()HTTPエラーを区別するために

+0

「XHRエラー()関数」とは何ですか? 'XmlHttpRequest'インスタンスにはそのようなメソッドはありません。 – JPot

+0

が表示されます。明らかに、「ほとんどの」ブラウザでサポートされている「onerror」イベントがあります。 ref:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequestEventTarget/onerror – rogerdpack

答えて

31

呼び出されたとき(404401403500、など...)XHRオブジェクトのreadyStateのに見て、中絶エラーを要求する(つまり、ユーザーがEscキーを押すか、ナビゲートします要求が中止された場合、他のページ)、あなたはXHR.statusプロパティを確認することができ、ステータスメンバーはゼロになります。

document.getElementById('element').onclick = function() { 
    postRequest ('test/', null, function (response) { // success callback 
    alert('Response: ' + response); 
    }, function (xhr, status) { // error callback 
    switch(status) { 
     case 404: 
     alert('File not found'); 
     break; 
     case 500: 
     alert('Server error'); 
     break; 
     case 0: 
     alert('Request aborted'); 
     break; 
     default: 
     alert('Unknown error ' + status); 
    } 
    }); 
}; 

シンプルpostRequest機能:

function postRequest (url, params, success, error) { 
    var xhr = XMLHttpRequest ? new XMLHttpRequest() : 
          new ActiveXObject("Microsoft.XMLHTTP"); 
    xhr.open("POST", url, true); 
    xhr.onreadystatechange = function(){ 
    if (xhr.readyState == 4) { 
     if (xhr.status == 200) { 
    success(xhr.responseText); 
     } else { 
    error(xhr, xhr.status); 
     } 
    } 
    }; 
    xhr.onerror = function() { 
    error(xhr, xhr.status); 
    }; 
    xhr.send(params); 
} 

上記のスニペットを実行しますhere

+3

パーフェクト - 0のステータスは、私が探していたものです。ありがとう。 – olore

+10

接続の失敗もステータスが0です。手動で取り消された接続と接続の失敗の違いを確認する方法がわかりません –

+1

Jaffaは何を言っていましたか。 CORSポリシーで拒否された要求のステータスも0です。XHRがブラウザによって中止されたためにXHRのステータスが0であるかどうかをブラウザ間で伝える方法があるかどうかは非常に興味があります。 –

関連する問題