Archives: 1 octobre 2006

javascript eval global

dimanche 1 octobre 2006

ça fait un peu près 1 mois que je cherche à exécuter mon code javascript contenu dans mes données chargées via AJAX. Tout le monde me dira qu’il existe eval, seulement voila, ceci ne marche uniquement pour le code éxécuté en live et non pour les déclaration de fonction.

En effet, même dans le framework du style prototype, eval() est déclaré dans le contexte de l’objet AJAX, autrement dit dans la fonction AJAX. Ainsi toute les fonctions déclarées dans eval ne sont disponibles que dans la fonction où l’on fait le eval().

un petit exemple pour m’expliquer :

span class="st0">'function test(){alert('test ok');}'//affiche function
  test(); // affiche 'test ok'
//affiche undefined
test(); // erreur : fonction test inconnu

ceci peut poser de gros problèmes pour déclarer des objects via AJAX :

//x est votre object XMLHttpRequest
'monconteneur'//maintenant que les données reçu on été placé dans la page,
    //il faut exécuter toutes les balise script :
'script'//return function
  }
}

seulement voilà : si maintenant vous avez un bouton avec dans l’action onClick une fonction qui est déclaré dans la page chargé, celle ci ne s’éxécutera pas car elle n’est pas déclaré dans un contexte global mais seulement dans la fonction onreadystatechange.

Mais, pour toi public, j’ai la solution. vous pouvez utiliser :

window.eval();
//ou encore :
var global = this; //dans un contexte global
//puis
global.eval();

vos function seront alors déclarée dans un contexte global.
var global = this; est utilisé pour forcé la compatibilité.

A noté que les différents framework tel que prototype n’exécute pas vos script via eval dans un contexte global (voir la function evalScripts pour prototype).

Je ne vous cache pas que j’ai galéré pour un truc tout con cependant astucieux 🙂