Aller au contenu

Sujets conseillés

Posté

Salut à tous !

Pour une fois que c'est moi qui pose une question ;)

Donc, voilà :

Je développe un petit outil pour un intranet, dans lequel j'ai besoin, au chargement de la page, d'exécuter une fonction listant tous les éléments de ladite page (pour ceux qui connaissent, je fais un équivalent du getElementsByClassName).

J'aimerais mettre cette action directement dans le script (avec un document.onload = mafonction(), ou que sais-je encore), mais si je le fais comme ça, avec un script de test listant les balises présentes et les affichant, il ne me ressortira (quel que soit mon navigateur), : HTML, HEAD et SCRIPT.

Par contre, si je mets le onload dans la balise <body>, il me listera toutes les balises de la page (ce que je lui demande, en définitive).

Le souci, c'est que je n'aurai pas que cette fonction à lancer au démarrage, et que j'aimerais autant que possible ne pas avoir à intervenir dans le code HTML.

Aurais-je zappé un truc tout bête ?

Ou suis-je condamné à utiliser le body onload ?

Mon script de test :

<html>
<head>
<script type="text/javascript">
function getTags(tagname) {
var tab_tags = document.getElementsByTagName(tagname);
for(var i = 0; i < tab_tags.length; i++) {
alert(tab_tags[i].tagName);
}
}
document.onload = getTags('*');
</script>
</head>
<body>
<ul>
<li>
<a href="#">toto1</a>
</li>
<li>
<a href="#">toto2</a>
</li>
</ul>
</body>
</html>

Posté
Le souci, c'est que je n'aurai pas que cette fonction à lancer au démarrage

Tu peux appeler une autre fonction à la fin de la première et ainsi de suite.

Mais pour ce qui est du body onload je n'ai pas d'alternative... :blush:

Posté

Ben, actuellement, c'est ce que je fais.

J'ai une fonction lance(), avec les paramètres combinés des différentes fonctions, que je balance sur le <body onload="">. Mais je trouve ça particulièrement disgrâcieux ...

Posté

Pour une fois que c'est moi qui tente une réponse en Javascript (mon langage préféré :wacko:)

Mettre un onload directement dans le script oblige à différencier les différents navigateurs auxquels on peut avoir affaire: ils ne reconnaissent pas tous les mêmes fonctions.

J'ai trouvé çà qui devrait t'aider: Busted ! window.onload (again) -lire aussi les commentaires-

Sinon il y a cette autre solution pour créer un incredibly funky onload add-event scripting, for all browsers (rien que ça :cool:) mais le code provient de l'API de Mint, donc je ne crois pas qu'il soit réellement libre de reproduction.

Mais ça peut être une piste de réflexion ..

Posté

Alors laisse tomber le javascript ... :)

en asp.net il existe un objet équivalent à l'évènement javascript onload, il existe peut-être en php.

Dudu a raison, ceci dit pour un intranet, tu peux cibler quels seront le ou les navigateurs utilisés et en général tu peux blinder en javascript sans problème.

Entendons nous ce n'est pas le plus élégant mais l'efficacité y est.

Posté

En PHP, j'en doute ;)

Bon, c'est sûr que je pense pas devoir me soucier de la compatibilité Opera/Safari, vu que c'est un intranet, mais tant qu'à faire, j'aimerais autant pourvoir le réutiliser sur d'éventuels projets persos plus "grand public".

Posté

il y a cette solution :

<script type="text/javascript">
function getTags() {
var bodyRef = document.getElementsByTagName("body").item(0);
var tab_tags = bodyRef.getElementsByTagName('*');
for(var i = 0; i < tab_tags.length; i++) {
alert(tab_tags[i].tagName);
}
}
window.onload = getTags;
</script>

si j'ai bien compris ce que tu veux

Posté

Non, ça ne semble pas fonctionner, malheureusement.

La console JavaScript me ressort : bodyRef has no properties.

On retombe sur nos pattes : appelé en window.onload, le JS n'attend apparemment pas que le contenu de la page se charge. Donc, adieu la balise body et son contenu.

Je vais étudier les liens de Dudu (t'es une encyclopédie à trouvailles, toi !), je vous tiens au courant.

Posté

Effectivement, en enlevant les parenthèses, ça semble fonctionner.

Deux questions :

- Comment ça se fait ?

- Malheureusement, je devrai passer des paramètres dans la fonction finale. Dommage.

Posté
- Comment ça se fait ?

Les évènements onXXX habituels sont en fait des variables particulières qui ne contiennent pas une valeur mais un pointeur de fonction. Autrement dit, une variable qui contient le code d'une fonction ou son emplacement en mémoire.

En ne mettant pas de parenthèses, tu attribues à cette propriété onload un pointeur de fonction, soit donc une variable qui "contient" ta fonction, ce que nous voulons normalement lors d'une affectation d'une fonction à un évènement. La fonction elle-même n'est pas exécutée mais gardée en mémoire pour être appelée au moment opportun, ici donc la fin du chargement du document.

En mettant des parenthèses, au contraire, tu vas provoquer l'exécution immédiate de la fonction indiquée et la propriété recevra la valeur que ta fonction retourne (via l'instruction return).

En exécutant la fonction à ce moment précis, ta page n'est pas encore entièrement construite ce qui explique pourquoi tu n'obtiens pas tous les éléments que tu souhaites.

- Malheureusement, je devrai passer des paramètres dans la fonction finale. Dommage.

Ne déséspère pas trop vite, tu as même plusieurs syntaxes possibles. En voici une :

document.onload = function anonymous () {
appel_premiere_fonction_sans_parametres();
appel_deuxieme_fonction_avec_parametres(1, 2, 3, 4, "bonjour");
}

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...