3 pièce(s) jointe(s)
[Ajax + PHP] Modfication/affichage d'un message en temps réel lié aux traitements d'une page Ajax
Bonjour,
Je poste ce message parce que j'ai beau chercher un peu partout sur le net, je ne trouve pas de réponse à cette question.
J'ai un gros traitement qui est lancé à partir d'un appel ajax (via jQuery) et je voudrais afficher en temps réel des messages d'avancement (ou mette à jour un message d'une fenêtre modale par exemple) au fur et à mesure que le traitement avance.
Je sais qu'il est possible de forcer le navigateur a affiché quelque chose même si la page n'a pas fini de charger avec les fonctions flush() ou ob_flush().
J'ai d'ailleurs ce bout de code qui fonctionne bien lorsque je l'appelle avec mon navigateur mais pas lorsque je l’appelle en ajax :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| for ($i = 0; $i < 10; $i++)
{
ob_start();
ob_implicit_flush(true);
echo 'Traitement '.$i.' : terminé<br>';
ob_end_flush();
ob_flush();
sleep(10);
} |
J'appelle ce code avec un appel de ce genre :
Code:
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
| $.ajax({
type: 'POST',
url: 'test.php',
cache: true,
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.responseText);
alert(thrownError);
},
xhr: function (x) {
console.log(x);
var xhr = new window.XMLHttpRequest();
//Download progress
xhr.addEventListener("progress", function (evt) {
console.log(evt);
$('#message').append(evt.target.response);
}, false);
return xhr;
},
beforeSend: function () {
console.log('beforeSend');
},
complete: function () {
console.log('complete');
},
success: function (json) {
console.log('fin');
}
}); |
J'ai analysé le retour sur la console et en fait, je me rends compte que le message est concaténé :
1. Après le premier traitement j'ai : Traitement 1 : terminé<br>.
2. Après le deuxième traitement j'ai : Traitement 1 : terminé<br>Traitement 2 : terminé<br> au lieu d'avoir que Traitement 2 : terminé<br>.
3. Après le troisième traitement j'ai : Traitement 1 : terminé<br>Traitement 2 : terminé<br>Traitement 3 : terminé<br> au lieu d'avoir que Traitement 3 : terminé<br>.
Pièce jointe 612807
Pièce jointe 612806
Pièce jointe 612805
Avez-vous une idée de comment faire ?
Je vous remercie par avance pour votre aide.