OVH Cloud OVH Cloud

quand se produit window.onload ?

13 réponses
Avatar
yvon.thoravalNO-SPAM
Excusez moi pour une question sibasique :

quand se produit window.onload ?

je pensais, sans doute naïvement, que ça se produit quand la fenêtre est
chargée, ben avec Camino non.

basiquement, mon script, après quelques tripatouillages fait un :

window.onload=run();

il bloquait quand il était dans les balises <head/>
je l'ai mis juste avant </body>, ça marche nickel-chrome et donc, quand
ça ne marchait j'ai mis un alert("toto"); dans ma fonction run().

donc la question est de savoir si oui ou non window.onload c'est qd le
nav a fini de charger la page ou si ce n'est vrai qu'en théorie, les
implémentations c'est autre chose ;-)

ou, autre possibilité, me goure-je ?
(qq'un qui n'a plus fait de js+dom+xhtml+css depuis plusierus années)

--
yt

10 réponses

1 2
Avatar
YD

quand se produit window.onload ?

je pensais, sans doute naïvement, que ça se produit quand la fenêtre est
chargée, ben avec Camino non.


Ah ?

basiquement, mon script, après quelques tripatouillages fait un :

window.onload=run();


S'il n'y a pas d'erreur dans ce que tu as écrit, il exécute la fonction
run() arrivé à cette ligne pour en affecter le résultat à window.onload !

Tu voulais écrire sans doute :
window.onload = run;
qui affecte la fonction à l'événement ?

ou, autre possibilité, me goure-je ?


Ben... ;-)

(qq'un qui n'a plus fait de js+dom+xhtml+css depuis plusierus années)


C'est dur de s'y remettre...


--
Y.D.

Avatar
Le Fou
Yvon Thoraval a écrit
Excusez moi pour une question sibasique :

quand se produit window.onload ?

je pensais, sans doute naïvement, que ça se produit quand la fenêtre est
chargée, ben avec Camino non.

basiquement, mon script, après quelques tripatouillages fait un :

window.onload=run();

il bloquait quand il était dans les balises <head/>
je l'ai mis juste avant </body>, ça marche nickel-chrome et donc, quand
ça ne marchait j'ai mis un alert("toto"); dans ma fonction run().

donc la question est de savoir si oui ou non window.onload c'est qd le
nav a fini de charger la page ou si ce n'est vrai qu'en théorie, les
implémentations c'est autre chose ;-)

ou, autre possibilité, me goure-je ?
(qq'un qui n'a plus fait de js+dom+xhtml+css depuis plusierus années)


Bon, c'est un peu normal. Tentative d'explication :
Le "traiteur d'évènement " (traduction perso de "event handler" ;-))
"onload" s'applique à l'objet "window" dans le cas où tu écris :
window.onload=run();
Ce qui signifie que lorsque l'objet "window" sera chargé, la fonction run()
sera déclenchée.
Or l'objet "window" n'est créé que par une balise BODY ou par une balise
FRAMESET (ou par la méthode "open()").
Si tu mets "window.onload=run();" dans le HEAD, la balise BODY n'a pas
encore été déclarée (lue par le navigateur), l'objet "window" n'a donc pas
été créé, ta fonction ne peut donc pas s'appliquer.
La meilleure manière d'utiliser "onload" pour une page c'est :
<body onload="fonction();">

D'une manière générale, si dans le HEAD tu déclares :
<script>
instruction 1;
instruction 2;
instruction 3;
...
</script>
Ces instructions vont s'exécuter dès la lecture par le navigateur, elles ne
doivent donc pas concerner des éléments de la page car ceux-ci n'ont pas
encore été créés.

--
A'tchao

Le Fou
http://perso.club-internet.fr/ehiller/
http://club.exocet.free.fr/
http://www.ffessm-cd84.com/

Avatar
YD
Yvon Thoraval a écrit
[...] window.onload=run();

il bloquait quand il était dans les balises <head/>
je l'ai mis juste avant </body>, ça marche nickel-chrome
[...]
donc la question est de savoir si oui ou non window.onload c'est qd le
nav a fini de charger la page ou si ce n'est vrai qu'en théorie, les
implémentations c'est autre chose ;-)


Bon, c'est un peu normal. Tentative d'explication :
Le "traiteur d'évènement " (traduction perso de "event handler" ;-))


[La traduction à peu près adoptée est "gestionnaire d'événement" (avec
deux accents aigus sur ÉvÉnement)...]

"onload" s'applique à l'objet "window" dans le cas où tu écris :
window.onload=run();
Ce qui signifie que lorsque l'objet "window" sera chargé, la fonction run()
sera déclenchée.


Désolé, ce que tu dis est faux. Quand javascript tombe sur :
window.onload=run();
il évalue la partie droite de l'affectation : run() -- la fonction est donc
immédiatement exécutée puisque c'est ce que signifie run(). Le résultat retourné
(ou null si rien n'est retourné) est conservé, puis la partie gauche est évaluée
et l'affectation enfin effectuée.

Ce que voulait écrire apparemment Yvon Thoraval est :
window.onload=run; // sans parenthèses
La partie droite est évaluée : c'est une référence de variable définie quelque
part avant par :
function run(){...}
ou encore par :
var run=Function("...");
ou
var run=function() {...};
javascript garde donc la référence vers cet objet puis l'affecte à la partie
gauche window.onload. Dans ce cas à la fin du chargement de la page, événement
load de l'objet window, la fonction run sera exécutée car window.onload est une
référence vers la fonction run.

Or l'objet "window" n'est créé que par une balise BODY ou par une balise
FRAMESET (ou par la méthode "open()").
Si tu mets "window.onload=run();" dans le HEAD, la balise BODY n'a pas
encore été déclarée (lue par le navigateur), l'objet "window" n'a donc pas
été créé, ta fonction ne peut donc pas s'appliquer.


Tiens donc ! window est créé avant tout autre objet : il est le conteneur du
document et correspond physiquement à une partie de l'écran (dans le cas où la
page est lue avec ce dispositif bien sûr). Pour javascript, il est l'étendue,
le champ (mauvaise traduction de scope) du script. On peut l'ajouter -- ou
l'omettre -- devant tous les objets du navigateur et des variables globales que
crée un script.
Exemples :
var a="Test";
if(window.a == a) window.alert("window.a==a"+" est true");
(à placer dans un script en premier dans le head pour voir, ou même, bien que
non conforme, avant <html>)

window.onload = run; peut s'écrire window.onload = window.run; ou plus simplement onload = run;

La meilleure manière d'utiliser "onload" pour une page c'est :
<body onload="fonction();">


Personnellement je préfère dans un script :
onload = fonction;

D'une manière générale, si dans le HEAD tu déclares :
<script>
instruction 1;
instruction 2;
instruction 3;
....
</script>
Ces instructions vont s'exécuter dès la lecture par le navigateur, elles ne
doivent donc pas concerner des éléments de la page car ceux-ci n'ont pas
encore été créés.


Ce qui explique qu'Yvon en plaçant son instruction à la fin du body obtenait le résultat espéré :
tous les éléments étaient créés, window.onload=run(); semblait fonctionner puisque la fonction run était exécutée, mais si une image un petit peu longue à charger ou une feuille de style ou... que le script devait manipuler s'y était trouvée... Déception !

--
Y.D.


Avatar
yvon.thoravalNO-SPAM
YD wrote:

Ce que voulait écrire apparemment Yvon Thoraval est :
window.onload=run; // sans parenthèses


Ouais, bravo est merci pour cette précision, en plus je le savais )))

j'ai réalisé une partie de mon code comme ça :


function viewsCollection() {
this.array = new Array();
this.add = add;
this.size = size;
this.showOne = showOne;
function add(o) {
this.array[this.array.length] = o;
}
function size() {
return this.array.length;
}etc...
}


tout s'éciare, merci !

en fait ce sont simplement mes "()" qui m'ont causé ce pb )))
--
yt

Avatar
Bobe
YD nous a dit le 04/01/2005 23:00:

Bon, c'est un peu normal. Tentative d'explication :
Le "traiteur d'évènement " (traduction perso de "event handler" ;-))


[La traduction à peu près adoptée est "gestionnaire d'événement" (avec
deux accents aigus sur ÉvÉnement)...]



Je me permet de répondre car il se trouve justement que je faisais hier
des recherches sur l'orthographe correcte du mot "évènement".

L'orthographe correcte est celle avec les deux accents aigus, mais celle
avec l'accent grave tend à s'imposer, et est maintenant acceptée par
l'académie française.

http://fr.wikipedia.org/wiki/Discuter:Évènement
http://www.ivry.cnrs.fr/rectifications/

--
Bobe (Aurélien Maille)
http://webnaute.net

"la vie d'un geek est un combat perpétuel contre l'imperfection"


Avatar
YD
YD nous a dit le 04/01/2005 23:00:
[La traduction à peu près adoptée est "gestionnaire d'événement" (avec
deux accents aigus sur ÉvÉnement)...]



Je me permet de répondre car il se trouve justement que je faisais hier
des recherches sur l'orthographe correcte du mot "évènement".

L'orthographe correcte est celle avec les deux accents aigus, mais celle
avec l'accent grave tend à s'imposer, et est maintenant acceptée par
l'académie française.


Merci des précisions. Je retire ma parenthèse. Après un coup d'oeil sur le
dictionnaire en ligne de l'Académie française,
<http://atilf.atilf.fr/academie9.htm>, je me suis rendu compte que la
graphie principale et apparemment préconisée est évènement.

Pan sur le bec donc. Et j'ajoute cette graphie à mes correcteurs
d'orthographe qui sont bien rétrogrades...

--
Y.D.


Avatar
Olivier Miakinen

[ évènement à la place d'événement ]

Merci des précisions. Je retire ma parenthèse. Après un coup d'oeil sur le
dictionnaire en ligne de l'Académie française,
<http://atilf.atilf.fr/academie9.htm>, je me suis rendu compte que la
graphie principale et apparemment préconisée est évènement.


Cela fait partie des recommandations orthographiques de 1990 :
<http://www.fltr.ucl.ac.be/FLTR/ROM/ess.html>.

Certaines sont plus critiquables que d'autres. En particulier, les
propositions pour les nombres ne devraient à mon avis pas passer
l'épreuve du temps, mais d'autres sont tellement logiques qu'il me
semble sage d'en tenir compte. « Évènement » en fait partie, mais
aussi « crèmerie » ou « je cèderai ».

Pan sur le bec donc. Et j'ajoute cette graphie à mes correcteurs
d'orthographe qui sont bien rétrogrades...


Jette donc un coup d'½il sur le lien donné ci-dessus pour compléter
tes correcteurs d'orthographe. Cela étant, sache que certains sont
farouchement opposés à toute modification, dont un certain pingouin
sur <news:fr.lettres.langue.francaise>.

Avatar
Le Fou
YD a écrit
Le "traiteur d'évènement " (traduction perso de "event handler" ;-))


[La traduction à peu près adoptée est "gestionnaire d'événement" (avec
deux accents aigus sur ÉvÉnement)...]


Merci.
Je sais pas pourquoi je pense à un traiteur en cette période ;-)


"onload" s'applique à l'objet "window" dans le cas où tu écris :
window.onload=run();
Ce qui signifie que lorsque l'objet "window" sera chargé, la fonction
run()


sera déclenchée.


Désolé, ce que tu dis est faux. Quand javascript tombe sur :
window.onload=run();
il évalue la partie droite de l'affectation : run() -- la fonction est
donc

immédiatement exécutée puisque c'est ce que signifie run(). Le résultat
retourné

(ou null si rien n'est retourné) est conservé, puis la partie gauche est
évaluée

et l'affectation enfin effectuée.


Ca semble exact après test...
Donc que l'on écrive :
window.onload=run();
ou :
run();
le résultat est le même, la fonction run() est immédiatement exécutée à la
lecture...


Or l'objet "window" n'est créé que par une balise BODY ou par une balise
FRAMESET (ou par la méthode "open()").
Si tu mets "window.onload=run();" dans le HEAD, la balise BODY n'a pas
encore été déclarée (lue par le navigateur), l'objet "window" n'a donc
pas


été créé, ta fonction ne peut donc pas s'appliquer.


Tiens donc ! window est créé avant tout autre objet :


Extrait de la doc JavaScript Reference :
http://www.valpedo.mpl.ird.fr/valpedo/doc/jsref/window.htm#1200703
" Created by
The JavaScript runtime engine creates a window object for each BODY or
FRAMESET tag. It also creates a window object to represent each frame
defined in a FRAME tag."

Merci de tes explications.

--
A'tchao

Le Fou
http://perso.club-internet.fr/ehiller/
http://club.exocet.free.fr/
http://www.ffessm-cd84.com/


Avatar
YD

Tiens donc ! window est créé avant tout autre objet :



Extrait de la doc JavaScript Reference :
http://www.valpedo.mpl.ird.fr/valpedo/doc/jsref/window.htm#1200703
" Created by
The JavaScript runtime engine creates a window object for each BODY or
FRAMESET tag. It also creates a window object to represent each frame
defined in a FRAME tag."


Ça c'est la vulgarisation Netscape du JS 1.1 ! Et qui insiste surtout sur
le fait que plusieurs objets window peuvent se partager la fenêtre du
navigateur.

Dans le DOM Ref Mozilla (je n'ai plus l'URL sous la main...) on lit en
préambule à "DOM window Reference" :
The window object represents the window itself. Typically, window
contains the document as a child (see DOM Document Reference), provides
access to the window.navigator and window.screen objects for manipulating
the browsing environment itself, and provides a number of special
properties for accessing the object model below it.

L'autre navigateur le décrit dans une doc déjà ancienne :
window : Represents an open window in the browser.

Il y a toujours un objet window créé même s'il n'y a pas de document affiché
(on peut s'en rendre compte en affichant about:blank puis en tapant dans la
barre d'adresses du navigateur javascript:alert(window);)

M'enfin, là, on n'est pas loin du coupage de cheveux en 4 ;-)

--
Y.D.


Avatar
Le Fou
YD a écrit

Dans le DOM Ref Mozilla (je n'ai plus l'URL sous la main...) on lit en
préambule à "DOM window Reference" :
(...)
M'enfin, là, on n'est pas loin du coupage de cheveux en 4 ;-)


Oui mais ça n'est pas inutile à partir du moment où j'apprends des choses
;-)
Merci.

--
A'tchao

Le Fou
http://perso.club-internet.fr/ehiller/
http://club.exocet.free.fr/
http://www.ffessm-cd84.com/

1 2