1

ユーザーがページのそのタブに移動したときにのみ、Web ページの一部にのみ必要な JS ファイルをロードしています。

var scriptFile = document.createElement("script");
scriptFile.setAttribute("type", "text/javascript");
scriptFile.setAttribute("src", scriptURL);

JS の読み込みがタイムアウトした場合、または URL で指定された場所で JS が利用できない場合にエラー メッセージを表示できるように、この動的読み込みのエラー処理メカニズムを考え出そうとしています。

これは、エラー処理を実装しようとしている方法です(IE用):

scriptFile.onreadystatechange = function() { // For IE
    if (this.readyState == 'complete' || this.readyState == 'loaded') {
        // Display content in tab
    } else {
        // Display error message
    }
}

これが 1 つの問題を引き起こしています。すべて問題なく、JS が期待どおりに存在する場合、最初にエラー メッセージが表示され、次に正しいコンテンツが表示されます。

ブレーンストーミングを行った後、readyState が「未初期化」から「読み込み中」に変わり、次に「読み込み済み」に変わることがわかりました。エラーメッセージが表示されているのは、状態が「読み込み中」のときです。その後、状態が「ロード済み」に変化し、その時点でコンテンツが表示されます。

エラーが最初に表示されないようにこれを処理する方法はありますか?

4

4 に答える 4

3

「おっと死にました!」がないので。状態では、エラー メッセージを表示できません。

編集:私のポイントはあなたがそれを行うことができないということなので、コードを削除しました。AJAX リクエストを使用すると、応答を確認して 404 かどうかを確認できますが、スクリプト タグではそれができません。

edit2: 考え直して、AJAX 経由でスクリプトを取得し、document.body 内に '<script type="text/javascript">' + responseText + '</script>' を挿入してみませんか?

AJAX リクエストが爆撃されたかどうかを確認するには、XMLHTTPRequest オブジェクトの status プロパティを確認します。404ならまあ404です。

また、この作業を手作業で行うべきではありません。Prototype または jQuery を使用することを常にお勧めします。私は Prototype にだまされてしまったので、リクエストのステータスを確認する方法を説明しようとするべきではありません。ここで別の質問で AJAX リクエストを処理する方法を尋ねてみませんか? プロは、404だけでなく、あらゆる種類の障害を処理する方法を確実に教えてくれます.

于 2009-11-05T11:17:25.077 に答える
1

ロードされているかどうかを確認する 1 つの (グローバル) 変数 (たとえば、スクリプトはロードが完了した後にそれを設定します) を持ち、別の関数 (ロード関数の前に既にページにある) をタイマーで設定して、その変数をチェックするのはどうですか (例: 5秒遅れ?)

変数が設定されていない場合 (定義済みの時間が経過した後)、ユーザーにエラーを表示します。

于 2009-11-05T11:15:44.283 に答える
1

「else」は、機能するかどうかに関係なく、常に「ロード済み」状態を通過するため、「else」ブランチは何も役に立たないので、廃棄する必要があると思います。

代わりに、タイムアウトを設定してください。

var scriptTimer = setTimeout(function() {
  // show error message
  // (should ideally precede with a check the content hasn't
  // been displayed, in case of race condition)
});
scriptFile.onreadystatechange = function() { // For IE
    if (this.readyState == 'complete' || this.readyState == 'loaded') {
       clearTimeout(scriptTimer);
       // now display content in tab
    }
}
于 2009-11-05T11:16:46.827 に答える
0

編集:私の方法は間違っていました-Kazeが提案したようにAJAXを使用してください

于 2009-11-05T11:18:58.523 に答える