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.

span class="st0">'KHTML') != -1){ //safari, konqueror..
'script');
      s.type = 'text/javascript''head'

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 :

    span class="st0">'var mafonction = function() {'+
    '/*contenu fonction*/'+
    '}'

    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:

    span class="st0">'KHTML') != -1){ //safari, konqueror..
    'script');
                s.type = 'text/javascript''head''script'
    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
    'divResult'//On evalue le tout et ca roule ma poule
    '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 :