OVH Cloud OVH Cloud

fonctions multiples au chargement de page

5 réponses
Avatar
J-F Portala
Suite à des informations intéressantes issues d'un post précédent
"object undefined"
on m'a transmis le lien suivant qui a l'air fort intéressant.

Possibilité de lancer plusieurs fonctions au chargement d'une page

<http://groups.google.fr/group/fr.comp.lang.javascript/browse_thread/thread/f05009a2a40a4611/e9f9ea4f9e1d5d15>


Makheureusement, je n'arrive pas à faire fonctionner l'exemple fourni

function loadAll(oneMore){
> if(window.onload){ var oldOnload=window.onload;
> window.onload=function(){ oldOnload(); oneMore(); } } else
> onload=function(){oneMore();} }



> à utiliser après avoir défini maFonction ainsi :

> function maFonction1(){/*la déf.*/} loadAll(maFonction1);


D'apres ce lien, on peut mettre le script en fin de <body>
dans mon fichier php j'ai essaye ceci

<entete html>
<?php
code php
?>
<script type=\"text/javascript\">
<!--
function loadAll(oneMore)
{
alert('toto') ;// juste pour voir s'il y a de la vie
if ( window.onload)
{
var oldOnLoad = window.onload ;
window.onload = function()
{
oldOnLoad() ;
oneMore() ;
}
}
else
{
onload = function()
{
onMore() ;
}
}
}
function foc()
{
alert('toto') ;// juste pour voir s'il y a de la vie
if ( document.form.nomchamp )
document.form.nomchamp.focus() ;
return true ;
}
loadAll(foc) ;
//-->
</script>
</body>
</html>
J'ai du mal à comprendre le fonctionnement de ce script
Je pensais que window.onload ou onload (voir echanges precedents permettait
de lancer une fonction au chargement de la page).
Ici, on teste window.onload . Est ce le resultat d'une fonction, ou le nom
d'une fonction.
J'ai des doutes quant à l'utilisation de la fonction
loadALL(foc) ;
Je peux la placer ou je veux.
Et quand va t elle démarrer ?
Là, il me manque des cles

Jeff

5 réponses

Avatar
YD
[...]

Makheureusement, je n'arrive pas à faire fonctionner l'exemple fourni

function loadAll(oneMore){
if(window.onload){ var oldOnload=window.onload;
window.onload=function(){ oldOnload(); oneMore(); } } else
onload=function(){oneMore();} }

à utiliser après avoir défini maFonction ainsi :

function maFonction1(){/*la déf.*/} loadAll(maFonction1);


D'apres ce lien, on peut mettre le script en fin de <body>
dans mon fichier php j'ai essaye ceci

<entete html>
<?php
code php
?>
<script type="text/javascript">
<!--
function loadAll(oneMore)
{
alert('toto') ;// juste pour voir s'il y a de la vie
if ( window.onload)
{
var oldOnLoad = window.onload ;
window.onload = function()
{
oldOnLoad() ;
oneMore() ;
}
}
else
{
onload = function()
{
onMore() ;


Une faute de frappe ici : oneMore();

}
}
}
function foc()
{
alert('toto') ;// juste pour voir s'il y a de la vie
if ( document.form.nomchamp )


Préférer la version plus standard :
if ( document.forms["form"].nomchamp )

document.form.nomchamp.focus() ;


idem

return true ;
}
loadAll(foc) ;
//-->
</script>
</body>
</html>
J'ai du mal à comprendre le fonctionnement de ce script
Je pensais que window.onload ou onload (voir echanges precedents permettait
de lancer une fonction au chargement de la page).


onload est une propriété de l'objet window qui est soit undefined soit une
fonction.

Ici, on teste window.onload . Est ce le resultat d'une fonction, ou le nom
d'une fonction.


On teste si onload est quelque chose.

Dans un test, Javascript convertit en valeur vrai toute valeur différente de :
undefined, null, 0, ''. En particulier, si ce qui est testé est un objet (et
une fonction en est un), cette conversion renvoie toujours true.

J'ai des doutes quant à l'utilisation de la fonction
loadALL(foc) ;
Je peux la placer ou je veux.


En théorie oui, en pratique il vaut mieux placer cet appel à la fin de la page,
surtout si un onload est déclaré dans la balise body. Cet onload (du body)
écraserait une déclaration antérieure (donc dans le head).

Et quand va t elle démarrer ?


Quand elle sera lue lors de l'interprétation de la page par le navigateur qui se
fait séquentiellement.

Là, il me manque des cles


Voilà un trousseau ;-) mais s'il en manque, il faudra revenir...

--
Y.D.


Avatar
J-F Portala
Merci de ton aide.

J'ai enfin compris le fonctionnement de la fonction.
En fait, on recrée une fonction onload prenant en compte
la fonction éventuellement définie dans body onload et en lui ajoutant
d'autres fonctions supplémentaires.
Tant que la page n'a pas été interprétée, on peut modifier dynamiquement
certaines variables et fonctions.

Les fautes de frappes mises à part, le script ne fonctionnait pas tant que
je conservais
<script type="text/javascript">
dès que j'ai mis <script language="javascript">, cela a fonctionné.

Dans le post précédent, il était question que cette écriture était obsolete.
Est ce que j'ai encore une faute de frappe.

Connaissant cette fonctionnalité, je pense qu'il est plus judicieux de gérer
les chargements de page
avec une fonction qui va ajouter à la variable window.onload les fonctions
au fur et à mesure des besoins.

une fonction du type onLoadFct("nomfonction") écrite en php pour des
insertions plus simples en fonction de tests
Je me suis amusé à afficher le contenu de window.onload même si j'ajoute 4
ou 5 fonctions,
j'ai toujours
oldOnLoad();
oneMore() ;
dans window.onload
Je m'attendais à retrouver les véritables noms de fonctions (cela doit être
géré en interne).

J'étais encore embêté par le test sur le champ indéfini.
le test sur document.forms["form"].nomchamp fontionne tane que le
formulaire "form" existe.
Dans certains cas, ce formulaire n'existe pas, et j'ai un message d"erreur.
Il me faut donc tester l'exsitence du formulaire
if ( document.forms["form"] )
if ( document.forms["form].nomchamp )
document.forms["form].nomchamp.focus() ;


Derniere question d'ordre plus pratique.
Est ce que tu utilises des ressources particulières pour ce qui touche au
javascript. (site web, bible...)
J'avoue que les doc officielles sont particulierement indigestes et peu
utilisables (à mon gout)

En tout cas merci beaucoup de ton aide
Jeff
Avatar
Laurent Vilday

Les fautes de frappes mises à part, le script ne fonctionnait pas tant que
je conservais
<script type="text/javascript">
dès que j'ai mis <script language="javascript">, cela a fonctionné.


Il faut : <script type="text/javascript">

avec <script type="text/javascript"> ça ne peut pas marcher
(unexpected or duplicate quote mark), c'est comme si tu faisais
<script type="un_interpreteur_que_personne_ne_possede">
Tu indiques au navigateur qu'il doit utiliser un type de script qu'il ne
connait pas, donc les navigateurs qui prennent en compte le type décide
(a raison) de ne pas exécuter le code

<script language="javascript"> cela fonctionne parce que ca reviens à
écrire <script> ce qui équivaut pour tous les navigateurs (ou presque) à
<script type="text/javascript">

donc la seule et unique syntaxe valide pour indiquer le type de script
au tag HTML c'est <script type="text/javascript"> et rien d'autre comme
il t'a été indiqué. Tout simplement parce que javascript n'est pas le
seul type qu'on puisse utiliser dans un tag script mais si c'est le plus
répandu.

--
laurent

Avatar
YD
J'ai enfin compris le fonctionnement de la fonction.
En fait, on recrée une fonction onload prenant en compte
la fonction éventuellement définie dans body onload et en lui ajoutant
d'autres fonctions supplémentaires.


Exactement, à ceci près le onload précédemment défini par script ou dans
la balise body.

Tant que la page n'a pas été interprétée, on peut modifier dynamiquement
certaines variables et fonctions.


Même après. La seule restriction est que l'objet sur lequel on intervient
soit déjà défini au moment du script. Si un script modifie un élément, la
page est réinterprétée.

Les fautes de frappes mises à part, le script ne fonctionnait pas tant que
je conservais
<script type="text/javascript">
dès que j'ai mis <script language="javascript">, cela a fonctionné.
Dans le post précédent, il était question que cette écriture était obsolete.
Est ce que j'ai encore une faute de frappe.


Laurent a répondu à cela.

[...]
Je me suis amusé à afficher le contenu de window.onload même si j'ajoute 4
ou 5 fonctions,
j'ai toujours
oldOnLoad();
oneMore() ;
dans window.onload
Je m'attendais à retrouver les véritables noms de fonctions (cela doit être
géré en interne).


Les fonctions appelées sont dans le corps des fonctions oldOnLoad et OneMore
qui les encapsulent en quelque sorte.

J'étais encore embêté par le test sur le champ indéfini.
le test sur document.forms["form"].nomchamp fontionne tane que le
formulaire "form" existe.
Dans certains cas, ce formulaire n'existe pas, et j'ai un message d"erreur.
Il me faut donc tester l'exsitence du formulaire
if ( document.forms["form"] )
if ( document.forms["form].nomchamp )
document.forms["form].nomchamp.focus() ;


qu'on peut abréger en :
if ( document.forms["form"] && document.forms["form"].nomchamp ) etc.
sans provoquer d'erreur, le deuxième argument du AND n'étant interprété
que si le premier est vrai.

Derniere question d'ordre plus pratique.
Est ce que tu utilises des ressources particulières pour ce qui touche au
javascript. (site web, bible...)


Pour javascript "pur" : la norme ECMA 262 3e ed. (fichier PDF à télécharger
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf),
et, en aide-mémoire, la documentation Windows Script (format .chm) à
télécharger sur MSDN et la documentation Netscape Javascript 1.5,
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference

Pour le DOM, le document DOM2 HTML du W3C téléchargeable depuis
http://www.w3.org/TR/ et bien sûr la doc sur Mozilla/Firefox et Internet
Explorer...

Il faut ajouter la lecture des NG et beaucoup de tests quand besoin est.

J'avoue que les doc officielles sont particulierement indigestes et peu
utilisables (à mon gout)


Les premiers contacts, oui :-( Après, on apprend à savoir où trouver l'info
sans avoir à lire des pages et des pages.

--
Y.D.

Avatar
J-F Portala
Un grand merci pour votre aide et vos conseils

Jeff