Requêtes AJAX et réponse du serveur
Résolu/Fermé
papymucho
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
-
16 janv. 2009 à 11:48
papymucho Messages postés 140 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 1 novembre 2009 - 16 janv. 2009 à 16:30
papymucho Messages postés 140 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 1 novembre 2009 - 16 janv. 2009 à 16:30
A voir également:
- Requêtes AJAX et réponse du serveur
- Thunderbird réponse automatique - Guide
- Serveur entrant et sortant - Guide
- Changer serveur dns - Guide
- Serveur diff message ✓ - Forum Mobile
- Atlas pro url serveur invalide - Forum TV & Vidéo
5 réponses
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
16 janv. 2009 à 12:29
16 janv. 2009 à 12:29
Bonjour Papymucho,
Des fois la réponse est instantannée.... Des fois pas.... : oui, c'est ça Ajax. Comme c'est asynchrone, on envoie juste la requête au serveur, et on laisse les trames http vivre leur vie. Elles peuvent arriver très rapidement comme 30s après.
Et là c'est le drame, plusieurs contenu apparaissent d'un coup (du style deux fois le même, voir plus...)... Je ne comprends pas très bien. Comment récupères-tu tes données (fichier xml?) ? Comment fais-tu pour charger la page ainsi reçue (des appendChild?) ?
Cordialement,
Des fois la réponse est instantannée.... Des fois pas.... : oui, c'est ça Ajax. Comme c'est asynchrone, on envoie juste la requête au serveur, et on laisse les trames http vivre leur vie. Elles peuvent arriver très rapidement comme 30s après.
Et là c'est le drame, plusieurs contenu apparaissent d'un coup (du style deux fois le même, voir plus...)... Je ne comprends pas très bien. Comment récupères-tu tes données (fichier xml?) ? Comment fais-tu pour charger la page ainsi reçue (des appendChild?) ?
Cordialement,
papymucho
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
16 janv. 2009 à 14:03
16 janv. 2009 à 14:03
Merci de ta réponse Marco,
En fait je réécris dans un div spécialement créé pour ça. Voici l'exemple d'une fonction que j'utilise :
Comme expliqué dans ma question, j'utilise le plugin jquery.
Pour expliquer vite fait cette fonction, certaines pages de mon site ont un sous-menu, d'autres non....
Si quand on click sur un bouton, on doit un charger un sous menu, la variable element prends la valeur smenu.... Donc la fonction ajax charge le fichier demandé, et l'injecte dans un div appelé "smenu".
De même pour si l'on demande une page directement, la variable element prendra la valeur body, et la fonction ajax réécrira le div ayant pour identifiant "body".
A chaque fois qu'un click est effectué, l'ancien conteneur (div body ou div smenu) est vidé.
Donc comment faire pour bloquer l'utilisateur, ou vérifié si le conteneur est vide ou non.... (en fait j'ai l'impression de répondre à ma question tout à coup lol....) avant de réécrire dedans.
En fait je réécris dans un div spécialement créé pour ça. Voici l'exemple d'une fonction que j'utilise :
function load_page(element,page,id) //Fonction ajax, qui va appeler le bon fichier pour effectuer les requêtes de chargement du contenu. On check le fichier demandé (un smenu ou un body), quelle page et on lui envoie un id pour les requêtes. { $("#"+element).empty(); var path = "php/"+element; $.ajax ( { type: "POST", url: path+"/"+element+"_"+page+".php", //chemin du fichier/nom du fichier (composé de "body+nom" ou "smenu+nom").php data: "page="+page+"&id="+id, success: function(msg) { $("#"+element).append(msg); } } ); }
Comme expliqué dans ma question, j'utilise le plugin jquery.
Pour expliquer vite fait cette fonction, certaines pages de mon site ont un sous-menu, d'autres non....
Si quand on click sur un bouton, on doit un charger un sous menu, la variable element prends la valeur smenu.... Donc la fonction ajax charge le fichier demandé, et l'injecte dans un div appelé "smenu".
De même pour si l'on demande une page directement, la variable element prendra la valeur body, et la fonction ajax réécrira le div ayant pour identifiant "body".
A chaque fois qu'un click est effectué, l'ancien conteneur (div body ou div smenu) est vidé.
Donc comment faire pour bloquer l'utilisateur, ou vérifié si le conteneur est vide ou non.... (en fait j'ai l'impression de répondre à ma question tout à coup lol....) avant de réécrire dedans.
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
16 janv. 2009 à 14:17
16 janv. 2009 à 14:17
Oui, exactement, tu réponds tout seul :)
Pour désactiver :
- dès que tu envoies la requête tu désactives le lien ou le bouton (en retirant l'url du lien par exemple, ou en passant l'attribut 'disabled' au bouton)
- dès que tu reçois la réponse, tu remets ton élément à son état d'origine
La seconde :
Je ne connais pas JQuery, mais ici tu utilises la fonction append (qui concatène). En javascript, si tu veux fixer ton message (et non le concaténer, donc écraser l'ancien), tu as l'attribut innerHtml. Sinon tu possèdes des méthodes DOM te permettant de supprimer des noeuds (donc ici l'idéal serait de stocker ton message dans un div ou un span, de donner un id à ce conteneur, et de supprimer ce conteneur dès que tu reçois un message pour en créer un nouveau avec cet id).
Cordialement,
Pour désactiver :
- dès que tu envoies la requête tu désactives le lien ou le bouton (en retirant l'url du lien par exemple, ou en passant l'attribut 'disabled' au bouton)
- dès que tu reçois la réponse, tu remets ton élément à son état d'origine
La seconde :
function(msg) { //ici tu vides ton $('#'+element) $("#"+element).append(msg); }
Je ne connais pas JQuery, mais ici tu utilises la fonction append (qui concatène). En javascript, si tu veux fixer ton message (et non le concaténer, donc écraser l'ancien), tu as l'attribut innerHtml. Sinon tu possèdes des méthodes DOM te permettant de supprimer des noeuds (donc ici l'idéal serait de stocker ton message dans un div ou un span, de donner un id à ce conteneur, et de supprimer ce conteneur dès que tu reçois un message pour en créer un nouveau avec cet id).
Cordialement,
papymucho
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
16 janv. 2009 à 14:29
16 janv. 2009 à 14:29
function(msg)
{
//ici tu vides ton $("#"+element)
$("#"+element).append(msg);
}
Pourquoi n'y avais-je pas pensé plutôt!! je vais essayé, je pense que le problème sera plus rare de cette façon.
Pour la méthode innerHTML je vais essayé également, je n'avais trouvé que cette syntaxe sous jquery lui ressemblant. Pour la suppression des noeuds, le framework dispose de quelques fonctions le permettant. empty y ressemble, sauf qu'il vide l'élément plutôt que de le supprimer, de cette façon je ne réécris pas le conteneur à chaque fois.
Merci Marco ! :-)
{
//ici tu vides ton $("#"+element)
$("#"+element).append(msg);
}
Pourquoi n'y avais-je pas pensé plutôt!! je vais essayé, je pense que le problème sera plus rare de cette façon.
Pour la méthode innerHTML je vais essayé également, je n'avais trouvé que cette syntaxe sous jquery lui ressemblant. Pour la suppression des noeuds, le framework dispose de quelques fonctions le permettant. empty y ressemble, sauf qu'il vide l'élément plutôt que de le supprimer, de cette façon je ne réécris pas le conteneur à chaque fois.
Merci Marco ! :-)
papymucho
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
16 janv. 2009 à 14:48
16 janv. 2009 à 14:48
Arggghh.... impeccable... le déplacement $("#"+element).empty(); suffisait....
Je prends une sale claque sur ce coup là, mais merci :)
Je prends une sale claque sur ce coup là, mais merci :)
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
16 janv. 2009 à 15:55
16 janv. 2009 à 15:55
En fait, je ne pense pas que ça résolve le problème "à 100%".
Je pense que c'est comme un problème de synchronisme avec des threads : si tu cliques plusieurs fois sur ton bouton, ton script va s'exécuter de manière asynchrone plusieurs fois.
Autrement dit, la zone critique c'est : je vide la page / je l'écris.
Si un autre script modifie la page entre ces deux actions, l'atomicité n'est plus respectée. Chez toi ça arrivait souvent, dans ma modification, ça arrivera moins souvent (mais ça arrivera tout de même).
Je pense donc (comme les sémaphores et mutex n'existent pas en js ^^) qu'il faut utiliser une autre solution (soit passer en mode synchrone :(, soit empêcher l'utilisateur d'appeler le script plusieurs fois.
Cordialement,
Je pense que c'est comme un problème de synchronisme avec des threads : si tu cliques plusieurs fois sur ton bouton, ton script va s'exécuter de manière asynchrone plusieurs fois.
Autrement dit, la zone critique c'est : je vide la page / je l'écris.
Si un autre script modifie la page entre ces deux actions, l'atomicité n'est plus respectée. Chez toi ça arrivait souvent, dans ma modification, ça arrivera moins souvent (mais ça arrivera tout de même).
Je pense donc (comme les sémaphores et mutex n'existent pas en js ^^) qu'il faut utiliser une autre solution (soit passer en mode synchrone :(, soit empêcher l'utilisateur d'appeler le script plusieurs fois.
Cordialement,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
papymucho
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
16 janv. 2009 à 16:30
16 janv. 2009 à 16:30
Je vais tester avec une connexion bas débit, et lorsque l'hébergeur sera le plus sollicité. J'ai quand même essayé plusieurs fois depuis, impeccable... on voit bien l'ancien contenu disparaitre et le nouveau s'afficher instantanément (une demi fraction de seconde) alors que les contenus se seraient superposés auparavant pour les mêmes situations.
L'algo est désormais : je charge le contenu du fichier -> success, le fichier est totalement chargé :
j'efface l'ancien contenu pour réécrire le nouveau.
alors qu'il était, j'efface l'ancien contenu -> je charge la page -> success, je réécris le nouveau contenu.
Je repasserais ici après d'autres tests. Merci!
L'algo est désormais : je charge le contenu du fichier -> success, le fichier est totalement chargé :
j'efface l'ancien contenu pour réécrire le nouveau.
alors qu'il était, j'efface l'ancien contenu -> je charge la page -> success, je réécris le nouveau contenu.
Je repasserais ici après d'autres tests. Merci!