javascript を使用して動的 URL を iframe src に渡しています。ただし、URLが存在しない場合があります。404エラーでiframeを非表示にできるように、存在しないURLを事前に検出するにはどうすればよいですか。
8 に答える
私の評判が低いため、Derek 朕會功夫の回答にはコメントできませんでした。そのコードをそのまま試してみましたが、うまくいきませんでした。Derek 朕會功夫のコードには 3 つの問題があります。
1 つ目は、非同期でリクエストを送信し、そのプロパティ 'status' を変更する時間が、次の式 (if(request.status === "404")) を実行するよりも遅いことです。そのため、request.status は最終的に、インターネット帯域のためにステータス 0 (ゼロ) のままになり、if のすぐ下のコードを達成しません。これを修正するのは簡単です。ajax リクエストのメソッドを開くときに「true」を「false」に変更します。これにより、(同期呼び出しのために) コードに短い (またはそうではない) ブロックが発生しますが、if のテストに到達する前にリクエストのステータスが変更されます。
2 つ目は、ステータスが整数であることです。'===' JavaScript 比較演算子を使用して、左側のオブジェクトが右側のオブジェクトと同一であるかどうかを比較しようとしています。これを機能させるには、次の 2 つの方法があります。
- 404 を囲む引用符を削除して整数にします。
- JavaScript の演算子「==」を使用して、2 つのオブジェクトが類似しているかどうかをテストします。
3 つ目は、オブジェクト XMLHttpRequest が新しいブラウザー (Firefox、Chrome、および IE7+) でのみ機能することです。そのスニペットをすべてのブラウザーで動作させたい場合は、W3Schools が提案する方法で行う必要があります: w3schools ajax
私にとって本当にうまくいったコードは次のとおりです。
var request;
if(window.XMLHttpRequest)
request = new XMLHttpRequest();
else
request = new ActiveXObject("Microsoft.XMLHTTP");
request.open('GET', 'http://www.mozilla.org', false);
request.send(); // there will be a 'pause' here until the response to come.
// the object request will be actually modified
if (request.status === 404) {
alert("The page you are trying to reach is not available.");
}
XHR を使用して、404 が返されるかどうかを確認します。
var request = new XMLHttpRequest();
request.open('GET', 'http://www.mozilla.org', true);
request.onreadystatechange = function(){
if (request.readyState === 4){
if (request.status === 404) {
alert("Oh no, it does not exist!");
}
}
};
request.send();
ただし、同じオリジンでのみ機能することに注意してください。別のホストの場合は、サーバー側の言語を使用してそれを行う必要がありますが、これは自分で理解する必要があります。
これが私のシナリオで機能することがわかりました。
jQuery 1.5 で導入された jqXHR.success()、jqXHR.error()、および jqXHR.complete() コールバック メソッドは、jQuery 1.8 で非推奨になりました。最終的な削除に備えてコードを準備するには、代わりに jqXHR.done()、jqXHR.fail()、および jqXHR.always() を使用してください。
$.get("urlToCheck.com").done(function () {
alert("success");
}).fail(function () {
alert("failed.");
});
AJAX 経由で URL をテストし、ステータス コードを読み取ることができます。つまり、URL が同じドメインにある場合です。
リモート ドメインの場合は、独自のドメインでサーバー スクリプトを使用してリモート URL をチェックアウトすることができます。
ページで単純な GET を実行してみてください。200 が返された場合は、ページが存在することを意味します。これを (jQuery を使用して) 試してください。この関数は、ページの読み込みが成功した場合の成功コールバック関数です。XSS を防ぐために、これはドメイン内のサイトでのみ機能することに注意してください。他のドメインはサーバー側で処理する必要があります
$.get(
yourURL,
function(data, textStatus, jqXHR) {
//load the iframe here...
}
);