14

スクリプトが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の答えを確認してください!

これがフィドルです。

に対してをテストすることはできませんiframesrcwindow.location

正当な背景:これは、この関数が私が開発している小さな画像アップロードプラグインの一部であり(iframeIE <9はXHR2をサポートしていないため、ターゲットとして使用)、主に接続エラー/タイムアウトなどを検証することを目的としているためです。これらのエラーのデフォルトのブラウザページは同一生成元ポリシーの対象であるため、この質問の目的です。送信リクエスト自体を検証したいので、ページが利用可能かどうかを確認するためにajax呼び出しを送信したくありません。jQueryの.loadハンドラーはエラーに対して起動しません。jQueryの.errorおよびonerrorHTML属性はこれに対して機能しません。動作するスクリプトの図はここにありますが、完全に無視して、以下の質問に答えるだけでもかまいません。

上記のブロックは、を使用できない理由を説明するためだけのものであることに注意してくださいiframe.src

iframeの「アクセス可能性」をチェックするためのより簡単で標準的な方法があるはずだと思いますが、単にチェックしiframe.srcて多くの場合に適用されないハーフソリューションを除いて、WebでもSOでも何も見つかりません。私のハックtry/catchブロックが技術的に「クリーンな」ソリューションと見なされる場合、より良いオプションが見つからない場合、他の人がそれを再利用する可能性があります。

それで、私のスクリプトが'sと'siframeを比較せずに'sドキュメントにアクセスできるかどうかをチェックするための標準的またはより簡単な方法またはjQueryプラグインはありますか?可能であれば、コンソールに/ブロックおよびエラー/警告なし。iframesrcwindow.locationtrycatch

4

2 に答える 2

12

別のオプションがあります。実際には、catchを試さずにそれを行うことはできません。

テストhttp://jsfiddle.net/LHjwZ/11/

function checkIframe( ifr ) {
    var key = ( +new Date ) + "" + Math.random();

    try {
        var global = ifr.contentWindow;
        global[key] = "asd";
        return global[key] === "asd";
    }
    catch( e ) {
        return false;
    }
}
于 2012-08-08T21:23:46.593 に答える
1

アクセスが例外をスローするかどうかに関係なく機能する1つのアイデアは次のとおりです。

function checkFrameAccess(ifr) {
    try {
        var doc = ifr.contentDocument || ifr.contentWindow.document;
        var origClass = doc.body.className;
        var newClass = origClass += " xxxxx";
        doc.body.className = newClass;
        var valid = doc.body.className == newClass;
        doc.body.className = origClass;
        return(valid);
    } catch(e) {
        return(false);
    }
}

それらが例外をスローした場合、あなたは例外ハンドラーに行き着き、を返しfalseます。例外がスローされない場合は、フレーム内のbodyタグのclassNameを実際に変更できるかどうかをテストします。変更が機能する場合は、明らかに、変更することができます。そうでない場合は、アクセスできません。

于 2012-08-08T21:15:56.047 に答える