Tout d'abord, bonjour a tous, c'est mon premier post sur ce forum.
J'ai essayé tant bien que mal de résoudre ce problème tout seul, mais la j'aurai besoin d'un coup de main avant que je sombre dans une folie irréversible...
Je pense que mon problème concerne le javascript uniquement, mais pour info, je bosse sur une app web qui utilise du AJAX, XML et XSLT, avec la librairie prototype.js secondé par le framework freja.js.
Infos préliminaires :
Un client appelle un module qui s'écrit dans un div "module".
On va dire que le client, avant ca, est vide, si ce n'est qu'il contient qq fonctions js.
Le module quant a lui, a ses propres fonctions js.
Dans ce module, un appel de fonction, getList(), est rattaché sur le onChange d'un select du module.
La fonction getList est définie entre des balises script, qui lui-meme est inséré dans le div "module" avec tout le reste.
Le problème :
Une fois le module loadé, lorsque j'utilise le select, une erreur est renvoyée comme quoi la fonction est non définie.
Les contraintes :
Je ne veux pas déporter la définition de la fonction concernée ailleurs (par ex sur la page du client avant insertion du module). Je voudrais qu'elle reste a l'intérieur du div.
En gros, je veux séparer clairement les définitions des fonctions de la page client "nature" et celles du module.
Appremment, il ne repère pas la définition dans le div.
Autre chose, quand je veux afficher le code source de la page, apres insertion du module (qui s'affiche parfaitement, avec ses selects), le div est quand meme vide, les infos ne sont pas lisibles. C'est peut-etre lié à ça, bien que ca m'étonnerait.
Source de la page client (on voit la meme chose, avant ou apres insertion du module) :
la fonction load_nav() récupère le module (xml+xsl) en asynchrone et l'insère dans le div "module". Ca, ca marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 <html> ... <script type='text/javascript' src='js/prototype.js'></script> <script type='text/javascript' src='controller/freja.js'></script> <script type='text/javascript' src='controller/mvc.js'></script> ... <script> function initNAV() { //execute le serveur pour générer le xsl var url = 'serveur_nav.php'; var pars = 'mode=init'; var myAjax = new Ajax.Request( url, {method: 'get', parameters: pars, onComplete: load_nav} ); } function load_nav() { MVC_start( 'models/data.xml', 'views/NAV_mod.xsl', 'module' ); } </script> <input type='button' value='module NAV' onclick='initNAV();' > <div id='module'> ... </body> </html>
Je vous met quand meme la fonction MVS_start de mvc.js (qui se base sur freja), sait-on jamais... :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function MVC_start( pathXML, pathXSL, resultDIV ) { var data = new Model( pathXML ); //'models/bible.xml' var display = new View( pathXSL ); //'views/NAV_mod.xsl' Controller.onLoadComplete = showMe; Controller.loadAssets(); function showMe() { if ( resultDIV ) Controller.render(data, display, { placeholder: resultDIV }); //'content' else Controller.render(data, display ); } }
Le template XSL sur la racine du xml, avec la définition du script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- NAV module --> <xsl:template match="/"> ... <script language='javascript'> function getList() { var levelID = $('level_id').innerHTML; var levelNUM = $('level_num').innerHTML; var url = 'xml-ajax_navigator.php'; var pars = 'levelID=' + levelID + '%26' + 'levelNUM=' + levelNUM; var myAjax = new Ajax.Request( url, {method: 'get', parameters: pars, onLoading: showLoading, onComplete: showResponse} ); } </script> ... <div id='level_id'>0</div> <div id='level_num'>0</div> <xsl:apply-templates /> </xsl:template>
Le template du SELECT, avec l'appel de la fonction getList() :
Chose étonnante : l'accès aux divs "level_id" et "level_num" ne pose pas de pb, alors qu'avec la fonction oui. Ils sont pourtant définis cote a cote...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <xsl:variable name="xlevel_num"> <xsl:value-of select="intranet/navigator/@level_num"/> </xsl:variable> <!-- SELECT liste --> <xsl:template match="intranet/navigator/levels[@num <= $xlevel_num]"> <select name="liste" onChange="javascript: $('level_id').innerHTML= this.value; $('level_num').innerHTML= {@num}; getList();"> <option value="0">--------</option> <xsl:apply-templates select="./level"/> </select> </xsl:template> ....
Bon, ca fait beaucoup, je risque d'en faire partir plus d'un mais qui ne tente rien n'a rien...
J'ai essayé d'etre le plus clair possible, mais ayant pas mal la tete dans mon truc, j'imagine que ce qui me semble clair peut paraitre compliqué de l'extérieur...
Donc si quelqu'un a une idée... qu'il n'hésite pas !!
Merci d'avance pour votre aide !
Partager