HTML-sivun elinkaarella on kolme tärkeää tapahtumaa:
-
DOMContentLoaded
– selaimen täysin ladattu HTML-koodi ja DOM-puu on rakennettu, mutta ulkoisia resursseja, kuten kuvia<img>
ja tyylitaulukoita, ei ehkä ole vielä ladattu. -
load
– HTML: n lisäksi ladataan myös kaikki ulkoiset resurssit: kuvat, tyylit jne. -
beforeunload/unload
– käyttäjä poistuu sivulta.
Jokainen tapahtuma voi olla hyödyllinen:
-
DOMContentLoaded
tapahtuma – DOM on valmis , joten käsittelijä voi etsiä DOM-solmuja, alustaa käyttöliittymän. -
load
-tapahtuma – ulkoisia resursseja ladataan, joten tyylejä käytetään, kuvakoot tunnetaan jne. -
beforeunload
-tapahtuma – käyttäjä lähtee: voimme tarkistaa, tallensiko käyttäjä muutokset, ja kysyä, haluavatko he todella poistua. - – käyttäjä melkein lähti, mutta voimme silti aloittaa joitain toimintoja, kuten tilastojen lähettämisen.
Tutkitaan näiden tapahtumien yksityiskohtia.
DOMContentLoaded
DOMContentLoaded
-tapahtuma tapahtuu objektissa document
.
Me täytyy käyttää addEventListener
sen saamiseksi:
Esimerkiksi:
Esimerkissä DOMContentLoaded
-käsittelijä toimii, kun asiakirja ladataan, jotta se voi nähdä kaikki elementit, mukaan lukien <img>
alla.
Mutta se ei odota kuvan latautumista. Joten alert
näyttää nollakokoja.
Ensi silmäyksellä DOMContentLoaded
-tapahtuma on hyvin yksinkertainen. DOM-puu on valmis – tässä tapahtuma. Niitä on kuitenkin vähän.
DOMContentLoaded ja komentosarjat
Kun selain käsittelee HTML-asiakirjaa ja löytää <script>
-tunnisteen, se on suoritettava ennen DOM: n rakentamisen jatkamista. Se on varotoimenpide, koska komentosarjat saattavat haluta muokata DOM: ää ja jopa document.write
siihen, joten DOMContentLoaded
on odotettava.
Joten DOMContentLoaded tapahtuu ehdottomasti tällaisten komentosarjojen jälkeen:
Yllä olevassa esimerkissä näemme ensin ”Kirjasto ladattu …” ja sitten ”DOM valmis!” (kaikki komentosarjat suoritetaan).
Tästä säännöstä on kaksi poikkeusta:
- Komentosarjat
async
-määritteellä, jotka käsitellään hieman myöhemmin, älä estäDOMContentLoaded
. - Komentosarjat, jotka luodaan dynaamisesti
document.createElement("script")
-koodilla ja lisätään sitten verkkosivulle, eivät myöskään estä tätä tapahtumaa.
DOMContentLoaded ja tyylit
Ulkoiset tyylitaulukot eivät vaikuta DOM: iin, joten DOMContentLoaded
ei odota niitä.
Mutta on kuoppa. Jos tyylin jälkeen on komentosarja, sen on odotettava, kunnes tyylitaulukko latautuu:
Syynä tähän on, että komentosarja saattaa haluta saada koordinaatit ja muut elementtien tyylistä riippuvat ominaisuudet, kuten yllä olevassa esimerkissä. Luonnollisesti sen on odotettava tyylien latautumista.
Kun DOMContentLoaded
odottaa komentosarjoja, se odottaa nyt myös tyylit ennen niitä.
Sisäänrakennettu selaimen automaattinen täyttö
Firefox-, Chrome- ja Opera-automaattisen täytön lomakkeet DOMContentLoaded
-palvelussa.
Esimerkiksi, jos sivulla on lomake sisäänkirjautumisella ja salasanalla, ja selain muisti arvot, sitten DOMContentLoaded
-kohdassa se voi yrittää täyttää ne automaattisesti (jos käyttäjä on hyväksynyt sen).
Joten jos DOMContentLoaded
lykkää pitkään latautuvat komentosarjat, niin myös automaattinen täyttö odottaa. Olet todennäköisesti nähnyt sen joillakin sivustoilla (jos käytät selaimen automaattista täyttöä) – kirjautumis- / salasanakenttiä ei täytetä automaattisesti heti, mutta sivun latautuminen viivästyy. Se on oikeastaan viive DOMContentLoaded
-tapahtumaan.
window.onload
load
window
-objektin tapahtuma laukaisee, kun koko sivu ladataan, mukaan lukien tyylit, kuvat ja muut resurssit. Tämä tapahtuma on käytettävissä onload
-ominaisuuden kautta.
Alla oleva esimerkki näyttää kuvakoot oikein, koska window.onload
odottaa kaikki kuvat:
window.onunload
Kun kävijä poistuu sivulta, unload
-tapahtuma laukaisee window
. Voimme tehdä siellä jotain, johon ei liity viivettä, kuten sulkea liittyvät ponnahdusikkunat.
Huomattava poikkeus on analytiikan lähettäminen.
Oletetaan, että keräämme tietoja sivun tilasta. käytetty: hiiren napsautukset, vieritykset, tarkastellut sivualueet ja niin edelleen.
Luonnollisesti unload
-tapahtuma on silloin, kun käyttäjä jättää meidät, ja haluamme tallenna tiedot palvelimellemme.
Se lähettää tiedot taustalla.Siirtyminen toiselle sivulle ei viivästy: selain poistuu sivulta, mutta suorittaa silti sendBeacon
.
Näin sitä käytetään:
- Pyyntö lähetetään POST-muodossa.
- Voimme lähettää paitsi merkkijonon myös lomakkeita ja muita muotoja, kuten luvussa Nouto kuvataan, mutta yleensä se on tarkennettu objekti.
- Tietoja on rajoitettu 64 kt.
Kun sendBeacon
-pyyntö on valmis, selain on todennäköisesti jo jättänyt asiakirjan, joten ei ole mitään tapaa saada palvelinvastausta (joka on yleensä tyhjä analytiikkaa varten).
Myös keepalive
-lippu tällaisten ”sivun jälkeen vasemmalle” -pyyntöjen tekemiselle yleisten verkkopyyntöjen noutomenetelmässä. Löydät lisätietoja luvusta Hae sovellusliittymä.
Jos haluamme peruuttaa siirtymisen toiselle sivulle, emme voi tehdä sitä täällä. Mutta voimme käyttää toista tapahtuma – onbeforeunload
.
window.onbeforeunload
Jos kävijä aloitti navigoinnin aw ay sivulta tai yrittää sulkea ikkunan, beforeunload
-käsittelijä pyytää lisävahvistusta.
Jos peruutamme tapahtuman, selain voi kysyä vierailijalta he ovat varmoja.
Voit kokeilla sitä suorittamalla tämän koodin ja lataamalla sitten sivun uudelleen:
Historiallisista syistä myös tyhjän merkkijonon palauttaminen lasketaan peruutukseksi tapahtuma. Jokin aika sitten selaimet näyttivät sen viestinä, mutta kuten nykyaikainen spesifikaatio sanoo, niiden ei pitäisi.
Tässä on esimerkki:
Käyttäytymistä muutettiin , koska jotkut verkkovastaavat käyttivät väärin tätä tapahtumankäsittelijää näyttämällä harhaanjohtavia ja ärsyttäviä viestejä. Joten tällä hetkellä vanhat selaimet saattavat silti näyttää sen viestinä, mutta sen lisäksi – käyttäjälle näytettävää viestiä ei voida muokata.
readyState
Mitä tapahtuu, jos asetamme DOMContentLoaded
-käsittelijä asiakirjan lataamisen jälkeen?
Se ei tietenkään toimi koskaan.
On tapauksia, joissa emme ole varmoja, onko asiakirja on valmis tai ei. Haluamme, että toimintomme suoritetaan, kun DOM ladataan, olipa se sitten vai myöhemmin.
Ominaisuus document.readyState
kertoo meille nykyisestä lataustilasta.
Arvoja on 3:
-
"loading"
– asiakirja latautuu. -
"interactive"
– asiakirja on luettu kokonaan. -
"complete"
– asiakirja on luettu kokonaan ja kaikki resurssit (kuten kuvat) ladataan myös.
Joten voimme tarkistaa document.readyState
ja asettaa käsittelijän tai suorittaa koodin heti, jos se on valmis.
Siellä on myös readystatechange
-tapahtuma, joka laukaisee, kun tila muuttuu, joten voimme tulostaa kaikki nämä tilat näin:
readystatechange
-tapahtuma on vaihtoehtoinen mekanismi asiakirjojen lataustilan seuraamiseksi, se ilmestyi kauan sitten. Nykyään sitä käytetään harvoin.
Katsotaanpa koko tapahtumien kulku täydellisyyden vuoksi.
Tässä on asiakirja, jossa on <iframe>
, <img>
ja tapahtumia kirjaavat käsittelijät:
Toimiva esimerkki on hiekkalaatikossa.
Tyypillinen tulos:
numerot hakasulkeissa tarkoittavat likimääräistä ajankohtaa, jolloin se tapahtuu. Samalla numerolla merkityt tapahtumat tapahtuvat suunnilleen samaan aikaan (± muutama ms).
-
document.readyState
tuleeinteractive
ennenDOMContentLoaded
. Nämä kaksi asiaa tarkoittavat samaa. -
document.readyState
tuleecomplete
, kun kaikki resurssit (iframe
jaimg
) ladataan. Täällä voimme nähdä, että se tapahtuu suunnilleen samaan aikaan kuinimg.onload
(img
on viimeinen resurssi) jawindow.onload
. Vaihto tilaancomplete
tarkoittaa samaa kuinwindow.onload
. Erona on, ettäwindow.onload
toimii aina kaikkien muidenload
-käsittelijöiden jälkeen.
Yhteenveto
Sivun lataustapahtumat:
-
DOMContentLoaded
-tapahtuma laukaisee kohdastadocument
, kun DOM on valmis. Voimme käyttää JavaScriptiä tässä vaiheessa elementteihin.- Skripti, kuten
<script>https://javascript.info/...</script>
tai<script src="https://javascript.info/..."></script>
estää DOMContentLoaded, selain odottaa niiden suorittamiseksi. - Kuvien ja muiden resurssien lataaminen voi silti jatkua.
- Skripti, kuten
-
load
tapahtumawindow
laukaisee, kun sivu ja kaikki resurssit ladataan. Käytämme sitä harvoin, koska yleensä ei tarvitse odottaa niin kauan. -
beforeunload
-tapahtumawindow
laukaisee, kun käyttäjä haluaa poistua sivulta. Jos peruutamme tapahtuman, selain kysyy, haluaako käyttäjä todella poistua (esim. Meillä on tallentamattomia muutoksia). -
unload
-tapahtuma ryhmässäwindow
laukaisee, kun käyttäjä lopulta lähtee, käsittelijässä voimme tehdä vain yksinkertaisia asioita, joihin ei liity viivästyksiä tai käyttäjän pyytämistä. Tämän rajoituksen vuoksi sitä käytetään harvoin. Voimme lähettää verkkopyynnön osoitteellanavigator.sendBeacon
. -
document.readyState
on asiakirjan nykyinen tila, muutoksia voidaan tehdä seurataanreadystatechange
-tapahtumassa:-
loading
– asiakirja latautuu. -
interactive
– asiakirja on jäsennetty, tapahtuu suunnilleen samaan aikaan kuinDOMContentLoaded
, mutta ennen sitä. -
complete
– asiakirja ja resurssit ladataan, tapahtuu suunnilleen samaan aikaan kuinwindow.onload
, mutta ennen sitä.
-