11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous.

Je suis en train de nettoyer une bibliothèque javascript personnelle, et j'aimerais permettre au développeur utilisateur de n'insérer qu'un seul fichier .js et non tous.
Par exemple, le codeur mettra dans son <head> :

<script type="text/javascript" src="../myPath/myLibrary.js"></script>


... et cela intègrera automatiquement d'autres fichiers javascript comme mySubLibrary1.js, mySubLibrary2.js, ...

Or, le problème est le suivant : avant de pouvoir faire l'inclusion, je dois récupérer le chemin de la source (le "../myPath/"), et pour ce faire je dois donc récupérer le noeud <script> de ma bibliothèque.

Dans le fichier myLibrary.js, je recherche donc tous les éléments <script> comme suit :
document.getElementsByTagName("script"))


Et c'est là que ça fait mal. Sous IE7 (!), il me trouve bien tous mes .js (même ceux insérés dynamiquement par Scriptaculous, que j'appelle juste avant ma propre bibliothèque), y compris le <script> de myLibrary.js.
Mais sous Firefox, il ne trouve que les tags précédents !

Pour concrétiser la chose, avec le code HTML suivant :

<script src="../scriptaculous/lib/prototype.js" type="text/javascript"></script>
<script src="../scriptaculous/src/scriptaculous.js" type="text/javascript"></script>
<script src="../myPath/myLibrary.js" type="text/javascript"></script>


l'appel à getElementsByTagName("script").length me renvoie 8 sous IE7 (3 d'origine + 5 intégrés dynamiquement par Scriptaculous), et me retourne seulement 2 sous Firefox (seulement les noeuds de prototype et de scriptaculous, pas même le <script> de myLibrary).

Quelqu'un aurait-il une idée sur le pourquoi du comment ?

Merci par avance,
Modifié par xportebois (22 Jan 2007 - 14:05)
Je me réponds à moi-même, car après quelques recherches, j'ai déjà découvert quelque chose.

Apparemment, getElementsByTagName sous Firefox ne me retournait les <script> présents uniquement dans le <body>, et non dans le <head> (ce qui reste bien curieux).

Je dis bien "retournait", car maintenant que je les ai remis dans le <head>, ils sont bien détectés. A n'y rien comprendre.

Je peux donc résoudre mon problème en faisant

document.getElementsByTagName("head")[0].getElementsByTagName...
document.getElementsByTagName("body")[0].getElementsByTagName...

...mais je ne comprends pas pourquoi Scriptaculous (qui utilise la même idée) y parvient sans problème.