Javascript : Utilisation d'includes dynamiques [Javascript avancé]

Javascript : Utilisation d'includes dynamiques [Javascript avancé] - HTML/CSS - Programmation

Marsh Posté le 03-09-2008 à 23:42:52    

Hello,

 

Dans le cadre d'un développement perso en DHTML, je suis amené a charger / décharger dynamiquement des bibliothèques de fonctions javascript.

 

Pour cela, j'utilise les fonctions suivantes :

function includeScript(scriptSrc, scriptId)
{
 var docHead = document.getElementsByTagName('head');
 var newScript = document.createElement('script');
 newScript.setAttribute("type","text/javascript" );
 newScript.setAttribute("src", scriptSrc);
 newScript.setAttribute("id", scriptId);
 docHead[0].appendChild(newScript);
}

 

function removeScript(scriptId)
{
 var allScripts = document.getElementsByTagName('script');
 for (var i = allScripts.length-1; i>=0; i--)
 { // On recherche a l'envers
  if (allScripts[i].id == scriptId)
  { // on supprimme le fils en passant par le noeud parent.
   allScripts[i].parentNode.removeChild(allScripts[i]);
  }
 }
}

 

Ces fonctions marchent très bien afin de rajouter de nouveaux noeuds "scripts" contenant des fonctions, en revanche, je rencontre un problème lorsque je cherche a supprimer une bibliothèque de fonctions :

 

Le noeud est correctement supprimé, mais les fonctions qui ont été chargées précédemment, elles, ne le sont pas :
Elles restent en mémoire.

 

Je m'explique :
Supposons que j'aie deux fichiers script1.js et script2.js
script1.js contient :
function helloA()
{alert('A')}

 

script2.js contient :
function helloB()
{alert('B')}

 

je charge script1.js :
Je peux appeler helloA()
Je ne peux pas appeler helloB()

 

Je décharge script1.js
Je charge script2.js
Je peux appeler helloB()
Je peux toujours appeler helloA()

 

Y a t'il un moyen pour s'assurer qu'en supprimant le noeud <script> contenant des fonctions, je m'arrange pour également supprimer l'ensemble de ces fonctions ?

 

J'ai pensé inclure dans script1.js une fonction du type :

function cleanFunctions()
{
 helloA = undefined;
 cleanFunctions = undefined;
}

 

Mais je suis tout sauf certain du résultat.. :o

 

Des idées ?


Message édité par Aranthys le 03-09-2008 à 23:54:39

---------------
♪ Living is easy with eyes closed, misunderstanding all you see... It's getting hard to be someone but it all works out, It doesn't matter much to me. ♪
Reply

Marsh Posté le 03-09-2008 à 23:42:52   

Reply

Marsh Posté le 03-09-2008 à 23:56:49    

Bon, je viens de tester mon idée
Ca marche ! :D
 
Ca veut dire que je vais moi-même devoir définir les fonctions de nettoyage dans chacune de mes bibliothèques de fonctions :fou:


---------------
♪ Living is easy with eyes closed, misunderstanding all you see... It's getting hard to be someone but it all works out, It doesn't matter much to me. ♪
Reply

Marsh Posté le 04-09-2008 à 00:00:27    

Je pense que t'as pas le choix que d'indéfinir tes fonctions, car aucune fonctions n'est attachés au tag script qui l'a "chargé".

 

Par contre, il serait plus simple de créer ttes tes fonctions dans une classe (un objet en fait, une sorte de namespace), que tu n'aurais qu'à "nettoyer" lorsque t'en as plus besoin.

 

Genre :

Code :
  1. var mesFonctions = {};
  2. mesFonctions.func1 = function () { /* blabla1 */ };
  3. mesFonctions.func2 = function () { /* blabla2 */ };
  4. mesFonctions.func3 = function () { /* blabla3 */ };
  5. ...
  6. mesFonctions = undefined;
 

A essayer :)


Message édité par SICKofitALL le 04-09-2008 à 00:01:16

---------------
We deserve everything that's coming...
Reply

Marsh Posté le 04-09-2008 à 00:09:29    

Sympa egalement, oui :D

 

Mais je pense plutôt utiliser mon idée :

 

La finalité est identique (toutes les fonctions chargées passent a undefined), en revanche j'ai l'avantage de ne pas avoir a m'ennuyer a devoir modifier tous mes appels de func1() a mesFonctions.func1(), ni a definir toutes mes fonctions sous la forme mesFunctions.func1(), ce qui me parait être un gain de temps et de lisibilité.

 

Merci pour l'idée en tout cas, je n'avais pas penser rattacher les fonctions que je créais dynamiquement a un objet :)


Message édité par Aranthys le 04-09-2008 à 00:09:38

---------------
♪ Living is easy with eyes closed, misunderstanding all you see... It's getting hard to be someone but it all works out, It doesn't matter much to me. ♪
Reply

Marsh Posté le 04-09-2008 à 00:13:51    

Personnellement l'idée de SICKofItall est largement plus propre que ta méthode de porc.  
Car quand on parle de librairie, on parle aussi de namespace afin de ne pas avoir toutes les fonctions au même endroit.
Et comme ce namespace est un objet. Il te suffit juste de le supprimer quand tu n'en a plus besoin (delete).
 
Et donc aussi de décharger le script derriere.

Reply

Marsh Posté le 04-09-2008 à 00:13:58    

L'avantage étant que tu n'as que UN seul element à zapper :)
De plus, si tu charges d'autres script, qui ne sont pas forcément de toi, tu évites qu'ils s'écrasent l'un l'autre.
 [:graffin]


Message édité par SICKofitALL le 04-09-2008 à 00:14:37

---------------
We deserve everything that's coming...
Reply

Marsh Posté le 04-09-2008 à 00:24:34    

gatsu35 a écrit :

Personnellement l'idée de SICKofItall est largement plus propre que ta méthode de porc.  
Car quand on parle de librairie, on parle aussi de namespace afin de ne pas avoir toutes les fonctions au même endroit.
Et comme ce namespace est un objet. Il te suffit juste de le supprimer quand tu n'en a plus besoin (delete).
 
Et donc aussi de décharger le script derriere.


Certes :D
Ma méthode, s'pas une méthode de cochon, c'est juste moins élégant.... :o
 
Ouais, bon, ok, ok :d


---------------
♪ Living is easy with eyes closed, misunderstanding all you see... It's getting hard to be someone but it all works out, It doesn't matter much to me. ♪
Reply

Marsh Posté le 04-09-2008 à 00:28:51    

Fais comme tu le sens. Mais en qq coup de chercher/remplacer tu rends ton code beau et moderne ! :sol:
 
;)


---------------
We deserve everything that's coming...
Reply

Marsh Posté le 04-09-2008 à 00:44:28    

SICKofitALL a écrit :

Fais comme tu le sens. Mais en qq coup de chercher/remplacer tu rends ton code beau et moderne ! :sol:

 

;)


Yep, je vais le faire, j'ai la flemme (  :whistle: ), mais de toutes façons, j'ai d'autres fonctions que je vais devoir transformer en bibliothèques.
Et cela devrait me permettre de gagner en lisibilité.


Message édité par Aranthys le 04-09-2008 à 00:44:40

---------------
♪ Living is easy with eyes closed, misunderstanding all you see... It's getting hard to be someone but it all works out, It doesn't matter much to me. ♪
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed