9

別のドメインからiframeをロードするときにエラーをキャッチする方法はありますか?これがjsfiddleの例です。http://jsfiddle.net/2Udzu/。エラーが発生した場合は、メッセージを表示する必要があります。

これが私がやりたいことですが、うまくいきません:

$('iframe')[0].onerror = function(e) {
   alert('There was an error loading the iFrame');
}

誰かアイデアはありますか?

4

3 に答える 3

7

これonerrorは、スクリプトエラーにのみ適用されます。フレームコンテンツのエラーチェックは、他の方法を使用して実行する必要があります。これが1つの例です。

<script>
  function chkFrame(fr) {
    if (!fr.contentDocument.location) alert('Cross domain');
  }
</script>
<iframe src="http://www.google.com/" onload="chkFrame(this)"></iframe>

ドメイン間の制限により、ページが正常に読み込まれたかどうか、またはクライアントエラー(HTTP 4xxエラー)とサーバーエラー(HTTP 5xxエラー)が原因でページを読み込めないかどうかを検出する方法はありません。

于 2012-08-22T18:45:41.310 に答える
0

親サイトとiframe-urlの両方にアクセスできる場合、ページが完全に読み込まれていることを知る方法(「同一生成元」の問題なし)は、このように子から親にメッセージpostMessage)を送信することです。

親サイト(iframeを含む)

//Listen for message
window.addEventListener("message", function(event) {
    if (event.data === "loading_success") {
        //Yay
    }
});


//Check whether message has come through or not
iframe_element.onload = function () {
    //iframe loaded...
    setTimeout(function() {
        if (!iframeLoaded) {
            //iframe loaded but no message from the site - URL not allowed
            alert("Failure!");
        }
    }, 500);
};

子サイト(iframeからのURL)

parent.postMessage("loading_success", "https://the_origin_site.url/");

the_origin_site.url複数のオリジンの可能性が必要な場合は、PHPなどのサーバーサイド言語を使用して取得できます


受け入れられた回答は、iframeに配置しようとしているドメインが、要求しているドメインと同じである場合にのみ機能します。このソリューションは、両方のドメインのスクリプトにアクセスできるクロスドメインで機能します。

于 2019-06-02T20:49:47.650 に答える
0

次のコードを使用して、x-frame-optionエラーが発生したか、jqueryで別のエラーが発生したかを検出しています

$(iframe).load(function (e) {
  try
    {
    // try access to check
    console.log(this.contentWindow.document);
    // Access possible ...
    }
  catch (e)
    {
    // Could not access. Read out error type 
    console.log(e);
    var messageLC = e.message.toLowerCase();
    if (messageLC.indexOf("x-frame-options") > -1 || messageLC.indexOf('blocked a frame with origin') > -1 || messageLC.indexOf('accessing a cross-origin') > -1)
      {
      // show Error Msg with cause of cross-origin access denied
      }
    else
      {
      // Shoe Error Msg with other cause
      }
    }
});
于 2021-05-07T11:39:33.840 に答える