2009-04-05 8 views
2

J'utilise prototype pour charger le fichier js externe (en fait c'est un fichier php) dynamiquement. Comme ceci:Chargement dynamique d'un fichier js en utilisant Prototype?

function UpdateJS(file) 
{ 
    var url = 'main_js.php?file='+file; 
    var myAjax = new Ajax.Request(url, {method: 'get', onComplete: showResponseHeader}); 
} 
function showResponseHeader (originalRequest) 
{ 
    $('jscode').innerHTML = originalRequest.responseText; 
} 

Container "codeJS" est défini comme suit:

<script type="text/javascript" id="jscode"></script> 

Et ça marche! Mais si un fichier différent est appelé, toutes les fonctions du fichier précédent sont conservées. Et je ne veux pas ça. Quelqu'un sait comment "décharger" le premier fichier js quand le second est appelé?

(j'ai aussi essayé d'utiliser la fonction Ajax.Updater mais le résultat est le même.)

Mise à jour: Il se trouve qu'il ya problème plus grave: il ne se charge si la fonction « UpdateJS » est en window.onload c'est pourquoi il ne charge rien d'autre après cela. Donc les prototypes sont mis à jour, ce n'est peut-être pas un bon moyen pour ça ...

Répondre

2

Il y a un tutoriel sur la façon de décharger dynamiquement Javascript et CSS ici:

http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

Le code ci-dessous est emprunté à partir du lien ci-dessus, il est une solution pure JS, pas un prototype JS un, mais devrait faire l'affaire:

function removejscssfile(filename, filetype){ 
var targetelement=(filetype=="js")? "script" : (filetype=="css")? "link" : "none" //determine element type to create nodelist from 
var targetattr=(filetype=="js")? "src" : (filetype=="css")? "href" : "none" //determine corresponding attribute to test for 
var allsuspects=document.getElementsByTagName(targetelement) 
for (var i=allsuspects.length; i>=0; i--){ //search backwards within nodelist for matching elements to remove 
    if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(filename)!=-1) 
    allsuspects[i].parentNode.removeChild(allsuspects[i]) //remove element by calling parentNode.removeChild() 
} 
} 

removejscssfile("somescript.js", "js") //remove all occurences of "somescript.js" on page 
removejscssfile("somestyle.css", "css") //remove all occurences "somestyle.css" on page 

Si vous n'avez pas besoin de la fonctionnalité CSS suppression, je suis sûr que vous pouvez pirater loin.

+0

J'avais lu à ce sujet aussi bien, le problème semble être qu'il supprime le nœud de script, mais pas réellement les propriétés définies de la mémoire, et qui était le point n'était-ce pas? –

+0

Non, en fait ce n'est pas le cas. Mais oui, je pensais que c'était le problème. Si mon nouveau fichier .js charge la fonction qui a le même nom que dans le premier fichier .js, il utilisera la seconde et c'est ce que je voulais. – domagojk

1

Je ne pense pas que vous pouvez décharger un ensemble de propriétés définies dans la portée d'un fichier. Une solution de contournement consisterait à définir les fonctions contenues dans chaque fichier dans un objet central que vous annulez (ou remplacez) chaque fois que vous souhaitez vous en débarrasser.

0

les opérations suivantes:

function UpdateJS(file) 
{ 
    $('jscode').innerHTML = ''; /*YOU NEED TO RESET THIS*/ 
    var url = 'main.js'; /*YOU CAN USE A JAVASCRIPT FILE*/ 
    var myAjax = new Ajax.Request(url, {method: 'get', onComplete: showResponseHeader}); 
} 
function showResponseHeader (originalRequest) 
{ 
    $('jscode').innerHTML = originalRequest.responseText; 
} 
Questions connexes