iframeがjQueryでロードを完了したときにイベントを発生させるにはどうすればよいですか?


回答:


38

それができないことは確かです。

Flashでさえ、PDF以外のほとんどのものが機能します。(Safari、Firefox 3、IE 7でテスト済み)

残念な。


FWIW、それらすべて(PDFを含む)がOS X上のChromeで私のために働いた
。–

はい、Chromeでは機能しますが、IEでは機能しません。アプリケーションがWeb上にある場合は、IEでも動作する必要があります。
ロバートスミス

214

やってみました:

$("#iFrameId").on("load", function () {
    // do something once the iframe is loaded
});

19
+1。これは、iframeでのPDFのロードでは機能しないように見えますが、他のコンテンツタイプでは役立ちます。
Cory House

3
+1元の質問者が(pdfに関して)正確に知りたいことではありませんが、この回答は、「iframeがjQueryへのロードを完了したときにイベントを起動するにはどうすればよいですか?」という質問と一致します。。ありがとう
ハーベイダーベイ2012年

PDFでこれを試したことはありませんが、通常のURLで完全に動作します。
Bob-ob

$(function({})フレームを最初にロードするために、これを内部で使用しています。しかし、期待した結果が得られていません。Chrome 25 Mac
William Entriken 2013

これは、iframeにPDFをロードする場合は機能しません。IE 11でテスト済み
ロバート・スミス

7

これは私のためにそれをしました(pdfではなく、別の「onload抵抗」コンテンツ):

<iframe id="frameid" src="page.aspx"></iframe>
<script language="javascript">
    iframe = document.getElementById("frameid");

    WaitForIFrame();

    function WaitForIFrame() {
        if (iframe.readyState != "complete") {
            setTimeout("WaitForIFrame();", 200);
        } else {
            done();
        }
    }

    function done() {
        //some code after iframe has been loaded
    }
</script>  

お役に立てれば。


7
setTimeout()文字列引数は避けるべきである:setTimeout(WaitForIFrame, 200);
ステファンMajewskyを

7

私はこれを試していて、私のために働いているようです:http//jsfiddle.net/aamir/BXe8C/

より大きなpdfファイル:http : //jsfiddle.net/aamir/BXe8C/1/


1
@travisの回答と大差ありませんが、attr src changeおよびcssのエレガントな使用法のため、+ 1します。私は誰かがそのようにそれをしている素晴らしいローダーを偽造しているのを見ることができます。
アンソニーHatzopoulos

PDFが完全にロードされる前にロードイベントが発生しました。
etlds 2012年

最新のChromeでOSX上のあなたのリンクを試してみましたが、最初のページの読み込み時に、それは動作しませんでした、ままLoading PDF...、私はページをリフレッシュすると述べましたPDF Loaded!。しかし、これはurlsで動作するようです:)それは私にとって非常に便利です。ありがとう!
GabLeRoux 2013年

これは、ファイルがiframeでレンダリングされるのではなく、ダウンロードするように設定されている場合は機能しません。
鳴らす

これはIE 11では機能しません。「PDFを読み込んでいます...」のままです。私はまた、IE 11に機能するソリューションを探しています
マルク・

6
$("#iFrameId").ready(function (){
    // do something once the iframe is loaded
});

代わりに.readyを試しましたか?


このメソッドは期待どおりに機能しません。JQueryドキュメントから:「.ready()メソッドは、現在のドキュメントに一致するjQueryオブジェクトでのみ呼び出すことができるため、セレクターを省略できます。」使用するセレクターに関係なく、$(document)の後に起動されるように聞こえます。
Cazuma Nii Cavalcanti 2013

これはアイドル理論であると私はかなり確信しています。
Barney

以前の答えの繰り返し!
SyntaxRules 2013

他の人が述べたように、私はこれをテストしましたが、うまくいきませんでした。Readyはiframeではなくドキュメントの準備ができたときに呼び出されました...ロード時オプションを使用してください。
グレッグ

5

私はこれに対してすぐに使えるアプローチを試しました、これをPDFコンテンツに対してテストしていませんが、通常のHTMLベースのコンテンツに対しては機能しました。

ステップ1:Iframeをdivラッパーでラップする

ステップ2:背景画像をdivラッパーに追加します。

.wrapperdiv{
  background-image:url(img/loading.gif);
  background-repeat:no-repeat;
  background-position:center center; /*Can place your loader where ever you like */
}

ステップ3:ur iframeタグに追加 ALLOWTRANSPARENCY="false"

アイデアは、iframeが読み込まれた後、iframeが読み込みアニメーションをカバーするまで、ラッパーdivに読み込みアニメーションを表示することです。

試してみる。


4

jqueryのLoadとReadyの両方を使用しても、iframeがTRULYの準備ができていると、どちらも実際には一致しなかったようです。

私はこのようなことをしてしまいました

$('#iframe').ready(function () {
    $("#loader").fadeOut(2500, function (sender) {
        $(sender).remove();
    });
});

#loaderは、スピナーgifが付いたiframeの上に絶対配置されたdivです。


2

@Alex aw残念です。もしあなたがiframeあなたのように見えるhtmlドキュメントを持っているとしたら:

<html>
  <head>
    <meta http-equiv="refresh" content="0;url=/pdfs/somepdf.pdf" />
  </head>
  <body>
  </body>
</html>

間違いなくハックですが、Firefoxで動作する可能性があります。その場合、loadイベントが早すぎるのではないかと思いますが。


それが私が探しているものです:(
Aamir Afridi

1

iFrameのpdfの読み込み中にローダーを表示する必要があったので、次のように思いつきました。

    loader({href:'loader.gif', onComplete: function(){
            $('#pd').html('<iframe onLoad="loader.close();" src="pdf" width="720px" height="600px" >Please wait... your report is loading..</iframe>');
    }
    });

ローダーを見せています。お客様がローダーを表示できることが確認できたら、iFrameをロードするonComplletローダーメソッドを呼び出します。iframeには「onLoad」イベントがあります。PDFがロードされると、ローダーを非表示にするonloatイベントがトリガーされます:)

重要な部分:

iFrameには「onLoad」イベントがあり、必要な操作を実行できます(ローダーを非表示にするなど)。


0

ここに私がどんな行動のために何をするかがあり、それはFirefox、IE、Opera、およびSafariで動作します。

<script type="text/javascript">
  $(document).ready(function(){
    doMethod();
  });
  function actionIframe(iframe)
  {
    ... do what ever ...
  }
  function doMethod()
  {   
    var iFrames = document.getElementsByTagName('iframe');

    // what ever action you want.
    function iAction()
    {
      // Iterate through all iframes in the page.
      for (var i = 0, j = iFrames.length; i < j; i++)
      {
        actionIframe(iFrames[i]);
      }
    }

    // Check if browser is Safari or Opera.
    if ($.browser.safari || $.browser.opera)
    {
      // Start timer when loaded.
      $('iframe').load(function()
      {
        setTimeout(iAction, 0);
      }
      );

      // Safari and Opera need something to force a load.
      for (var i = 0, j = iFrames.length; i < j; i++)
      {
         var iSource = iFrames[i].src;
         iFrames[i].src = '';
         iFrames[i].src = iSource;
      }
    }
    else
    {
      // For other good browsers.
      $('iframe').load(function()
      {
        actionIframe(this);
      }
      );
    }
  }
</script>

0

ダウンロードが完了すると、ユーザーのブラウザのオープン/保存インターフェースがポップアップすることが期待できる場合は、ダウンロードを開始するときにこれを実行できます。

$( document ).blur( function () {
    // Your code here...
});

ダイアログがページの上部にポップアップすると、ぼかしイベントがトリガーされます。


0

pdfファイルが読み込まれた後、iframeドキュメントには新しいDOM要素<embed/>が含まれるため、次のようにチェックできます。

    window.onload = function () {


    //creating an iframe element
    var ifr = document.createElement('iframe');
    document.body.appendChild(ifr);

    // making the iframe fill the viewport
    ifr.width  = '100%';
    ifr.height = window.innerHeight;

    // continuously checking to see if the pdf file has been loaded
     self.interval = setInterval(function () {
        if (ifr && ifr.contentDocument && ifr.contentDocument.readyState === 'complete' && ifr.contentDocument.embeds && ifr.contentDocument.embeds.length > 0) {
            clearInterval(self.interval);

            console.log("loaded");
            //You can do print here: ifr.contentWindow.print();
        }
    }, 100); 

    ifr.src = src;
}

0

私がこの状況に適用した解決策は、絶対読み込みイメージをDOMに配置することです。これは、iframeが読み込まれた後、iframeレイヤーによってカバーされます。

iframeのz-indexは(loadingのz-index + 1)以上である必要があります。

例えば:

.loading-image { position: absolute; z-index: 0; }
.iframe-element { position: relative; z-index: 1; }

これがjavaScriptソリューションでうまくいかなかった場合に役立つことを願っています。CSSはこれらの状況でのベストプラクティスだと思います。

宜しくお願いします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.