Lire du js dans un javascript

Signaler
Messages postés
17
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
11 octobre 2009
-
Messages postés
17
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
11 octobre 2009
-
Bonjour,

Afin de gagner du temps de chargement sur les pages,
je souhaite charger les fonctions, mes programmes au fur et à mesure des choix de l'utilisateur.

je cherche désepérément à incoporer un programme js depuis mon javascript en cours :

IE me pose toute sorte de soucis, soit le programme est dispo au deuxième cliq ...., soit j'ai le droit à une insulte.

"Contante chaîne non terminée"

ou

"Impossible de continuer l'opération à cause de l'erreur 80020101"

gniii

<hr />
function require(fullUrl){
 if (window.XMLHttpRequest) {
  req = new XMLHttpRequest();            
  req.open("GET",fullUrl,false); // true= asynch, false=wait until loaded       
  req.send(null);
 } else if (window.ActiveXObject) {
  req = new ActiveXObject((navigator.userAgent.toLowerCase().indexOf('msie 5') != -1) ? "Microsoft.XMLHTTP" : "Msxml3.XMLHTTP");
  if (req) {
   req.open("GET", fullUrl, false);
   req.send();
  }
 }
 if (req!==false) {
  if (req.status==200) {
  var dj_global = this; // global scope reference
  if (window.execScript) {
   alert ('ie');
   window.execScript(req.responseText); 
   return null; 
  }
  dj_global.eval(req.responseText);
  
  //var global = this;
  //alert (req.responseText.toString());
  //window.eval(req.responseText);
  //window.parent.eval(req.responseText);
  //global.eval(req.responseText.toString());
  } else if (req.status==404) {
  // you can do error handling here
  alert ('chargement inopérant');
  }
 }
};
<hr />

Merci de m'aiguiller

10 réponses

Messages postés
17
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
11 octobre 2009

J'ai une parade qui me plait moyennement :

function require(fullUrl){
 if (window.XMLHttpRequest) {
  req = new XMLHttpRequest();             
  req.open("GET",fullUrl,false);   
  req.send(null);
 } else if (window.ActiveXObject) {
  req = new ActiveXObject((navigator.userAgent.toLowerCase().indexOf('msie 5') != -1) ? "Microsoft.XMLHTTP" : "Msxml3.XMLHTTP");
  if (req) {
   req.open("GET", fullUrl, false);
   req.send();
  }
 }
 if (req!==false) {
  if (req.status==200) {
  var dj_global = this;
  if (window.execScript) {
   alert ('ie');
   //window.execScript(req.responseText);
   //return null;
   try {
    alert ('Création du script');
    script_tag = document.createElement('script');
    script_tag.setAttribute('type','text/javascript');
    script_tag.setAttribute('src',fullUrl);
    head = document.getElementsByTagName("head")[0];
    head.appendChild(script_tag);
   } catch(e) {
    alert ('Création du script 2');
    document.write('<script type="text/javascript" src="'+fullUrl+'"></script>');
   }
  } else {
   alert ('ff');
   dj_global.eval(req.responseText);
  }
  //var global = this;
  //alert (req.responseText.toString());
  //window.eval(req.responseText);
  //window.parent.eval(req.responseText);
  //global.eval(req.responseText.toString());
  } else if (req.status==404) {
  // you can do error handling here
  alert ('chargement inopérant');
  }
 }
};
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
bonjour,
si je comprend bien tu tente d'exécuter du javascript récupéré par ajax.
généralement, c'est totalement inutile ! met les fonctions dans la page appelante,
ça ira bien mieux.
néanmoins, si tu y tiens à tous prix ( rien ne le justifie je pense, mais bon ... )
regarde comment font ce qu'on appelle pompeusement "framework" ou
même GAG posté ici
perso, execScript, je ne connais pas...
tu parles de IE... avec les autres navigateurs ça baigne ?

CordialementBul[mon Site][M'écrire]

généralement, c'est idiot de généraliser
on ne dit pas néanmoins mais handicapé nasal, <!--
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
et ton remède (  document.write('<script type="text/javascript" src="'+fullUrl+'"> )
est pire que le mal.....
document.write va effacer toute la page, y compris le javascript !
contrôle donc le contenu de la page après.
CordialementBu
Messages postés
17
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
11 octobre 2009

Merci bultez,

En fait, ce que j'ai fait devrait fonctionner pour IE 7, surtout FireFOX 3, et les autres .... peut-être ...

windows.execScript(); est spécifique à IE, ce qui permet d'executer l'équivalent d'un window.eval();
 (Sauf erreur de ma part)

Sinon, cela me fait gagner 8ms ..... en locale (dérisoire).
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
36
ben, si c'est excclusif IE ( et je ne connais pas !?§ jamais vu ça...  ),
 ça ne fonctionnera pas avec les autres navigateurs.
eval est une possibilité ( si le php renvoi du javascript uniquement ! sans html )
regarde GAG, il te propose un exemple avec eval et en ajoutant le javascript à la page

MAIS "franchement" : évite ! encore une fois, c'est probablement inutile !
met tes fonctions dans la page appelante... tout baignera.

Cordialement          Bul    
Messages postés
626
Date d'inscription
samedi 28 septembre 2002
Statut
Membre
Dernière intervention
18 mai 2009
3
Salut,

Ce genre de comportement est gérer par toutes les libs qu'on trouve. Lorsque tu updates un container avec une source Html externe (via Ajax), il est toujours profitable de pouvoir executer les scripts qui se trouvent dans cette dernière.

Je te file une "traduction" d'une fonction permettant d'évaluer tous les scripts d'un flux html quelconque:

function evalScript(string){
    var allScripts = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img');
    var oneScript = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'im');
    var tabScripts = string.match(allScripts) || [];
    for(var i = 0; i < tabScripts.length; i++){
        eval(tabScripts[i]);
    }
}

Ainsi tu peux utiliser la méthode suiante à ton algo :

if (req.status==200) {
    var dj_global = this; // global scope reference
    evalScript(req.responseText);
    ...

Projet en cours : Joof
Messages postés
17
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
11 octobre 2009

Merci XtremDuke,

evalScript est infructueux,
En fait, le contenu de la réponse n'est pas du html, mais du javascript,
Donc, je cherche à interpréter directement le contenu du fichier pour en apprendre le contenu ! (Pas de balise)
Normalement, l'instruction window.eval(); devrait suffire, mais le fichier doit être trop long ?
Après plusieurs recherches, l'instruction window.execScript(); devrait convenir ... erreur 80020101 !
Pour info : http://msdn.microsoft.com/en-us/library/ms536420(VS.85).aspx

Pour l'instant, et là est mon souhait, c'est de pouvoir gagner du temps de chargement, et de ce fait découper et réorganier mes sources java.

Merci à vous tous 
Messages postés
626
Date d'inscription
samedi 28 septembre 2002
Statut
Membre
Dernière intervention
18 mai 2009
3
"En fait, le contenu de la réponse n'est pas du html, mais du javascript,"



Peut importe, tu peux n'avoir que du Javascript, le tout est d'entourer ton script par les balises ouvrantes et fermante de script et de connaitre les limites de la fonction eval() notamment sur la porté des variables globales.








Projet en cours : Joof
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
Comme plusieur l'on dis, c'est tres rarement utile de faire ce que tu veux... franchement... je ne sais pas si ton fichier script est tres long mais j'ai rarement vu des fichier .js qui faisait plus de 100ko. Alors c'est plutot inutile. Juste par curiosité ... combien pesent ton fichier js?

Si tu veux vraiment sauver du temps de chargement (~0.1ms) lol, arrange toi pour que ton js reste en cache... comme ca tu le load juste une fois.... :P

 
  zen69 aka Ortho Le Profett
 
Messages postés
17
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
11 octobre 2009

Bonjour,

Pour te répondre, zen69, mes fichiers font 80ko (complets et non compressés), au détail, après découpage, ils font entre 3 Ko et 20Ko.

Merci.