2009-06-05 9 views
8

wiem, że onload wydarzenie czeka na zasoby strona załadować przed odpaleniem - obrazy, arkusze stylów, itpCzy body.onload czeka na IFrames?

Ale czy to obejmować ramek wewnątrz strony? Innymi słowy, czy zagwarantowane jest, że wszystkie ramki dla dzieci "onload" będą zawsze uruchamiane przed rodzicem?

Proszę również dać mi znać, jeśli zachowanie jest różne w różnych przeglądarkach.

Odpowiedz

3

Jak widzę na moich stronach, każdy element iframe ma niezależne przeładowanie, a ładowanie klatki nie czeka na wysłanie ramek iframe.

Na mojej stronie pojawiły się banery gif/png, które czasami ładują się bardzo wolno, więc umieściłem je w elemencie iframe, dzięki czemu cała strona i wydarzenie onload działają szybciej.

+4

To nie jest poprawne. W większości przypadków zdarzenie onload nie zostanie uruchomione, dopóki cała zawartość w elementach iframe nie zakończy się. Aby uzyskać więcej informacji, patrz: http://www.stevesouders.com/blog/2009/06/03/using-iframes-sparingly/ – BarelyFitz

7

Nie, nie ma. Jeśli chcesz zrobić coś takiego, musisz dodać moduł obsługi ładowania dla elementu iframe. Możesz to zrobić ładnie z jQuery:

<iframe src="http://digg.com"></iframe> 
    <script> 
    var count = $('iframe').length; 
    $(function() { 
     // alert('loaded'); // will show you when the regular body loads 
     $('iframe').load(function() { 
     count--; 
     if (count == 0) 
      alert('all frames loaded'); 
     }); 
    }); 
    </script> 

To będzie ostrzeżenie po załadowaniu wszystkich ramek.

Patrz przykład:

http://jsbin.com/azilo

+1

+1 Muszę to zrobić. Dziękuję za rozwiązanie mojego problemu (który pojawił się 3 lata w przyszłości w odniesieniu do tej odpowiedzi;). – msanford

+1

Podany przykład dotyczy użycia zdarzenia jQuery DOMready, a nie zdarzenia window.load. Jeśli zmodyfikujesz swój przykład, zobaczysz, że zdarzenie window.load nie uruchamia się, dopóki nie załaduje się cała zawartość iframe. Aby uzyskać więcej informacji, patrz: http://www.stevesouders.com/blog/2009/06/03/using-iframes-sparingly/ – BarelyFitz

5

lub zwykły JavaScript powinno działać ..

function checkIframes() { 
    if(!i) { i = 0; } 
    if(document.getElementsByTagName('iframe')[i]) { 
     document.getElementsByTagName('iframe')[i].onload = function() { i++; checkIframes(); } 
    } 
    else { yourFunctionInHere(); } 
} 

naprawdę nie testowane, ale powinny działać ... nie odnoszą się do niego z document.onload = function() { checkIframes(); }

Nie bardzo lubię biblioteki takie jak jQuery, ponieważ do tej pory odkryłem, że mogę osiągnąć więcej dzięki mniejszej ilości kodu, przy użyciu zwykłego javascriptu.

+0

+1 dla waniliowego JS. – msanford

+0

To działało dla mnie, ale musiałem dodać 'setTimeout' na funkcji sprawdzania, aby uniknąć przepełnienia stosu. – jmargolisvt

Powiązane problemy