LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Przegląd bloga /Tworzenie stron internetowych / Klasyczne skrypty i DOM: wyszukiwanie elementów we...
Ten artykuł w innych językach:

Klasyczne skrypty i DOM: wyszukiwanie elementów we właściwym momencie

Klasyczne skrypty i DOM: wyszukiwanie elementów we właściwym momencie

Management Summary

Skrypty to niewielkie programy dodające stronom funkcje, takie jak przełączanie jasnego i ciemnego wyglądu. Przeglądarka buduje jednak stronę krok po kroku. Program uruchomiony zbyt wcześnie nie może jeszcze uwzględnić obrazów w dalszej części strony. W efekcie obrazy mogą nie pasować do wybranego wyglądu. Artykuł wyjaśnia ten przebieg i znaczenie właściwego momentu uruchomienia: tekst, obrazy i przyciski powinny współgrać już przy pierwszym otwarciu strony.

Spis treści
  1. Pozycja w źródle nie jest pomiarem wykonania
  2. Co wykazał test przeglądarkowy
  3. Dlaczego późniejsze kliknięcie nie wystarcza
  4. Zamiana obrazów po parsowaniu
  5. Pytania i odpowiedzi
  6. Źródła

Parser HTML odczytuje kod strony i buduje strukturę jej elementów. Klasyczny skrypt przetwarzany przez parser HTML, bez async i skutecznego defer, zatrzymuje dalsze parsowanie HTML na czas wykonania. Elementy zapisane dalej w źródle zwykle jeszcze nie istnieją w drzewie dokumentu (DOM). Moduły, skrypty asynchroniczne i skrypty dodawane dynamicznie działają według innych reguł.

To wyjaśnia typowy błąd zmiany motywu: przełącznik w nagłówku działa, ale przy pierwszym ładowaniu nie znajduje obrazów w dalszej części artykułu. Wszystkie pliki obrazów mogą już istnieć; wyszukiwanie następuje po prostu zbyt wcześnie.

Izolowany test: zero figur podczas parsowania, dwie po parsowaniu i jedna zaplanowana zamiana
Test z 24 października 2026 w Chromium: dwie figury po skrypcie w head. Wyniki dotyczą tego przykładu, a nie historycznych odsłon.

Pozycja w źródle nie jest pomiarem wykonania

Pozycja bajtowa opisuje kolejność w dostarczonym HTML. Zliczenie znaczników otwierających nie daje automatycznie liczby istniejących elementów DOM: znaczenie mają komentarze, treść skryptów, elementy tworzone niejawnie oraz późniejsze zmiany. Wcześniejsze skrypty mogą też dodać kolejne elementy.

Między innymi dlatego właściwy test zapisuje document.readyState i rzeczywistą liczbę znalezionych elementów w chwili wykonania. Wcześniejsze rozmiary strony i liczby plików nie są tutaj przedstawiane jako odtworzone pomiary. Mechanizm pokazuje niewielki, izolowany przykład uruchomiony w przeglądarce.

Co wykazał test przeglądarkowy

W teście z 24 października 2026 dwa elementy figure występują po klasycznym skrypcie w sekcji head. Wczesne wyszukiwanie znajduje zero figur. Zewnętrzny skrypt klasyczny z defer oraz zwykły moduł znajdują później obie figury. Dodanie defer do osadzonego skryptu klasycznego nie opóźnia wykonania.

querySelectorAll() zwraca ponadto statyczną listę. Pusta lista zachowana wcześniej pozostaje pusta także po utworzeniu obu figur. Po parsowaniu potrzebne jest więc ponowne wyszukanie elementów. Sprawdzono izolowany przykład w Chromium, a nie zestaw różnych przeglądarek ani historyczny zapis ruchu sieciowego witryny.

Dlaczego późniejsze kliknięcie nie wystarcza

Kliknięcie po parsowaniu sprawdza zmianę stanu przy już istniejących elementach. Nie potwierdza poprawnego działania podczas pierwszego ładowania. Kliknięcie może też nastąpić jeszcze w trakcie ładowania, gdy przycisk jest już widoczny i ma zarejestrowaną obsługę zdarzenia.

Zapisany wybór jasnego motywu, ponowne ładowanie w ciemnym motywie i przełączenie podczas ładowania stanowią zatem osobne przypadki testowe. Przy każdej zamianie obrazów liczy się bieżący stan motywu. Istnienie elementów nagłówka nie dowodzi, że figury w dalszej części artykułu już powstały.

Zamiana obrazów po parsowaniu

Poniższy przykład integracji wymaga istniejącej funkcji bilderJetztTauschen(hell). Funkcja musi przy każdym wywołaniu ponownie wyszukać aktualne obrazy i ustawić odpowiednie adresy. Fragment określa wyłącznie moment wykonania.

const wurzel = document.documentElement;
let bildtauschGeplant = false;

function bilderTauschen(hell) {
    if (document.readyState === 'loading') {
        if (bildtauschGeplant) return;
        bildtauschGeplant = true;
        document.addEventListener('DOMContentLoaded', function () {
            bildtauschGeplant = false;
            bilderJetztTauschen(wurzel.getAttribute('data-theme') === 'light');
        }, { once: true });
        return;
    }
    bilderJetztTauschen(hell);
}

Gdy readyState ma wartość loading, rejestrowany jest najwyżej jeden nasłuch zdarzenia. Po wystąpieniu zdarzenia bieżący wybór jest odczytywany z data-theme. Po parsowaniu zamiana następuje natychmiast z przekazaną wartością. Wybór w elemencie głównym musi zostać zaktualizowany przed wywołaniem funkcji.

W izolowanym teście trzy wczesne wywołania spowodowały dokładnie jedną późniejszą zamianę z ostatnio ustawionym jasnym motywem. Następne wywołanie z ciemnym motywem zadziałało natychmiast. Jest to ulepszony przykład; kontrola artykułu nie zmieniła produkcyjnego motywu.

Pytania i odpowiedzi

Kiedy pomagają defer i moduły?

Dla zewnętrznych skryptów klasycznych defer przesuwa wykonanie po parsowaniu HTML i zachowuje kolejność dokumentu. Zwykłe moduły również wykonują się po parsowaniu. async nie daje takiej gwarancji; wykonanie zależy od dostępności skryptu. Przy modułach async może mieć znaczenie także bez własnego src. Dla osadzonych skryptów klasycznych defer i async pozostają bezskuteczne.

Dlaczego DOMContentLoaded zamiast load?

DOMContentLoaded następuje po parsowaniu HTML i powiązanych skryptach odroczonych. Zdarzenie nie czeka na wszystkie obrazy ani skrypty asynchroniczne; arkusze stylów mogą opóźniać wykonanie pośrednio przez oczekujące skrypty. load czeka na dodatkowe zasoby strony, ale pomija obrazy ładowane leniwie. Dla potrzebnych fontów właściwym punktem kontroli jest document.fonts.ready. Do znalezienia figur wystarcza zbudowane drzewo dokumentu.

Czy zamiana zapobiega podwójnemu pobieraniu obrazów?

Nie. Mechanizm wstępnego pobierania lub ładowania obrazów mógł już wysłać żądanie pierwotnego adresu. Rzeczywisty koszt zależy od pamięci podręcznej, odległości od widocznego obszaru, połączenia i przeglądarki; loading="lazy" nie gwarantuje uniknięcia żądania. Lepszym dowodem jest zapis ruchu sieciowego, a nie pozycja skryptu.

<picture> z prefers-color-scheme może uwzględnić preferencję systemową. Wybór przechowywany wyłącznie w localStorage nie jest dostępny dla zapytań medialnych CSS ani automatycznie znany serwerowi. Wybór po stronie serwera wymaga osobnego przekazania stanu.

Co z artykułami dodanymi później?

DOMContentLoaded nie występuje ponownie dla tego samego dokumentu. Zmiana treści bez pełnej nawigacji wymaga osobnego wywołania po wstawieniu elementów. W teście dodanie później trzeciej figury nie uruchomiło automatycznie kolejnej zamiany.

Lukas Wójcik

Lukas Wójcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Masz pytanie lub pomysł na projekt internetowy? Napisz krótko, o co chodzi. Formularz korzysta z reCAPTCHA do ochrony przed spamem.

Napisanie komentarza

Przypadki brzegowe pominięte w artykule i pytania o kod są tu mile widziane.

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.