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:
Une partie du bout de html récupéré par ajax:
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>
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>
Partager