2009-09-18 6 views
5

私は動的スクリプトタグでjson要求の束をします。要求にエラーがあるかどうかを検出できますか(たとえば503エラー、404エラー)、エラーの検出時に何かを実行しますか?JSONリクエストの動的スクリプトタグ... XXXエラーがあるかどうかを検出していますか?

+0

どのようにこれらのJSONリクエストを行っていますか? –

+0

私はdocument.createElement( 'script')を使用して、要素のsrcを目的のURLに変更し、要素をDOMに追加しています。私はtry/catchブロックにappendChildを置こうとしましたが、何もしません。 – rawrrrrrrrr

+4

質問をコードスニペットで更新したり、http://jsbin.com/に投稿したりすることができますか?完全性のために役立ちますか? –

答えて

11

代わりにajaxを使用します。 AFAIKは、スクリプトタグがロードされているかどうかを検出する方法がなく、そうでなければロードしなかった理由を検出できません。 ajaxを使用するとjsonを読み込むことができ、読み込まれなかった理由がわかります。

$.ajax({ 
    type: "GET", 
    url: "test.js", 
    dataType: "script", 
    error: function(xhr, error, exception){ 
    alert(xhr.status); //Will alert 404 if the script does not exist 
    } 
}); 
+1

しかし... ...方法があります。 –

4

AFAIKでは、ドキュメントから読み込まれた外部アセット(スクリプト、スタイル、画像など)のステータスコードにアクセスすることはできません。エラーの検出(例:onerrorイベントハンドラ経由)は、ブラウザ間で広くサポートされているわけではありません。

ロードするものがSOPの場合は、XHRを使用して応答ヘッダーにアクセスします。それ以外の場合は、最近紹介されたX-domain XHRをご覧ください。

1

http://www.phpied.com/javascript-include-ready-onload/

これは非常に簡単になるのjQueryのようなライブラリを使用していますか?

+0

これは解決策のようです。それを説明するテキストを追加したり、参照ページのサンプルコードを回答に含めたりする場合は、いくつかのアップフォートを取得し、受け入れられた回答で報酬を得ることができます。 –

+0

リンクはそれをかなり説明し、コピー/ペーストを増やすエントロピーLOLで空間を汚染したくありません。 – Kane

+0

私はこのリンクが適切であるとは思わない。リンクされた記事は、エラー検出ではなく、正常なロードを検出することに関するものです。 –

0

エラーを検出する場合は、errorイベントをリッスンし、エラーのfileNameプロパティをスクリプトのファイル名と比較します。一致した場合は、エラーを処理します。事は、私はfileNameプロパティがFirefoxとOperaのみであると思います。エラーのスタックトレースを持つほとんどのブラウザでも、この動作をシミュレートできます。エリックBréchemierによって要求されるように

はここでは、例です:私はあなたがこれはあなたがXHRを使用することができない理由であるクロスドメインを、仕事をしたいと仮定してい

var getErrorScriptNode = (function() { 
    var getErrorSource = function (error) { 
     var loc, replacer = function (stack, matchedLoc) { 
      loc = matchedLoc; 
     }; 

     if ("fileName" in error) { 
      loc = error.fileName; 
     } else if ("stacktrace" in error) { // Opera 
      error.stacktrace.replace(/Line \d+ of .+ script (.*)/gm, replacer); 
     } else if ("stack" in error) { // WebKit 
      error.stack.replace(/at (.*)/gm, replacer); 
      loc = loc.replace(/:\d+:\d+$/, ""); 
     } 
     return loc; 
    }, 
    anchor = document.createElement("a"); 

    return function (error) { 
     anchor.href = getErrorSource(error); 
     var src = anchor.href, 
     scripts = document.getElementsByTagName("script"); 
     anchor.removeAttribute("href"); 
     for (var i = 0, l = scripts.length; i < l; i++) { 
      anchor.href = scripts.item(i).src; 
      if (anchor.href === src) { 
       anchor.removeAttribute("href"); 
       return scripts.item(i); 
      } 
     } 
    }; 
}()); 
+0

どうすればいいですか?どのような例ですか? –

+0

Eric:例を追加しました。 –

3

リクエストごとに2つのスクリプトタグを作成してください。最初は標準のJSONPリクエスト、2つ目はエラーハンドラです。

最初のスクリプトタグが実行される場合は、コールバックでエラーハンドラをクリアします。しかし、最初に404を取得すると、2番目のスクリプトタグ内のエラーハンドラが実行されます。

遅いJSONP応答に対処するために、タイムアウトを設定したいと思うかもしれません。

0

ドメイン間を移動する必要があり(ページを移植可能にする必要がある場合)、動的スクリプトタグを使用する必要があります。

リモートサーバへのアクセスを持っている場合は、あなたが戻ってサーバーからのエラーコードを渡し、サーバーページリターンを持つことができる200

作成したときに、アクセス権を持っているかどうかは、あなたがのsetTimeoutを使用することができますスクリプトタグは、jsonpハンドラが呼び出される前に期限が切れた場合にエラーをトリガする関数を渡します。エラーハンドラが呼び出された場合は、jsonpハンドラが異常終了していることを確認してください。

グローバルコレクションを通じて各リクエストを追跡する必要がありますが、リクエストをキャンセルしてカウントすることができます。これは、XHRオブジェクトがjQueryのようなライブラリによって管理される方法と似ています。

1

jQueryを使用している場合は、<script>の挿入とフェッチエラーの検出をかなりうまくやっているjQueryプラグインであるjQuery-JSONPをチェックしてください。ネットワーク障害や病気に形成されたJSONレスポンスの場合は

  • エラー回復、コールバック命名オーバー
  • 正確に制御する方法と、それがに送信されます。プロジェクトのページから引用

    、jQueryの-JSONPが特徴URL、同時に実行同じコールバック名で

  • 複数の要求、
  • 2つのキャッシング・メカニズム(ブラウザベースとページベース)、
  • ABO手動の可能性他のAJAXリクエストと同様にリクエストを送信します。
  • タイムアウトのメカニズム。
+0

しかし、失敗したリクエストの実際のステータスコードを知る方法はありません。 – kangax

関連する問題