9

Czy można wykryć obsługę zdarzenia DOMContentLoaded?funkcja wykrywania funkcji zdarzenia DOMContentLoaded

Metoda jest jak rozwiązanie Kangax tu nie zadziała, ponieważ DOMContentLoaded nie jest wystawiony jako właściwość jakiegokolwiek elementu: Detecting event support without browser sniffing

+0

Nurkowanie w coś takiego jak źródło jQuery powinno być pouczające. – Pointy

+0

Dlaczego nie używać tabeli zgodności? – Mics

+0

@Mics Powoduje, że wykrywanie nie wykrywa funkcji przeglądarki. –

Odpowiedz

3

Wystarczy posłuchać wszystkich trzech imprezach i pierwszy wywołany wygrywa. Jeśli zwycięzcą jest DOMContentLoaded, jest on obsługiwany. Jeśli nie został wyzwolony przez czas, w którym jeden z dwóch pozostałych został wywołany, nie jest obsługiwany.

<script> 
    var hasDOMContentLoaded = false, 
     ready = false, 
     readyMethod = null; 

    // Listen for "DOMContentLoaded" 
    document.addEventListener("DOMContentLoaded", function(event) { 
     hasDOMContentLoaded = true; 
     init("DOMContentLoaded"); 
    }); 

    // Listen for "onreadystatechange" 
    document.onreadystatechange = function() { init("onreadystatechange"); } 

    // Listen for "load" 
    document.addEventListener("load", function(event) { init("load"); }); 

    // Gets called after any one of the above is triggered. 
    function init(method) { 
     if(!ready) { 
      ready = true; 
      readyMethod = method; 
      go(); 
     } 
    } 

    // Page is ready, time is up. 
    // Eitehr DOMContentLoaded has been triggered or it never will. 
    function go() { 
     console.log("hasDOMContentLoaded: ", hasDOMContentLoaded); 
     // My initialization code here 
    } 

</script> 
1

Właściwie & W rzeczywistości, nie ma potrzeby DOMContentLoaded Event. Każdy skrypt może być użyty do określenia, czy dokument HTML został całkowicie przeanalizowany dzięki zasadzie ładowania strumienia html.

Wszystko, co musisz zrobić, to umieścić funkcję (w przeciwnym razie przypisać do zdarzenia DOMContentLoaded) tuż przed zamykającymi tagami twojego dokumentu (ów).

Wykonanie nastąpi dokładnie po tym, jak ostatni element HTML został sparsowany do DOM, i uruchomi się nieco szybciej i wcześniej niż zrobi to wbudowane narzędzie DOMContentLoaded.

0

Znalazłem następujące wyjaśnienie na temat usage of the DOMContentLoaded event z witryny autora mozilla bardzo przydatne. Na koniec mówi o wstecznie kompatybilnych sposobów na osiągnięcie tego samego, co ja tutaj wyodrębnionych (nic dziwnego, że koncentruje się na IE) ...

Internet Explorer 8 obsługuje zdarzenie readystatechange, które mogą być służy do wykrywania, kiedy DOM jest gotowy. We wcześniejszych wersjach przeglądarki Internet Explorer ten stan można wykryć, wielokrotnie próbując wykonać document.documentElement.doScroll ("left") ;, ponieważ ten fragment wyrzuci błąd, dopóki DOM nie będzie gotowy.

+0

IE była pierwszą i jedyną UA, która wyposażyła cię w stan gotowości dokumentu i innych elementów dokumentu, których wartości właściwości to: Typ: String> states: * uninitialized * (Obiekt nie jest zainicjalizowany danymi.)> * Loading * (Obiekt ładuje swoje dane.)> * Załadowany * (Obiekt zakończył ładowanie swoich danych.)> * interaktywnie * (użytkownik może wchodzić w interakcje z obiektem, nawet jeśli nie jest w pełni załadowany.)> * complete * (Obiekt jest całkowicie zainicjowany). * Stan interaktywny * dokumentu jest poprzednikiem DOMContentLoaded i jest dostępny we wszystkich wersje IE od 1997 lub IE4.0. –

Powiązane problemy