2009-05-22 9 views
12

Mam skrypt, który jest wstawiany dynamicznie za pomocą innego skryptu. Kod w tym skrypcie jest zawijany wewnątrz zdarzenia $(window).load(), ponieważ wymaga załadowania wszystkich obrazów na stronie. W niektórych przeglądarkach działa dobrze, ale w innych wydaje się nie uruchamiać, ponieważ strona została już załadowana do czasu uruchomienia kodu.

Czy istnieje sposób sprawdzenia, czy strona została już załadowana - czy to przez jQuery, czy JavaScript? (w tym obrazy)

W tej sytuacji nie mam dostępu do zdarzenia onload oryginalnego dokumentu (oprócz zmiany go za pomocą załadowanego skryptu - ale wydaje się, że przedstawia ten sam problem).

Wszelkie pomysły/rozwiązania/porady będą mile widziane!

Odpowiedz

7

Można spróbować konfigurowania obsługi, która jest wywoływana przez timeout, który będzie sprawdź obrazy, aby zobaczyć, czy ich właściwości są dostępne. Usuń licznik czasu w module obsługi zdarzeń load, więc jeśli zdarzenie ładowania wystąpi najpierw, timer nie zostanie uruchomiony. Jeśli właściwości nie są dostępne, to zdarzenie load jeszcze się nie uruchomiło i wiesz, że twój program obsługi zostanie ostatecznie wywołany. Jeśli tak, to wiesz, że zdarzenie load nastąpiło przed ustawieniem programu obsługi i możesz po prostu kontynuować.

Pseudokod

var timer = null; 
$(function() { 
    $(window).load(function() { 
     if (timer) { 
      clearTimeout(timer); 
      timer = null; 
     } 
     process(); 
    }); 
    timer = setTimeout(function() { 
     if (checkAvailable()) 
      process(); 
     } 
    }, 10*1000); // waits 10 seconds before checking 
}); 

function checkAvailable() 
{ 
    var available = true; 
    $('img').each(function() { 
     try { 
      if (this.height == 0) { 
       available = false; 
       return false; 
      } 
     } 
     catch (e) { 
      available = false; 
      return false; 
     } 
     }); 
     return available; 
    } 

    function process() { 
     ... do the real work here 
    } 
+0

To jest prawie wszystko, co chciałem zrobić. Po prostu poprawiono go nieco, by wystrzelić timer w krótkich odstępach czasu, zamiast czekać 10 sekund. Dzięki! – DismissedAsDrone

2

Myślę, że Twój problem sam by się rozwiązał, gdybyś użył $ (document) .ready zamiast $ (window) .load - zobacz jquery documentation.

+0

tylko urywek z docs połączonych: W skrócie, jest to niezastąpiony zamiennik użycia window.onload ... Twoja związana funkcja zostanie nazwana natychmiastową e DOM jest gotowy do przeczytania i zmanipulowania, czyli kiedy 99,99% całego kodu JavaScript musi zostać uruchomiony. – TML

+5

$ (dokument) .Jest uruchomiony, jeśli DOM jest na miejscu, ale nie czeka na zakończenie zdjęć (jeśli się nie mylę). W tym przypadku muszę załadować obrazy, aby móc odczytać ich atrybuty. – DismissedAsDrone

+1

Możesz odczytać atrybuty bez obrazów ładowanie ... – trusktr

5

Napisałem wtyczki, które mogą się przydać: http://plugins.jquery.com/project/window-loaded

+0

Fajnie! Czy to też działa, gdy używam .load() do pobierania treści, a jeśli zdarzają się obrazy, które muszą się załadować, to '$ .windowLoaded (/ * we/wy * /)' wykona wywołanie po załadowaniu nowych obrazów ??? – trusktr

+0

Rozwiązałem problem, po prostu używając addEventListener, aby dodać funkcje do window.onload i dla każdego wywołania metody .load() jquery ustawiając zmienną na true, aby można ją było wykryć w kolejnych dodatkach do window.onload ... jeśli to czyni W każdym sensie ... – trusktr

+0

Link jest teraz zepsuty, przekierowuje na http://jquery.com/ :( – Septagram

Powiązane problemy