2009-12-01 9 views
3

J'ai un javascript externe sur ma page, par ex. quelque chose comme:Recharger le javascript externe après la publication asynchrone via UpdatePanel

<script src="http://foo.com/script.js" type="text/javascript"></script> 

et un UpdatePanel quelque part. Le script écrit du contenu, et cela à partir d'une fonction javascript anonyme dans le fichier js. À savoir, il y a quelque chose comme ça dans le script:

(function(){document.write('content');})(); 

Chaque fois que le UpdatePanel est mis à jour par publication asynchrone, tout le script fait (ou tout javascript sur ma page, pour cette question) est une action de retour. Pour javascript normal, je voudrais simplement utiliser:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(myFunction) 

refaire tout cela, mais étant donné que la fonction dans le fichier source du script est anonyme et fait appel à la définition, je suis SOL! Des idées?

Remarque: la source externe js provient d'un autre domaine et son contenu est hors de mon contrôle.

+0

Peu importe que votre fonction est anonyme. Vous pouvez le nommer et l'appeler globalement très bien. Le vrai problème va être 'document.write'. L'appeler après le chargement de la page signifie que tout le contenu de la page statique va être effacé. –

+0

En fait, je ne suis même pas sûr que le javascript externe fasse un document.write. Il pourrait juste créer un nouveau nœud de document et l'ajouter à la page. Le script est un gros gâchis obscurci, et il y en a plus d'un en fait. Le problème est, je n'ai aucun contrôle sur le contenu de ces scripts. Ils ont cette fonction appelée anonymement, et je dois simplement y faire face. –

+0

Je viens de le vérifier fait un document.write et vient de rencontrer le «essuyer» Crescent prophétisé. Boules de singe de merde sainte. –

Répondre

2

Ok, la « solution » (« hack laid sale », si vous préférez) je suis venu avec:

Au lieu de charger le js fichier directement, je charger via une enveloppe qui lit le fichier, enveloppements le résultat en javascript personnalisé qui place la fonction anonyme dans un tableau global, et appelle toutes les fonctions de ce tableau au chargement et après chaque publication asynchrone.

Veuillez ne pas entrer cette solution dans les concours de beauté.

+1

À quoi cela ressemble-t-il? –

1

Le vrai problème ici était que je n'utilisais pas UpdatePanels correctement. Si le UpdateMode de tous les UpdatePanels sur votre page est défini sur Conditionnel, et que votre ScriptManager a une mise à jour partielle activée, il ne devrait pas vraiment "[annuler] tout ce que le script a fait".

3

Essayez cette

private string _myScript = @"(function(){ 
          var ys = document.createElement('script'); 
          ys.type='text/javascript'; ys.async=true; 
          ys.src='http://foo.com/script.js'; 
          var s = document.getElementsByTagName('script')[0]; 
          s.parentNode.insertBefore(ys,s); 
          });"; 

Puis dans votre Page_Load

ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "myScript", _myScript , true); 
+0

Cela ne fonctionne pas pour moi ma source est 'ys.src = 'https: //addthisevent.com/libs/1.6.0/ate.min.js';' –

Questions connexes