スクリプトがiframe
のドキュメントにアクセスできるかどうかを知るための標準的な方法はありますか?
Webで何も見つからなかったので、これを思いつきました。
function checkifr() {
function errHandler() {
alert('Error. Try again later.');
}
var ifr = $('#ifr')[0]; //the iframe DOM element
try {
var d = ifr.contentWindow || ifr.contentDocument;
if (!d) {
errHandler();
return false;
}
var b = $('#ifr').contents().find('body');
//... manipulate iframe content
} catch(e) {
errHandler();
}
}
それは機能します。Firefoxは、のコンテンツにアクセスしようとするとエラーをスローiframe
し、ブロックになってしまいcatch
ます。ChromeはUnsafe JavaScript attempt to access frame
コンソールに警告を表示しますが、catch
ブロックに入ることがありません。null
それらの試行に対して戻ってくるように見えるので、最初if (!d)
にそれを処理します。OperaとIEはFFと同じように動作します。編集:if
上記のコードを使用すると、Chromeはブロックをトリガーしない「空の」Windowオブジェクト(プロパティなし)を返します。クロスブラウザでうまく機能するEsailijaの答えを確認してください!
これがフィドルです。
に対してをテストすることはできません。iframe
src
window.location
正当な背景:これは、この関数が私が開発している小さな画像アップロードプラグインの一部であり(
iframe
IE <9はXHR2をサポートしていないため、ターゲットとして使用)、主に接続エラー/タイムアウトなどを検証することを目的としているためです。これらのエラーのデフォルトのブラウザページは同一生成元ポリシーの対象であるため、この質問の目的です。送信リクエスト自体を検証したいので、ページが利用可能かどうかを確認するためにajax呼び出しを送信したくありません。jQueryの.loadハンドラーはエラーに対して起動しません。jQueryの.errorおよびonerror
HTML属性はこれに対して機能しません。動作するスクリプトの図はここにありますが、完全に無視して、以下の質問に答えるだけでもかまいません。
上記のブロックは、を使用できない理由を説明するためだけのものであることに注意してくださいiframe.src
。
iframe
の「アクセス可能性」をチェックするためのより簡単で標準的な方法があるはずだと思いますが、単にチェックしiframe.src
て多くの場合に適用されないハーフソリューションを除いて、WebでもSOでも何も見つかりません。私のハックtry
/catch
ブロックが技術的に「クリーンな」ソリューションと見なされる場合、より良いオプションが見つからない場合、他の人がそれを再利用する可能性があります。
それで、私のスクリプトが'sと'siframe
を比較せずに'sドキュメントにアクセスできるかどうかをチェックするための標準的またはより簡単な方法またはjQueryプラグインはありますか?可能であれば、コンソールに/ブロックおよびエラー/警告なし。iframe
src
window.location
try
catch