Bonjour,

j'ai un soucis avec un bout de code. Avec Ajax.Updater, je charge dynamiquement un menu de ma page. Ce menu contient du javascript que je veux évaluer => j'utilise evalScript à true. Ce javascript doit aussi m'exporter une méthode => je lie cette méthode à window. Enfin, une fois ce bout de truc chargé, je doit appeler cette méthode, ce que je fais dans le onSuccess.

Cependant, Ô rage, mon onSuccess/onComplete est appelé AVANT l'évaluation des scripts récupéré. Du coup mon onSuccess n'a pas accès à la méthode javascript ainsi rapportée :/. J'ai mis des bons vieux alert dans le code pour m'en convaincre. Je passe dans le onSuccess avant de passer dans les blocs <script> de la section récupérée en Ajax

Bout de code utilisant prototype:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
function updateAjaxMacroLeftMenu() {
new Ajax.Updater('LeftMenu','${url}', {
  parameters: {evalScripts:true},
  evalScripts:true,
  onComplete: function(response) {
    // cette méthode n'existe pas :(
    window.phone(XWiki.currentSpace+"."+XWiki.currentPage);
  }
});
}
new Event.observe(window, 'load', updateAjaxMacroLeftMenu);
</script>
Une partie du bout de html récupéré par ajax:
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
 <script>
   window.phone = function (document){
   var root = "#phonePanel-phone";
   var datas = new Array();datas["Direction.Memorandum"] = "#phonePanel-phone";
datas["Direction.AnnualReport"] = "#phonePanel-phone-0-0";
   //etc ad nauseam :)
   //faire des trucs 
   }
   </script>

C'est facheux, j'ai réussi à contourner le problème en mettant ceci, mais je trouve ça très moche. Y a-t-il un event dans Ajax updater qui serait appelé APRES l'évaluation des javascripst?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
function updateAjaxMacroLeftMenu() {
new Ajax.Updater('LeftMenu','${url}', {
  parameters: {evalScripts:true},
  evalScripts:false,
  onComplete: function(response) {
    response.responseText.evalScripts();
    window.phone(XWiki.currentSpace+"."+XWiki.currentPage);
  }
});
}
new Event.observe(window, 'load', updateAjaxMacroLeftMenu);
</script>