150

IFRAME の読み込みが完了したら、コールバックを実行する必要があります。IFRAME のコンテンツを制御できないため、そこからコールバックを起動できません。

この IFRAME はプログラムで作成され、そのデータをコールバックで変数として渡し、iframe を破棄する必要があります。

何か案は?

編集:

これが私が今持っているものです:

function xssRequest(url, callback)
{
    var iFrameObj = document.createElement('IFRAME');
    iFrameObj.src = url;            
    document.body.appendChild(iFrameObj);   

    $(iFrameObj).load(function() 
    {
        document.body.removeChild(iFrameObj);
        callback(iFrameObj.innerHTML);
    });
}

これは、iFrame が読み込まれる前にコールバックするため、コールバックにはデータが返されません。

4

11 に答える 11

49

まず、関数名xssRequestを見ると、クロス サイト リクエストを試みているように聞こえます。そうであれば、iframe のコンテンツを読み取ることはできません。

一方、iframe の URL がドメインにある場合、本文にアクセスできますが、タイムアウトを使用して iframe を削除すると、コールバックが正常に機能することがわかりました。

// possibly excessive use of jQuery - but I've got a live working example in production
$('#myUniqueID').load(function () {
  if (typeof callback == 'function') {
    callback($('body', this.contentWindow.document).html());
  }
  setTimeout(function () {$('#frameId').remove();}, 50);
});
于 2008-10-16T18:31:38.953 に答える
8

iframe タグが親ドキュメントのコンテンツを囲んでいないため、iframe の innerHTML は空白です。iframe の src 属性によって参照されるページからコンテンツを取得するには、iframe の contentDocument プロパティにアクセスする必要があります。ただし、src が別のドメインからのものである場合は、例外がスローされます。これは、クロスサイト スクリプティングの脆弱性を引き起こす、他人のページで任意の JavaScript を実行できないようにするセキュリティ機能です。これは、私が話していることを示すコードの例です。

<script src="http://prototypejs.org/assets/2009/8/31/prototype.js" type="text/javascript"></script>

<h1>Parent</h1>

<script type="text/javascript">
function on_load(iframe) {
  try {
    // Displays the first 50 chars in the innerHTML of the
    // body of the page that the iframe is showing.
    // EDIT 2012-04-17: for wider support, fallback to contentWindow.document
    var doc = iframe.contentDocument || iframe.contentWindow.document;
    alert(doc.body.innerHTML.substring(0, 50));
  } catch (e) {
    // This can happen if the src of the iframe is
    // on another domain
    alert('exception: ' + e);
  }
}
</script>
<iframe id="child" src="iframe_content.html" onload="on_load(this)"></iframe>

例をさらに進めるために、これを iframe のコンテンツとして使用してみてください。

<h1>Child</h1>

<a href="http://www.google.com/">Google</a>

<p>Use the preceeding link to change the src of the iframe
to see what happens when the src domain is different from
that of the parent page</p>
于 2010-02-12T10:32:50.050 に答える
8

Word ドキュメントや PDF などのドキュメントが iframe にストリーミングされていて、うまく機能するソリューションを見つけた場合に、これを行う必要がありました。キーはonreadystatechanged、iframe でイベントを処理することです。

フレームの名前が「myIframe」だとしましょう。最初にコードのスタートアップのどこかに (私は iframe の後の任意の場所でインライン化します)、次のようなものを追加してイベント ハンドラーを登録します。

document.getElementById('myIframe').onreadystatechange = MyIframeReadyStateChanged;

iframe で onreadystatechage 属性を使用できませんでした。理由は思い出せませんが、アプリは IE 7 と Safari 3 で動作する必要があったため、それが要因である可能性があります。

完全な状態を取得する方法の例を次に示します。

function MyIframeReadyStateChanged()
{
    if(document.getElementById('myIframe').readyState == 'complete')
    {
        // Do your complete stuff here.
    }
}
于 2008-12-05T05:33:44.137 に答える
7

i フレームのコンテンツが IE に完全にロードされたときに待機中のスピナー div を非表示にしたかったので、文字通り Stackoverflow.Com に記載されているすべてのソリューションを試しましたが、何も機能しませんでした。

次に、iフレームのコンテンツが完全にロードされると、 $(Window ) ロードイベントが発生する可能性があるという考えがありました。そして、まさにそれが起こった。だから、私はこの小さなスクリプトを書き、魔法のように働きました:

     $(window).load(function () {
     //alert("Done window ready ");
     var lblWait = document.getElementById("lblWait");
     if (lblWait != null ) {
         lblWait.style.visibility = "false";
         document.getElementById("divWait").style.display = "none";
     }
 });

お役に立てれば。

于 2014-12-10T08:16:19.070 に答える
2

私はあなたと同じような問題を抱えていました。私がしたことは、jQuery と呼ばれるものを使用することです。次に、JavaScriptコードで行うことは次のとおりです。

$(function(){ //this is regular jQuery code. It waits for the dom to load fully the first time you open the page.

    $("#myIframeId").load(function(){
       callback($("#myIframeId").html());
       $("#myIframeId").remove();

    });

});

htmlを取得する前にiFrameを削除しているようです。今、私はそれに問題があると思います:p

お役に立てれば :)。

于 2011-09-10T08:23:47.677 に答える
1

私のプロジェクトには、正常に動作する同様のコードがあります。私のコードをあなたの関数に適応させると、解決策は次のようになります:

function xssRequest(url, callback)
{
    var iFrameObj = document.createElement('IFRAME');
    iFrameObj.id = 'myUniqueID';
    document.body.appendChild(iFrameObj);       
    iFrameObj.src = url;                        

    $(iFrameObj).load(function() 
    {
        callback(window['myUniqueID'].document.body.innerHTML);
        document.body.removeChild(iFrameObj);
    });
}

(1 つまたは両方の原因): 1. body 要素に対してそれを使用する必要がある 2. ページ DOM から iframe を削除した

于 2008-10-15T13:52:53.307 に答える
0

私は過去にまったく同じ問題を抱えていましたが、それを修正する唯一の方法は、iframe ページにコールバックを追加することでした。もちろん、これは iframe コンテンツを制御できる場合にのみ機能します。

于 2008-10-02T19:34:53.117 に答える