iframe読み込み完了イベントをキャプチャする


回答:


197

<iframe>要素にはそのためのloadイベントがあります。


そのイベントをどのように聞くかはあなた次第ですが、一般的に最良の方法は次のとおりです。

1)プログラムでiframeを作成する

これにより、iframeの読み込みが開始される前にloadリスナーをアタッチして常に呼び出されます。

<script>
var iframe = document.createElement('iframe');
iframe.onload = function() { alert('myframe is loaded'); }; // before setting 'src'
iframe.src = '...'; 
document.body.appendChild(iframe); // add it to wherever you need it in the document
</script>

2)インラインJavaScriptは、HTMLマークアップ内で使用できるもう1つの方法です。

<script>
function onMyFrameLoad() {
  alert('myframe is loaded');
};
</script>

<iframe id="myframe" src="..." onload="onMyFrameLoad(this)"></iframe>

3)タグ内の要素の後にイベントリスナーを添付することもできますが<script>、この場合、リスナーを追加するまでにiframeがすでに読み込まれている可能性があることに注意してください。したがって、それが呼び出されない可能性があります(たとえば、iframeが非常に高速であるか、キャッシュからのものである場合)。

<iframe id="myframe" src="..."></iframe>

<script>
document.getElementById('myframe').onload = function() {
  alert('myframe is loaded');
};
</script>

また、このタイプのイベントを発生させることができる要素についての私の別の回答も参照してくださいload


2
おかげで、これはまさに私が必要とすることを行います!
ハイメガルシア

1
この方法では、iframeが読み込まれたときに実行できる関数は1つだけです。ロードイベントで複数のコールバックを実行できるを使用して、以下の私の回答を参照しくださいaddEventListener
Iest、2015

1
この方法は、スクリプトタグが実行される前にiframeが読み込まれる可能性があるため、競合状態に対しても脆弱です。
Iest、2015

7
ファイルをダウンロードしようとすると、loadイベントが機能しません。
ジェリー

1
はい、iFrameコンテンツがHTMLでない場合(PDFなど)、IEでは機能しません。:この参照connect.microsoft.com/IE/feedback/details/809377/...
セルゲイGussak

27

上記の答えはどちらもうまくいきませんでしたが、これはうまくいきました

更新

@dopplegangerが以下で指摘するように、jQuery 3.0の時点でロードはなくなったので、を使用する更新バージョンですon。これは実際にはjQuery 1.7以降で機能するため、まだjQuery 3.0を使用していない場合でも、この方法で実装できます。

$('iframe').on('load', function() {
    // do stuff 
});

1
jQuery 3.0以降、load廃止されました。.on('load', function() { ... })代わりに使用してください。
Doppelganger

あなたが使用しているjquery場合jqLite、これは行く方法です!
Peter

11

これのためのバニラJavaScriptには、別の一貫した方法(IE9 +のみ)があります。

const iframe = document.getElementById('iframe');
const handleLoad = () => console.log('loaded');

iframe.addEventListener('load', handleLoad, true)

そして、あなたがObservablesに興味があるなら、これはトリックをします:

return Observable.fromEventPattern(
  handler => iframe.addEventListener('load', handler, true),
  handler => iframe.removeEventListener('load', handler)
);

handleLoad()iFrameレンダリングが表示される前に、デバッガーがブレークポイントで停止することは心配ですか?コンテンツの読み込みの問題ではなく、純粋にレンダリングの問題であることを願っています。
Sridhar Sarnobat

iframeがすでにそこにあるときに、jqueryによってそのイベントをキャプチャーする方法...つまり、iframeはjqueryによって作成されません。
gumuruh

3

オフスクリーンのときにiframeが読み込まれると、onloadイベントは発生しないようです。これは、「新しいウィンドウで開く」/ wタブを使用するときに頻繁に発生します。


2
ディスプレイなしのiframeもありません;)
Felipe N Moura

1

この方法でjquery readyイベントをキャプチャすることもできます:

$('#iframeid').ready(function () {
//Everything you need.
});

これが実際の例です:

http://jsfiddle.net/ZrFzF/


16
そのコードがあなたが思っていることを実行しているとは思いません。フィドルの「#iFrame」セレクターを何でも置き換えることができますが、アラートはまだ発生します
roryok

6
@roryokに加えて、ページ全体が読み込まれるのではなく、DOMの準備ができたときにreadyが発生します。
Ivan Nikitin 2015

1
コンテンツが読み込まれたときではなく、DOMの準備ができてjsを実行できるときにreadyが発生します。
Sergey Gussak

2
$( "#iframeid")。readyは、要素がdomにあるときに関数をトリガーします。iframの読み込みが完了したときではありません。
Popsyjunior

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