A HTML-oldal életciklusának három fontos eseménye van:
-
DOMContentLoaded– a böngésző teljesen betöltötte a HTML-t, és a DOM fa felépül, de a külső erőforrások, például a képek<img>és a stíluslapok még nem töltődtek be. -
load– nemcsak a HTML van betöltve, hanem az összes külső erőforrás is: képek, stílusok stb. -
beforeunload/unload– a a felhasználó elhagyja az oldalt.
Minden esemény hasznos lehet:
-
DOMContentLoadedesemény – a DOM készen áll , így a kezelő megkeresheti a DOM csomópontokat, inicializálhatja az interfészt. -
loadesemény – külső erőforrások vannak betöltve, így stílusok kerülnek alkalmazásra, képméretek ismertek stb. -
beforeunloadesemény – a felhasználó távozik: ellenőrizhetjük, hogy a felhasználó elmentette-e a módosításokat, és megkérdezhetjük, hogy valóban el akarnak-e hagyni. - – a felhasználó majdnem távozott, de még mindig kezdeményezhetünk néhány műveletet, például statisztikák küldését.
Fedezzük fel ezen események részleteit.
DOMContentLoaded
A DOMContentLoaded esemény a document objektumon történik.
Mi a addEventListener használatával kell elkapnia:
Például:
A példában a DOMContentLoaded kezelő a dokumentum betöltésekor fut, így az összes elemet láthatja, beleértve az alábbi <img> -t.
De ez nem várja meg a kép betöltését. Tehát a alert nulla méretet mutat.
Első látásra a DOMContentLoaded esemény nagyon egyszerű. A DOM fa készen áll – íme az esemény. Kevés a sajátosság.
DOMContentLoaded és szkriptek
Amikor a böngésző feldolgoz egy HTML-dokumentumot, és rábukkan egy <script> címkére, akkor végre kell hajtani, mielőtt folytatnánk a DOM felépítését. Ez elővigyázatosság, mivel a szkriptek módosíthatják a DOM-ot, sőt document.write is, így DOMContentLoaded várni kell.
Tehát a DOMContentLoaded feltétlenül az ilyen szkriptek után következik be:
A fenti példában először a „Library loading…”, majd a „DOM ready!” üzenetet látjuk. (az összes szkript futtatásra kerül).
Két kivétel van ebből a szabályból:
- A
asyncattribútummal ellátott szkriptek, amelyeket egy kicsit később kitérünk, ne blokkolják aDOMContentLoadedelemeket. - Azok a szkriptek, amelyek dinamikusan generálódnak a
document.createElement("script")alkalmazással, majd hozzáadódnak a weboldalhoz, szintén nem blokkolják ezt az eseményt.
DOMContentLoaded és stílusok
A külső stíluslapok nem befolyásolják a DOM-ot, ezért a DOMContentLoaded nem várja meg őket.
De van buktató. Ha van egy szkriptünk a stílus után, akkor a szkriptnek meg kell várnia, amíg a stíluslap betöltődik:
Ennek az az oka, hogy a szkript szeretné megszerezni az elemek koordinátáit és más stílusfüggő tulajdonságait, például a fenti példa. Természetesen meg kell várnia a stílusok betöltését.
Amint DOMContentLoaded vár a szkriptekre, most már a stílusokat is megvárja előttük.
Beépített böngésző automatikus kitöltés
Firefox, Chrome és Opera automatikus kitöltési űrlapok a DOMContentLoaded oldalon.
Például, ha az oldal rendelkezik űrlap bejelentkezéssel és jelszóval, és a böngésző megjegyezte az értékeket, majd a DOMContentLoaded oldalon megpróbálhatja automatikusan kitölteni őket (ha a felhasználó jóváhagyja).
Tehát ha A DOMContentLoaded -t hosszú betöltésű szkriptek elhalasztják, majd az automatikus kitöltés is vár. Valószínűleg látta, hogy egyes webhelyeken (ha a böngésző automatikus kitöltését használja) – a bejelentkezési / jelszó mezők nem töltődnek be azonnal, de késik az oldal teljes betöltése. Ez valójában a késleltetés a DOMContentLoaded eseményig.
window.onload
A load esemény az window objektumon vált ki, amikor az egész oldal, beleértve a stílusokat, képeket és más erőforrásokat, betöltődik. Ez az esemény a onload tulajdonságon keresztül érhető el.
Az alábbi példa helyesen mutatja a képméreteket, mert window.onload várja összes kép:
window.onunload
Amikor egy látogató elhagyja az oldalt, a unload esemény elindul a . Tehetünk ott valamit, amely nem jár késéssel, például bezárhatjuk a kapcsolódó felugró ablakokat.
A figyelemre méltó kivétel az elemzés küldése.
Tegyük fel, hogy adatokat gyűjtünk az oldal állapotáról. használt: egérkattintások, görgetések, megtekintett oldalterületek stb.
Természetesen a unload esemény az, amikor a felhasználó elhagy minket, és szeretnénk mentse az adatokat a szerverünkre.
Az adatokat a háttérben küldi el.A másik oldalra való áttérés nem késik: a böngésző elhagyja az oldalt, de mégis végrehajtja a (z) sendBeacon műveletet.
A használat módja:
- A kérést POST-ként küldjük.
- Nem csak karaktersorozatot, hanem űrlapokat és más formátumokat is küldhetünk, a Fetch fejezetben leírtak szerint, de általában ez egy szigorított objektum.
- Az adatokat 64 KB korlátozza.
Amikor a sendBeacon kérelem befejeződött, a böngésző valószínűleg már elhagyta a dokumentumot, tehát nincs mód a szerver válaszának megszerzésére (ami az elemzéshez általában üres).
Van egy keepalive jelző is az ilyen “oldal után balra” kérések végrehajtásához. az általános hálózati kérelmek lekérési metódusában. További információt a API lehívása című fejezetben talál.
Ha meg akarjuk szakítani az áttérést egy másik oldalra, akkor itt nem tudjuk megtenni. De használhatunk egy másikat esemény – onbeforeunload.
window.onbeforeunload
Ha a látogató navigációt kezdeményezett aw az oldalról, vagy megpróbálja bezárni az ablakot, a beforeunload kezelő további megerősítést kér.
Ha lemondjuk az eseményt, a böngésző megkérdezheti a látogatót, hogy biztosak benne.
Kipróbálhatja a kód futtatásával, majd az oldal újratöltésével:
Történelmi okokból a nem üres karakterlánc visszaadása is törlésnek számít az esemény. Néhány évvel ezelőtt a böngészők szokták üzenetként megjeleníteni, de ahogy a modern specifikáció mondja, nem kellene.
Íme egy példa:
A viselkedés megváltozott , mert néhány webmester félrevezető és idegesítő üzenetek megjelenítésével bántalmazta ezt az eseménykezelőt. Tehát jelenleg a régi böngészők továbbra is üzenetként jeleníthetik meg, de ettől eltekintve – nincs mód a felhasználó számára megjelenített üzenet testreszabására.
readyState
Mi történik, ha beállítjuk a DOMContentLoaded kezelő a dokumentum betöltése után?
Természetesen soha nem fut.
Vannak esetek, amikor nem vagyunk biztosak abban, hogy a a dokumentum készen áll vagy sem. Szeretnénk, ha a DOM betöltésekor a funkciónk végre kellene hajtani, legyen az most vagy később.
A document.readyState tulajdonság elmondja nekünk az aktuális betöltési állapotot.
Három lehetséges érték létezik:
-
"loading"– a dokumentum betöltődik. -
"interactive"– a dokumentum teljes elolvasása megtörtént. -
"complete"– a dokumentum teljesen le lett olvasva, és minden erőforrás (például képek) be lett töltve is.
Tehát ellenőrizhetjük a document.readyState fájlt, beállíthatunk egy kezelőt, vagy azonnal végrehajthatjuk a kódot, ha kész.
Van az állapot megváltozásakor kiváltó readystatechange esemény is, így ezeket az állapotokat így tudjuk kinyomtatni:
A readystatechange event a dokumentum betöltési állapotának követésének alternatív mechanikája, már régen megjelent. Manapság ritkán használják.
Lássuk a teljes eseményfolyamatot a teljesség érdekében.
Íme egy dokumentum, amelynek <iframe>, <img> és az eseményeket naplózó kezelők:
A működő példa a homokozóban található.
A tipikus kimenet:
A a szögletes zárójelben szereplő számok annak körülbelüli időpontját jelzik, amikor megtörténik. Az azonos számjeggyel ellátott események nagyjából egyidőben történnek (± néhány ms).
-
document.readyStateleszinteractiveközvetlenül aDOMContentLoadedelőtt. Ez a két dolog valójában ugyanazt jelenti. -
document.readyStatecompletelesz, amikor az összes erőforrás (iframeésimg) betöltődik. Itt láthatjuk, hogy ez körülbelül ugyanabban az időben történik, mintimg.onload(imgaz utolsó erőforrás) éswindow.onload.completeállapotra váltás ugyanazt jelenti, mintwindow.onload. A különbség az, hogy awindow.onloadmindig minden másloadkezelő után működik.
Összefoglalás
Oldalbetöltési események:
- A
DOMContentLoadedesemény kiváltja adocumentfájlt, amikor a DOM kész. Ebben a szakaszban alkalmazhatjuk a JavaScript-et az elemekre.- Az olyan szkript, mint a
<script>https://javascript.info/...</script>vagy a<script src="https://javascript.info/..."></script>blokkolja a DOMContentLoaded elemet, a böngésző vár hogy végre tudják hajtani őket. - A képek és más források továbbra is folytatódhatnak.
- Az olyan szkript, mint a
- A
loadAz esemény azwindoweseményen vált ki, amikor az oldal és az összes erőforrás betöltődik. Ritkán használjuk, mert általában nem kell ilyen sokáig várni. - A
beforeunloadesemény azwindowoldalon vált ki, amikor a felhasználó el akarja hagyni az oldalt. Ha töröljük az eseményt, a böngésző megkérdezi, hogy a felhasználó valóban el akar-e hagyni (pl. Vannak nem mentett változtatásaink). - A
unloadesemény a akkor vált ki, amikor a felhasználó végre távozik, a kezelőben csak egyszerű dolgokat tehetünk, amelyek nem járnak késéssel vagy felhasználó megkérdezésével. E korlátozás miatt ritkán használják. Küldhetünk hálózati kérelmet a következővel:navigator.sendBeacon. -
document.readyStatea dokumentum aktuális állapota, a változtatások nyomon kell követni areadystatechangeeseményben:-
loading– a dokumentum betöltődik. -
interactive– a dokumentum elemezve van, nagyjából ugyanabban az időben történik, mint aDOMContentLoaded, de előtte. -
complete– a dokumentum és az erőforrások betöltődnek, körülbelül ugyanabban az időben történik, mint awindow.onload, de előtte.
-