Bonjour à tous...
Alors j'ai une solution simple qui est de laisser tomber ce que je souhaite faire en AJAX et de recharger ma page... mais je suis tétu... donc j'aimerai avoir un coup de main pour mon problème qui est le suivant :
J'ai maPage.php qui est chargée par le navigateur...
Celle-ci contient 2 div...
Dans un premier div (DIV1), on a une liste déroulante permettant de choisir une option et un bouton pour valider.
Dans le second div (DIV2), on a par défaut au départ un div vide... 
Ce que je cherche à faire est la chose suivante (vous vous en serez doutés) :
Au moment de la validation par le bouton dans le premier div... j'appelle en AJAX une page load.php qui prend en paramètre la valeur de l'option choisie dans la liste déroulante... On appelle donc : load.php?option=12
Cette page qui s'exécute coté serveur enregistre le choix de l'utilisateur dans la base et je souhaite qu'elle me retourne 2 informations... à savoir les nouveaux contenus de mes 2 div...
Ainsi aprés la validation, je souhaiterai (sans recharger la page) que mon DIV2 contienne la liste des options choisies (en l'occurence ici uniquement la 12 que l'on vient d'enregistrer) et que du coup mon DIV1 contienne la nouvelle liste d'option disponible (à savoir la même que précédemment mais avec l'option 12 en moins)...
Je tiens à préciser que je n'ai aucun problème pour tous les traitements coté serveur (enregistrement BD, génération de la nouvelle liste etc... tout ca c'est bon) 
La solution que j'ai choisi est de générer un message en JSON et de le parser... Pourquoi... parce que dans le 1er div on a un formulaire avec une liste déroulante et dans le 2nd une liste d'enregistrement.
Le faire avec responseXML, ca me pose problème car le message retourné contient des balises html et au moment du parsing c'est la merde... Et puis c'est mal géré sous IE...
Faire cela avec une responseText brute aurait été crade... Donc je me suis retourné vers JSON... J'ai donc repris les codes courrants à savoir qu'au retour de ma variable responseText je vérifie sa validité comme suit :
reponse = validateJSON(xhr.responseText);
Et ce à l'aide de la fonction :
1 2 3
| function validateJSON(jsonText) {
return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(jsonText.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + jsonText + ')');
} |
(Que par la même occasion je ne comprends pas du tout
)
Le problème est que la chaîne retournée n'est jamais valide...
J'ai donc pensé que cela provennait du fait que la chaîne générée contient des doubles côtes... (<form id="xxxx"> et idem pour chaque option de ma liste déroulante)... Avant de la renvoyé je lui applique donc la fonction addslashes mais cela ne suffit pas...
Je bloque... avec au sortir de l'exécution la chaîne JSON non valide suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [
{ "newDiv1" : " <form id=\"form1\" name=\"form1\">
<select id=\"maListe\" name=\"maListe\">
<option value=\"12\">Artichaut</option>
<option value=\"8\">Banane</option>
<option value=\"4\">Carotte</option>
</select>
le
<input type=\"text\" name=\"date_achat\" id=\"date_achat\" size=\"12\" value=\"\"
onClick=\"view_microcal(true,dateDebut,microcalDebut,-1,0);\"
onKeyUp=\"this.style.color=testTypeDate(this.value)?\'black\':\'red\'\">
<div id=\"microcalDebut\" style=\"visibility:hidden;position:absolute;border:2px #900031 solid;background:#ffffff;\" onMouseleave=\"view_microcal(false,dateDebut,microcalDebut,-1,0);\"></div>
<input type=\"button\" id=\"btn_record\" name=\"btn_record\" value=\"Enregistrer\" onClick=\"load();\"><br>
</form>
", "newDiv2" : "Aucun produit.<br>" }
] |
basé sur le modèle :
1 2 3 4 5
| $str = <<<STR
[
{ "newDiv1" : "$div1", "newDiv2" : "$div2" }
]
STR; |
Et ca... ca marche pas !
(L'appel view_microcal sur mon champ date me permet simplement d'avoir un ptit calendrier pour sélectionner la date)
Donc si vous voyez quelque chose qui pourrait m'aider...
Si personne n'arrive à me sortir de là... je crois que je vais opter pour la responseText avec mes propres balises [DIV] et [/DIV] me permettant de repérer chacun de mes div et de les récupérer avec un ptit parser tout bête...
Merci d'avance pour vos lumières
Partager