window.onload vs <body onload = “” />


227

Qual è esattamente la differenza tra l' window.onloadevento e l' onloadevento del bodytag? quando uso quale e come dovrebbe essere fatto correttamente?


2
dovresti usare "per circondare il valore dell'attributo
Sven Larson

Risposte:


218

window.onload = myOnloadFunce <body onload="myOnloadFunc();">sono modi diversi di utilizzare lo stesso evento . L'uso window.onloadè meno invadente, ma toglie JavaScript dall'HTML.

Tutte le librerie JavaScript, Prototype, ExtJS, Dojo, JQuery, YUI, ecc. Comuni forniscono wrapper per eventi che si verificano durante il caricamento del documento. Puoi ascoltare l'evento onLoad della finestra e reagire a quello, ma onLoad non viene attivato fino a quando non sono state scaricate tutte le risorse, quindi il gestore dell'evento non verrà eseguito fino a quando non sarà stata recuperata l'ultima immagine enorme. In alcuni casi è esattamente quello che vuoi, in altri potresti scoprire che ascoltare quando il DOM è pronto è più appropriato: questo evento è simile a onLoad ma si attiva senza attendere il download di immagini, ecc.


57
Va notato, tuttavia, che esiste una differenza. L'evento onload inline richiamerà myOnloadFunc()nel contesto globale (this farà riferimento a window). L'impostazione tramite javascript lo farà eseguire nel contesto dell'elemento (si thisriferisce all'elemento su cui è stato attivato l'evento). In questo caso particolare, non farà differenza, ma lo farà con altri elementi.
mowwwalker,

1
@Walkerneo: Sì, sicuramente vale la pena notare. Naturalmente, usando una libreria JS è possibile ignorare l'oggetto a cui si thisfa riferimento se lo si desidera.
Richard Turner,

@RichardTurner Non è necessario utilizzare una libreria per modificare l'associazione del contesto. Una semplice chiamata .bind () lo fa
Kloar

@Kloar puoi in questi giorni, sì, ma hai bisogno di MSIE9 +. Sul vecchio MSIE, che era molto più comune quando ho risposto, avresti bisogno di un polyfill.
Richard Turner,

33

Non c'è differenza, ma non dovresti usare neanche.

In molti browser, l' window.onloadevento non viene attivato fino a quando non sono state caricate tutte le immagini, il che non è quello desiderato. I browser basati su standard hanno un evento chiamato DOMContentLoadedche si attiva in precedenza, ma non è supportato da IE (al momento della stesura di questa risposta). Consiglierei di utilizzare una libreria javascript che supporti una funzione DOMContentLoaded per browser diversi o di trovare una funzione ben scritta che puoi usare. jQuery's $(document).ready(), è un buon esempio.


53
Domanda dal futuro ... E se non ci fosse jquery?
Sid

54
Domanda del presente. Cosa succede se jQuery è eccessivo per il progetto in corso? (Non bussare a jQuery, usalo da solo. Qualche volta voglio solo una caratteristica fuori da una libreria ..)
Bradmage

14
Quando dici "non supportato da IE", questa è una verità universale, o vera solo per versioni specifiche di IE? Dal momento che molte cose sono cambiate nel mondo dei browser da quando hai scritto questa risposta, forse è il momento di aggiornare questa risposta?
Bryan Oakley,

8
DOMContentLoaded è ora supportato da IE9 e versioni successive: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Adam

6
Resocontando dal futuro, DOMContentLoaded è ora supportato da tutti i principali browser: caniuse.com/#feat=domcontentloaded
Jose Gómez

21

window.onloadpuò funzionare senza corpo. Crea una pagina con solo i tag di script e aprila in un browser. La pagina non contiene alcun corpo, ma funziona ancora ..

<script>
  function testSp()
  {
    alert("hit");
  }
  window.onload=testSp;
</script>

6
L'HTML senza il tag body non è valido se si aggiunge effettivamente contenuto (che dovrebbe trovarsi in un tag body). Anche nel tag dello script manca un tipo. Non fare mai affidamento sui browser che riparano il tuo codice non conforme allo standard! (Dato che i browser potrebbero farlo diversamente o per niente in passato o in futuro.)
Kissaki

4
@Kissaki: HTML standard non ha affatto bisogno di un body tag!
Robert Siemer,

5
xhtml1 specifica <!ELEMENT html (head, body)>[1] - e html401 specifica anche <!ELEMENT HTML O O (%html.content;)con <!ENTITY % html.content "HEAD, BODY">[2]. html51 indica anche il A head element followed by a body element.contenuto html. [3] w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/html51/semantics.html#the -html elemento - Quindi credo che tutte quelle standard HTML comuni / in uso fare richiedono un tag body. :)
Kissaki,

1
@Kissaki che è XHTML, non HTML. L'HTML consente l'omissione di tag sia dei tag body iniziali e finali, sia dell'omissione di tag html e head, come da DTML SGML. w3.org/TR/html401/struct/global.html#edef-BODY Start tag: optional, End tag: optional
OdraEncoded

1
@Kissaki: html5 non ha più bisogno del tipo di script (se è javascript), hai ragione per le versioni precedenti.
Segna il

10

Preferisco, in generale, non usare l' <body onload=""evento>. Penso che sia più pulito mantenere il comportamento separato dai contenuti il ​​più possibile.

Detto questo, ci sono occasioni (di solito abbastanza rare per me) in cui l'uso del carico corporeo può dare un leggero aumento di velocità.

Mi piace usare Prototype, quindi generalmente inserisco qualcosa di simile nel <head> della mia pagina:

document.observe("dom:loaded", function(){
  alert('The DOM is loaded!');
});

o

Event.observe(window, 'load', function(){
  alert('Window onload');
});

Quanto sopra sono trucchi che ho imparato qui . Sono molto affezionato al concetto di allegare gestori di eventi al di fuori dell'HTML.

(Modifica per correggere l'errore di ortografia nel codice.)


In quali occasioni sarebbe più veloce e perché?
Kissaki

Questa risposta sembra molto soggettiva con tutti gli "io" ("preferisco", "penso"). Che, se non ci sono ulteriori fatti oggettivi e verificabili, supporta questa impressione.
Kissaki

1
Prenderei questa risposta con un granello di sale considerando che è stata pubblicata oltre 6 anni fa. Sei più che benvenuto per aggiornarlo o pubblicare la tua risposta migliorata.
Mark Biek,

7

'così tante risposte soggettive a una domanda obiettiva. JavaScript "discreto" è superstizione come la vecchia regola di non usare mai goto. Scrivi il codice in un modo che ti aiuti a raggiungere il tuo obiettivo in modo affidabile, non secondo le credenze religiose alla moda di qualcuno.

Chiunque trovi:

 <body onload="body_onload();">

distrarre troppo è troppo pretenzioso e non ha le priorità diritte.

Normalmente inserisco il mio codice JavaScript in un file .js separato, ma non trovo nulla di ingombrante nell'agganciare i gestori di eventi in HTML, che è comunque valido HTML.


39
C'è una buona ragione per scrivere javascript discreto. Supponi di avere un'app Web con 100 pagine e di aver usato il metodo <body onload = "body_onload ();"> invece di inserirlo nel file javascript incluso in ogni pagina. Quindi immagina di dover cambiare il nome di quella funzione per qualche motivo. Mettere l'evento nel file javascript incluso 1) rende le modifiche notevolmente più semplici e 2) consente di risparmiare risorse del server poiché i file javascript possono essere memorizzati nella cache per un anno (su un server correttamente configurato) invece di scaricare più volte lo stesso codice.
Andrew Ensley,

21
Quindi, poiché non ti preoccupi di imparare perché si consiglia qualcosa, si etichettano le raccomandazioni "credenze religiose alla moda" ??
hallvors

6
La domanda è "qual è la differenza tra questi due metodi?", Insieme a una richiesta di raccomandazione per la quale è meglio. In che modo la tua risposta risponde a questa domanda?
Richard Turner,

1
Qualsiasi situazione in cui si crea una soluzione modulare in 1 posto che può essere applicata a una grande massa di file è molto meglio che aggiungere il codice a ciascuna della massa di file stessa. È meglio per il tempo di costruzione originale, per scopi organizzativi del codice, per leggibilità e per future modifiche. Non è alla moda, in realtà è un concetto più vecchio che è presente in linguaggi come Java e C ++ che i programmatori Web stanno ora adottando come il modo migliore per codificare.
Jimbo Jonny,

1
Una buona difesa contro gli attacchi XSS nei browser moderni è disabilitare tutti i javascript in linea con la tua politica di sicurezza dei contenuti. Questa è una buona ragione per non usare l'attributo onload nel tuo HTML.
Greg Ball,

4

window.onload- Chiamato dopo tutti i file DOM, JS, immagini, Iframe, estensioni e altri completamente caricati. Questo è uguale a $ (finestra) .load (funzione () {});

body onload=""- Chiamato una volta caricato DOM. Questo è uguale a $ (documento) .ready (funzione () {});


1
Qualcuno è in grado di procurarselo? Ho visto questa affermazione su molti forum ma mai con un link a dove è definito nelle specifiche.
crempp,

1
@crempp C'è l'elemento body e gli attributi globali , quindi direi che non è vero. Ma puoi provarlo tu stesso, vedi jsbin.com/OmiViPAJ/1/edit . Lì, puoi vedere che l'evento di caricamento dell'immagine viene generato prima dell'evento di caricamento del corpo.
Olaf Dietsche,

2
Questa risposta contraddice gli altri; puoi fornire una fonte?
Jimmy Breck-McKye,

2
api.jquery.com/ready Il documento jQuery dice: "Il metodo .ready () è generalmente incompatibile con l'attributo <body onload =" ">." Penso che in jQuery sia più vicino a body.onload $ (window) .load (..) ma penso che siano ancora diversi.
ccsakuweb,

2
Questa risposta è completamente sbagliata e non dovrebbe avere voti positivi. In effetti, questo tipo di risposta è generalmente citato come uno dei più grandi equivoci su eventi readyvs. viene generato dopo il caricamento dell'intero documento, inclusi tutti gli script, le immagini e i fogli di stile. viene generato dopo che l'albero DOM è stato creato ma prima delle immagini ecc. È equivalente a quello no . onloadloadDOMContentLoadedDOMContentLoadeddocument.readyload
rism

2

Non c'è differenza ...

Quindi principalmente puoi usare entrambi (uno alla volta! -)

Ma per motivi di leggibilità e per la pulizia del codice HTML preferisco sempre window.onload! O]


1

Se stai cercando di scrivere codice JS discreto (e dovresti esserlo), non dovresti usare <body onload="">.

Comprendo che browser diversi gestiscono questi due in modo leggermente diverso ma funzionano in modo simile. Nella maggior parte dei browser, se si definiscono entrambi, uno verrà ignorato.


1

Pensa a onload come qualsiasi altro attributo. In una casella di input, ad esempio, è possibile inserire:

<input id="test1" value="something"/>

Oppure puoi chiamare:

document.getElementById('test1').value = "somethingelse";

L'attributo onload funziona allo stesso modo, tranne per il fatto che accetta una funzione come valore anziché una stringa come fa l'attributo value. Questo spiega anche perché puoi "usarne solo uno" - chiamando window.onload riassegna il valore dell'attributo onload per il tag body.

Inoltre, come altri stanno dicendo, di solito è più pulito mantenere lo stile e il javascript separati dal contenuto della pagina, motivo per cui la maggior parte delle persone consiglia di utilizzare window.onload o come la funzione ready di jQuery.


1

<body onload = ""> dovrebbe sovrascrivere window.onload.

Con <body onload = "">, document.body.onload potrebbe essere nullo, indefinito o una funzione a seconda del browser (sebbene getAttribute ("onload") dovrebbe essere in qualche modo coerente per ottenere il corpo della funzione anonima come stringa) . Con window.onload, quando si assegna una funzione ad essa, window.onload sarà una funzione coerente tra i browser. Se questo è importante per te, usa window.onload.

window.onload è meglio per separare JS dal tuo contenuto comunque. Non ci sono molti motivi per usare <body onload = ""> quando puoi usare window.onload.

In Opera, la destinazione dell'evento per window.onload e <body onload = ""> (e anche window.addEventListener ("load", func, false)) sarà la finestra anziché il documento come in Safari e Firefox. Ma "questo" sarà la finestra tra i browser.

Ciò significa che, quando è importante, dovresti avvolgere il greggio e rendere le cose coerenti o utilizzare una libreria che lo fa per te.


0

Entrambi funzionano allo stesso modo. Tuttavia, si noti che se entrambi sono definiti, solo uno di essi verrà richiamato. In genere evito di utilizzarli direttamente. Al contrario, è possibile collegare un gestore eventi all'evento load. In questo modo è possibile incorporare più facilmente altri pacchetti JS che potrebbero anche aver bisogno di allegare un callback all'evento onload.

Qualsiasi framework JS avrà metodi cross-browser per i gestori di eventi.


0

È uno standard accettato che abbia contenuto, layout e comportamento separati. Quindi window.onload () sarà più adatto da usare che <body onload="">sebbene entrambi facciano lo stesso lavoro.


0

Ci scusiamo per la reincarnazione di questa discussione di nuovo dopo altri 3 anni di sonno, ma forse ho finalmente trovato l'indiscutibile vantaggio di window.onload=fn1;over <body onload="fn1()">. Riguarda i moduli JS o ES : quando il onloadgestore risiede nel file JS "classico" (ovvero riferito senza <script type="module" … >, è possibile in entrambi i modi; quando il onloadgestore risiede nel file JS "modulo" (cioè riferito con <script type="module" … >, il <body onload="fn1()">fallimento con "fn1 () non è definito "errore. Il motivo forse è che i moduli ES non vengono caricati prima dell'analisi HTML ... ma è solo una mia ipotesi. Comunque, window.onload=fn1;funziona perfettamente con i moduli ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.