2009-05-02 20 views
20

IFRAMEのonloadイベントは、HTMLが完全にダウンロードされたとき、またはすべての従属要素がロードされたときだけ起動しますか? (css/js/img)IFRAME onloadイベントはいつ発生しますか?

+9

Internet Explorerを使用していない場合はいつでも起動します。 – Tortoise

+0

iDeviceを使用していないときは、すべての要素がロードされたときに起動します。 – NoBugs

+0

@ tortoise:私を笑顔にしてくれてありがとう。 – ling

答えて

20

後者:<body onload=は、すべての従属要素(css/js/img)もロードされている場合にのみ発生します。

あなたはHTMLがロードされたとき、あなたのHTMLの最後にこれを行う、JavaScriptコードを実行したい場合:ここで

<script>alert('HTML loaded.')</script></body></html> 

は(負荷準備の違いについてrelevant e-mail threadですjQueryは両方をサポートします)。

+1

iframeだけでなく、メイン文書自体にも同じことが当てはまると思いますか? – MatrixFrog

0

ちょうどhtmlが読み込まれたときに、依存要素が読み込まれません。 (または私は思う)。ページのロードの残りの部分は、jQueryの(ウィンドウ).LOAD(関数(){行うかonready記述されていませwindow.onload時に起動するように

また、画像要素がロードされているかどうかを確認することができますし、そこに画像があればロードなど。

4

上記の答え(onloadイベントを使用)は正しいですが、場合によっては、これは間違っているようです。特に、Webコンテンツ用のプリントテンプレートを動的に生成する場合

動的なiframeを作成して印刷することで、ページの特定のコンテンツを印刷しようとしました。画像が含まれていると、 n画像がロードされます。それは常にあまりにも早くイメージがまだ不完全なプリントが得られロードされたときに発火:

function printElement(jqElement){ 
    if (!$("#printframe").length){ 
     $("body").append('<iframe id="printframe" name="printframe" style="height: 0px; width: 0px; position: absolute" />'); 
    } 

    var printframe = $("#printframe")[0].contentWindow; 
    printframe.document.open(); 
    printframe.document.write('<html><head></head><body onload="window.focus(); window.print()">'); 
    printframe.document.write(jqElement[0].innerHTML); 
    printframe.document.write('</body></html>'); 
// printframe.document.body.onload = function(){ 
//  printframe.focus(); 
//  printframe.print(); 
// }; 
    printframe.document.close(); 
// printframe.focus(); 
// printframe.print(); 

// printframe.document.body.onload = function()... 
} 

あなたはそれがあまりにも早く起動しますいずれにしても...私はonloadイベントハンドラをバインドするために、いくつかの方法を試してみた見ることができるように。ブラウザの印刷プレビュー(Google Chrome)には壊れた画像が含まれているのでわかります。印刷をキャンセルしてその機能をもう一度呼び出すと(イメージはキャッシュされます)、印刷プレビューは正常です。

...私は解決策を見つけました。きれいではないが適している。それは、サブツリーをスキャンして 'img'タグを探し、それらの '完全な'状態をチェックするものです。不完全な場合、250ms後に再チェックを遅らせる。

function delayUntilImgComplete(element, func){ 
    var images = element.find('img'); 
    var complete = true; 
    $.each(images, function(index, image){ 
     if (!image.complete) complete = false; 
    }); 
    if (complete) func(); 
    else setTimeout(function(){ 
     delayUntilImgComplete(element, func);} 
    , 250); 
}  

function printElement(jqElement){ 
    delayUntilImgComplete(jqElement, function(){ 
     if (!$("#printframe").length){ 
      $("body").append('<iframe id="printframe" name="printframe" style="height: 0px; width: 0px; position: absolute" />'); 
     } 

     var printframe = $("#printframe")[0].contentWindow; 
     printframe.document.open(); 
     printframe.document.write(jqElement[0].innerHTML); 
     printframe.document.close(); 
     printframe.focus(); 
     printframe.print(); 
    }); 
} 
+0

これは非常に有用ですthx – kofifus

関連する問題