Réponse trop rapide ?

Petit nouveau ! | 2 Messages

06 mai 2009, 11:55

Bonjour,

Avant de poster mon code qui me pose problème, j'explique ce qui se passe...
J'ai adapté un code qui permet d'actualiser le contenu d'une liste Select en fonction du choix fait dans une autre (et ainsi de suite, presque à l'infini).
Mon adaptation a consisté à créer une classe en javascript et à permettre de lier deux listes à une liste "parente".
Dans ce cas, j'ai constaté qu'une seule des deux listes était mise à jour. Je me suis donc lancé dans le debuggage, d'abord en affichant des alert(). Et là, oh miracle, la liste se met à jour !
Si je commente mes alerts, le code ne marche plus.
J'ai tracé la page PHP qui est appelée par mon code Ajax : Elle est appelée pour toutes les listes.
Idem, j'ai tracé dans FireFox avec Firebug... et ça marche en faisant une exécution pas à pas ! Mais si je laisse "filer" le programme, ça ne marche plus.
Puisque cela marche en debug, mon code est bon dans l'absolu.
J'ai l'impression qu'en exécution normale, le code est trop "rapide" et que le fait de debugger ou de mettre des alerts lui laisse le temps...

Code : Tout sélectionner

if(index > 0) { // alert("Traitement "+champsSuivant); var xhr_object = null; if(window.XMLHttpRequest) // Si Firefox xhr_object = new XMLHttpRequest(); else if(window.ActiveXObject) // Si Internet Explorer xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); else { // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); return; } // On passe en GET le numéro du select à mettre à jour xhr_object.open("POST", this.pagePHP, true); xhr_object.onreadystatechange = function() { if(xhr_object.readyState == 4) { if(xhr_object.status == 200) { eval(xhr_object.responseText); } else { alert(xhr_object.status); } } } xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // Les données sont préparées dans data avec : // - params : contient les valeurs des option déjà sélectionnées // - form : contient le nom du formulaire // - field : contient le nom du champ suivant var data = "params="+params+"&form="+p_form.name+"&field="+champsSuivant; xhr_object.send(data); }
[/code]

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

07 mai 2009, 10:56

ce qui apparemment veut dire que tu dois utiliser deux instances différentes de la classe de mise à jour (ou du moins de l'objet xhr_object) pour tes 2 listes liées. Si tu utilise une seule instance, le deuxième appel de mise à jour recouvre le premier avec l'effet Asynchrone d'Ajax (programmation parallèle)

En français: tu dois utiliser 2 variables : xhr_object1 et xhr_object2 pour mettre à jour respectivement les 2 listes liées à la liste parente.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 2 Messages

07 mai 2009, 12:00

ce qui apparemment veut dire que tu dois utiliser deux instances différentes de la classe de mise à jour (ou du moins de l'objet xhr_object) pour tes 2 listes liées. Si tu utilise une seule instance, le deuxième appel de mise à jour recouvre le premier avec l'effet Asynchrone d'Ajax (programmation parallèle)

En français: tu dois utiliser 2 variables : xhr_object1 et xhr_object2 pour mettre à jour respectivement les 2 listes liées à la liste parente.
Effectivement, étant novice en Ajax, je n'étais tombé jusqu'à présent que sur ce type de code, qui me paraissait tout à fait naturel. Je n'avais pas connaissance de la notion de synchone/asynchrone.
En fouillant tout à l'heure, je suis tombé sur un tuto pour nul qui a aborté ce problème. Je pensais bien qu'il y avait un effet de bord entre les deux listes.
Ta proposition d'utiliser 2 variables serait valable. Cependant, mon code est censé être générique. Je peux avoir 2,3 ou n listes dépendantes !
La solution que j'ai trouvé est de transformer mon code en code synchro. Ce n'est pas génant, car le traitement demandé est très rapide.

Merci en tout cas pour la confirmation de la source du problème ! Cela m'a aidé, car depuis deux jours, Je suis dans les "hypothèses"... et quand on débute dans un langage, c'est pas fantastiques d'avoir plus de questions que de réponses !
Merci encore !