javascript eval global final

Posté le vendredi 6 avril 2007 à 18 h 30, Read it in english with Google

Voici la release finale de la méthode pour utiliser la function eval dans un contexte global.

var globaleval =  function(script){
  if(window.execScript){
    return window.execScript(script);
  } else if(navigator.userAgent.indexOf('KHTML') != -1){ //safari, konqueror..
      var s = document.createElement('script');
      s.type = 'text/javascript';
      s.innerHTML = script;
      document.getElementsByTagName('head')[0].appendChild(s);
  } else {
    return window.eval(script);
  }
}

Ceci fonctionne sur tout les navigateurs acceptant javascript. Si vous avez des problĂšmes, merci d’en faire part!


Je recherche la chaine « KHTML » dans la propriĂ©tĂ© useragent afin de trouver les navigateur utilisant le moteur de rendu KHTML et ses dĂ©rivĂ©s (ex: AppleWebKit). Ce moteur ne sait pas Ă©valuer le code en mode synchrone (inline). C’est le moteur de base de Safari et de Konqueror.

Les frameworks utilisent gĂ©nĂ©ralement window.setTimeout(script, 0) mais ça ne marche pas mĂȘme si on essaye d’attendre l’Ă©xĂ©cution. Les variables voulant ĂȘtre dĂ©finies ne seront disponibles que lors d’un apel non inline (asynchrone).

Il est inutile d’utiliser un pointeur sur l’object window comme prĂ©cĂ©demment, cela Ă©tant utile uniquement dans des implĂ©mentations externe au navigateurs des moteurs de rendu.

Charger des framework via Ajax, c’est maintenant possible 😀

Historique : eval global partie 2, eval global

18 réponses à “javascript eval global final”

  1. javascript eval global : part 2 contient sur le sujet :

    […] mise Ă  jour : Et la voilĂ , code final pour un eval javascript propre […]

    le jeudi 12 avril 2007 @ 17 h 35
  2. Killua

    De la balle 😀 merci ça m’aide beaucoup!

  3. MattOz

    Bonjour,

    Excellent site efficace et plein de contenu riche. FĂ©licitations pour ton boulot, c’est propre et ça aide beaucoup de gens … comme moi :-). Donc merci.

    Cependant, n’ayant pas un niveau trĂšs Ă©levĂ© en javascript et son utilisation en AJAX, je ne comprends pas comment mettre en oeuvre ce script. J’ai mis la fonction telle quelle avec les fonction de dĂ©claration de l’objet AJAX. Ensuite comment faut-il Ă©xĂ©cuter les fonctions JS que l’ont veut lancer dans les .js inclu dans les balises ?

    J’ai essayĂ© ceci :

    globaleval.mafonction(){
    /*contenu fonction*/
    }

    globaleval.mafonction(); //Execution

    … mais ça ne fonctionne pas. Le javascript inclu dans les chargĂ©s par AJAX ne s’Ă©xĂ©cute pas.
    Je comprends Ă  peu prĂšs l’interĂȘt du script mais c’est tout … Si l’un d’entre vous peut me donner une petite explication, il me manque surement pas grand chose. Merci.

  4. XoraX

    oula c’est pas claire tout ça.
    globaleval(_str_) est identique à la fonction native eval(_str_) à la différence que les variables déclarées dans le script _str_ seront disponibles dans toute la page (et pas seulement dans le corp de la fonction qui exécute eval)

    voici un exemple simple :

    var _str_ = 'var mafonction = function() {'+
    '/*contenu fonction*/'+
    '}';

    globaleval(_str_);
    mafonction();

    si tu n’a pas de variable Ă  dĂ©clarer via AJAX alor tu peux simplement utiliser eval(_str_)

  5. Graval

    Vraiment un grand merci XoraX, ton code m’a grandement aidĂ© !
    Bonne continuation !!

  6. Christian

    Bonjour !

    Je ne sais pas si mon problĂšme est bien en rapport avec ce site. En fait, je ne suis pas dans un context Ajax, mais HTML simple.

    Sur mon site, je dĂ©sire charger une sĂ©rie de scripts JS, Ă©crits sur des fichiers externes. Ces scripts contiennent essentiellement des inputs type = hidden. Mais pour les test, j’utilise un fichier JS avec un input type = button. Ainsi je peux visualiser le rĂ©sultat.

    Lorsque j’inclus le code d’insertion du script directement sur ma page, le bouton s’affiche sans problĂšme. Mais si j’utilise une fonction (lancĂ©e par onload) pour insĂ©rer le script dans la page (dans le but d’insĂ©rer tous les fichiers JS externes par la suite), alors lĂ  rien ne s’affiche.

    J’ai essayĂ© d’adapter votre script, mais sans rĂ©sultat (je suis sous IE 6.0). Avez-vous une solution ?

    Merci d’avance !

  7. wen

    Salut!

    Je pense que c’est la solution Ă  mon problĂšme mais 2 questions:

    – Ou doit-on mettre le code javascript, dans la page renvoyĂ©e par ajax ou dans la page qui appelle la fonction AJAX?

    – Comment on lance le script qui ne fonctionnait pas avant globaleval?

    Merci!

  8. azureus

    Salut,

    j’utilise le thickbox, ca ne fonctionne plus quand c’est un lien gĂ©nĂ©rĂ© en ajax peux tu me dire prĂ©cisĂ©ment ou placer ton code moi j’ai ça

    var reponsePHP=oHttp.responseText;
    window.eval(reponsePHP);

    j’ai essayĂ© de remplacer avec ton code mais j’obtiens une erreur

    merci d’avance

  9. XoraX

    ben c’est simple, tu place ma fonction dans ta page entre balise script et tu fais :

    var reponsePHP=oHttp.responseText;
    globaleval(reponsePHP);

    Ă  la place de ton code.

  10. clara

    donc si je comprends bien (déjà merci de poster ce code!!) la fonction pour var globaleval est placé dans la page principal dans le head entre des balises script, avec le code tel quel?
    et ensuite dans les pages chargés on écrit:
    var reponsePHP=oHttp.responseText;
    globaleval(reponsePHP);

    en dĂ©but de code ( soit apres functionxxx){ici; …}???
    c’est bien sa?

  11. Philippe

    Bonjour, je n’arrives pas a utiliser ce code et j’en ai vraiment besoin, pouvez vous me dire comment ‘integrer exactement, je ne comprend pas.
    Merci

  12. Franck

    Bonjour,

    Ce script est exactement ce dont j’ai besoin, merci car les diffĂ©rentes solutions trouvĂ©es sur le net ne me convenaient absolument pas.

    Mais je rencontre un souci lors de son utilisation : j’ai ce message sous FF :

    XML tag name mismatch (expected br)

    J’avoue ne pas comprendre ce que cela veut dire, ni voir le rapport avec un manquant :s
    Est-ce que l’on ne peut passer que du script JS dans cette fonction ? C’est ce que me laisse supposer la portion de code pour le moteur KHTML. Mais si c’est le cas, comment faire pour pouvoir passer un patchwork d’HTML et de JS ?

    Merci !

  13. XoraX

    Il ne faut passer que du javascript Ă  cette fonction. Stock le html que tu veux recevoir dans une variable javascript au format JSON.

  14. allian

    Bonjour,
    merci pour ton code, c’est la solution qu’il me fallait mais je ne comprends pas comment l’utiliser, les anciennes versions j’avais compris mais la du coup il n’y a plus besoin de faire la boucle sur tout les scripts de la page ?

    J’ai cette fonction qui recharge un div en ajax Ă  partir d’une page qui contient du script js

    var global = this;
    function reload1()
    {
    var c = document.getElementById(‘containerTree’);
    c.innerHTML = global.recupContenu(« vue/vuesElementaires/vueElementaireGestionnaireFichierPartiel.php »);
    var allscript = c.getElementsByTagName(`script`);
    for(var i=0;i<allscript.length;i++)
    {
    global.eval(allscript[i].text);
    }
    }

    mais elle ne fonctionne pas, du coup je voulais essayer avec ta nouvelle version mais je ne sais pas avec quel variable l’appeler.
    Merci de ton aide

  15. Yves From Dakar

    J’ai tournĂ© pendant 15 ans 😉 avant de trouver ce script. J’ai l’ai couplĂ© avec une autre fonction et ca tue trop!!! Merci!!!!!! Vla!!! du soleil from SĂ©nĂ©gal rien que pour toi!!!

    Voici ma sauce si ça peut servir a quelqu’un:

    var globalEval =  function(script){
            if(window.execScript){
              return window.execScript(script);
            } else if(navigator.userAgent.indexOf('KHTML') != -1){ //safari, konqueror..
                var s = document.createElement('script');
                s.type = 'text/javascript';
                s.innerHTML = script;
                document.getElementsByTagName('head')[0].appendChild(s);
            } else {
              return window.eval(script);
            }
          }
         

          function evalMyScripts(targetId) {
            var myScripts = document.getElementById(targetId).getElementsByTagName('script');
            for (var i=0; i<myScripts.length; i++) {
              globalEval(myScripts[i].innerHTML);
            }
          }

    En mode utilisation, ca donne:

    //On recupere le retour ajax
    result = xhr.responseText;
    // On se sert de innerHTML pour afficher le resultat dans la div
    document.getElementById('divResult').innerHTML =  result;
    //On evalue le tout et ca roule ma poule
    evalMyScripts('divResult');
  16. Alexandre

    Merci ! tout simplement !!

  17. cnieur2lo

    Merci beaucoup pour le partage, vous m’avez retirĂ© une sacrĂ©e Ă©pine du pied

  18. Banjo

    Bonjour,
    J’utilise Simple JS (http://simplejs.bleebot.com/) pour charger des contenus diffĂ©rents dans une DIV.
    Cependant, j’essaie de charger des pages avec du contenu javascript et bien Ă©videmment, ca ne fonctionne pas …
    Ca fait deux semaines que j’essaie de bidouiller mais sans rĂ©ussite!

    Pourrais je faire appel Ă  vos talents ?
    (Je ne sais pas si c’est la peine de prĂ©ciser mais je suis un Novice en Ajax)

    Merci d’avance,
    BaNJo

Laissez un commentaire :