Perfection or Vanity

Project: Terminated

Blog nie jest już dalej prowadzony ani aktualizowany. Mimo tego, wpisy i komentarze są dalej dostępne. Możesz przeczytać pożegnalny wpis albo przejść do archiwum.

Jak wiadomo mój blogasek ma różne niespodziewajki w JavaScripcie. Jak na grzecznego chłopczyka przystało wszystko dodaję przez zdarzenia, a głównie przez jedno - window.onload.

Plus tego jest taki, że ktoś nielubiący albo nieużywający JavaScriptu nadal będzie miał dostęp do zawartości - na przykład ten długi (bez zwinięcia) sidebar. Minus jest dość poważny - skrypt czeka aż załaduje się cała strona, łącznie z obrazkami, których używam we wpisach dość często i dopiero na samiutkim końcu sidebar się zwija, dodają się linki do przeglądania archiwum i inne szmery bajery.

Dzisiaj mi Oskar 1 na to zwrócił uwagę, przytaknąłem, no ale… co dalej? Lecz znalazł rozwiązanie prawie doskonałe, za co stokrotne mu dzięki. Przeglądarki mozillowate umieją coś takiego jak DOMContentLoaded które jest „zdarzeniem” po załadowaniu się całego drzewa DOM, ale bez tych obrazków i innych podczepionych obiektów. Strona ładuje się dzięki temu znacznie szybciej.

Tak więc zbieramy wszystkie funkcje w jedną - u mnie startMagic - i dodajemy przed nimi warunek nie pozwalający wykonać się im dwa razy:

  1. if (arguments.callee.done) return;
  2. arguments.callee.done = true;

A startujemy wszystko po prostu tak:

  1. if (document.addEventListener) {
  2. document.addEventListener("DOMContentLoaded", startMagic, false);
  3. }
  4. addEvent(window, "load", startMagic);

addEvent to uniwersalna funkcja dodająca zdarzenie albo na addEventListener dla dobrych przeglądarek albo attachEvent dla kochanego IE 2. :P Jest pierwsza w moim pliku engine.js.

Jest także rozwiązanie dla Internet Explorera, należy użyć flagi defer w <script/>, ale z powodu podpinania zewnętrznych plików .js i potrzeby odpalania funkcji w określonej kolejności nie zastosowałem go jeszcze tutaj.

  • 1) Tak jest, pogodzeni. :-) A jego blog się fajnie filmowo-profilowany robi, sprawdźcie sami. ;-)
  • 2) Jeśli nadal czytasz tego bloga z Explorera, to zlituj się nade mną maluczkim, proooszę. :)

W wersji 6 bloga (aktualnej) już użyłem kodu dla IE.

Informacje i hiperłącza

Blog o projektowaniu zgodnych ze standardami stron internetowych.

Praktyczne przykłady, sztuczki CSS, sposoby obchodzenia błędów przeglądarek, lekki i nieinwazyjny JavaScript, użyteczny design, dostępność i skrypty użytkownika.

RSS

Informacje o wpisie

Napisał riddle 15 marca 2006 o 18:28

Kategorie: JavaScript & DOM, Użyteczność

Dodaj do:

Wpisy archiwalne

Archiwum miesięczne

Dzięki!

Dodaj bloga do Technorati Favorites Dodaj bloga do Del.icio.us Blog należy do sieci 10przykazań.com

  1. a co z tymi, ktorzy wola opere od kina akcji [firefox] ?

  2. Mają wolniej, ot co. Chyba że znajdę na necie kiedyś coś podobnego i dla niej (sugestie?).

  3. hmm, zrob funkcje ktora wywola reszte, i wrzuc w <script/> zaraz pod body?
    nie wiem czy dziala, i czy jest poprawne, nei znam sie

  4. @Riddle: Brutalnie możnaby zrobić coś, co proponują w komentarzach:
    http://dean.edwards.name/weblog/2005/09/busted/#comment2530

  5. Chłopaki od Opery mają na wish-liście właśnie DOMContentLoaded, przypuszczam, że wersja 9 będzie miała już poprawnie zaimplementowane wszystko (związane z tym zagadnieniem). A jeżeli nie, to (znów) pozostanie w tyle.

  6. Nie mam zamiaru brudzić sobie HTMLa skryptami w body, sorki. ;)

  7. w head jak zgaduje nei zadziala?
    a moze po prostu na dole JSa wrzucisz wywolanie tej funkcji?
    ale powtarzam, nie znam sie

  8. Jejku, co to za zmiany czcionki ;-|

  9. Zdarzyło mi się kiedyś poprawić Deana jeśli chodzi o ten skrypt :) Konkretniej, to znacznie go skrócić i uprościć korzystanie z niego.

    Jedyne, co trzeba zrobić, to wrzucić do swojego HTMl-a taką linijkę:
    <script type="text/javascript" src="ondomload.js" defer="defer"></script>
    co spowoduje odpalenie funkcji ondomload(), którą można sobie wrzucić gdziekolwiek
    Przykład tutaj: http://student.agh.edu.pl/~ffreak/ondomload/busted.html
    jeśli nie zdefiniujemy funkcji ondomload(), to wywali błąd (http://student.agh.edu.pl/~ffreak/ondomload/error.html). Jesli to komuś przeszkadza, to niech dorzuci if(window.ondomload) przed wywołaniem tej funkcji w JS.

    W sumie dzięki za przypomnienie o tym skrypcie, bo niemal został zatracony (jedna kopia się ostała), dorobię jeszcze protezę dla reszty przeglądarek i wrzucę to do sieci za czas jakiś..

  10. Witam, ja w troche inej sprawie, mianowicie nie działają u Ciebie Riddlu tagi. To znaczy działają, ale wyświetla tylko pare ostatnich wpisów z kategori i dalej nie ma jak przejść, a chciałbym móc jeszcze pare razy pomagać sobie Twoimi notatkami odnośnie CSSa ;), bo linki bezpośrednie do nich chyba znikneły z tego co się orientuje.
    Pozdrawiam

  11. To błąd Joggera. Mam ustawione 5 wpisów na głównej i tak to już jest. Ale dzisiaj porobię excerpty z wpisów i razem z techniką opisaną we wpisie będzie już na tyle szybko, że powiększe do 10 na stronę… i dopóki błąd nie zostanie wyeliminowany, będzie 10.

  12. A nie byłoby może takiej możliwości, by był link tak jak na głównej Twojego jogga "Wcześniejsze wpisy", gdy przegląda się wpisy w jakiejś poszczególnej kategorii?

  13. Nie, nie da się. Bajer na głównej wykorzystuje drzewko linków a Archiwum, tagi nie uzupełniają go o strony więc nie da się tego zrobić. Trzeba czekać.

  14. W sumie dla reszty upośledzonych przeglądarek, możesz dodać ten kod:

    <script type="text/javascript">
    document.write('<style type="text/css">');
    document.write('#sidebar div{display:none;}<');
    document.write('/s'+'tyle>');
    </script>

    Takim sposobem zawartość zakładek będzie schowana, a pojawi się dopiero gdy skrypt przełączania będzie już wgrany.

  15. Piotr Usewicz 15 25 marca 2006, 21:45

    A nie lepiej np. z behaviour? albo jeszcze lepiej z event selectors korzystac? Poza tym... Nie sadzisz, ze zbyt przezywasz kazdy ze swoich postow? :/

  16. Wiem o behaviour… ale to jest jeden mały blog z 2 plikami .html. A drugiej części nie skomentuję… to wolny kraj.

Dodaj komentarz

Do formatowania komentarzy używaj Textile (HTML nie działa). Szczególnie jeśli wklejasz większe fragmenty kodu. W razie niepewności użyj podglądu komentarza.

Wypowiedzi obraźliwe, infantylne oraz nie na temat będą moderowane – pisząc postaraj się zwiększyć wartość dyskusji.

Komentarze nie służą do wysyłania wiadomości albo informowania o błędach, itd. Chcesz coś mi napisać – skontaktuj się.