Requêtes AJAX et réponse du serveur
Résolu
papymucho
Messages postés
140
Date d'inscription
Statut
Membre
Dernière intervention
-
papymucho Messages postés 140 Date d'inscription Statut Membre Dernière intervention -
papymucho Messages postés 140 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Requêtes AJAX et réponse du serveur
- Réponse automatique thunderbird - Guide
- Changer serveur dns - Guide
- Serveur entrant et sortant - Guide
- Réponse automatique gmail - Guide
- Serveur dns gratuit - Guide
5 réponses
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,
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.
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,
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 ! :-)
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 :)
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
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!