jQuery lire AJAX flux progressivement?
J'ai lu cette question mais il n'est pas exactement la réponse à ma question.
Malheureusement, il semble que les choses ont changé dans la XHR objet depuis la dernière fois que j'ai regardé AJAX, donc il n'est plus possible d'accéder directement responseText
avant qu'il est fini d'être rempli.
Je dois écrire une page qui utilise AJAX (de préférence jQuery, mais je suis ouvert aux suggestions) pour récupérer des données au format CSV via HTTP à partir d'un serveur, je n'ai aucun contrôle sur. Les données de réponse pourrait être assez important; un mégaoctet de texte n'est pas rare.
Le serveur est stream de l'environnement. Est-il encore un moyen d'obtenir l'accès à un flux de données qu'il est retourné, directement à partir de JavaScript?
J'ai la possibilité d'écrire du code PHP qui vit dans le milieu et utilise une sorte de "Comète" tech (le long du scrutin, EventSource, etc), mais je préfère éviter si possible.
Dans le cas où il est pertinent, pour assumer cette question que les utilisateurs disposent de la dernière version de Firefox/Chrome/Opéra et de la vieille compatibilité de votre navigateur n'est pas un problème.
- Je sais que cela a été répondu, j'ai fait quelque chose comme ça avant, un coup d'oeil, l'arracher si vous devez vous jsfiddle.net/JmZCE/1
Vous devez vous connecter pour publier un commentaire.
Vous allez avoir à utiliser directement en haut du javascript pour ça. La raison en est que vous allez avoir à interroger en permanence et de ne pas attendre pour les rappels à feu. Vous n'avez pas besoin de jQuery pour cela, c'est assez simple. Ils ont quelques nice code source sur l'Ajax Modèles de site web.
Essentiellement, vous aurez juste envie de garder une trace de votre dernière position dans la réponse et interroger périodiquement pour plus de texte passé de cet emplacement. La différence dans votre cas, c'est que vous pouvez vous abonner à l'événement et d'arrêter votre bureau de vote.
Est très simple lors de la sortie texte ou HTML. Ci-dessous est un exemple.
(Vous pourrez rencontrer des problèmes si vous essayez de sortie JSON cependant, dont je parlerai plus bas.)
FICHIER PHP
FICHIER HTML
Que faire si j'ai besoin de faire cela avec JSON?
Ce n'est pas vraiment possible de charger un seul objet JSON progressivement (avant qu'il soit complètement chargé) parce que jusqu'à ce que vous avez l'objet, la syntaxe sera toujours valide.
Mais si votre réponse est plusieurs objets JSON, l'un après l'autre, alors il est possible de charger un à un, comme ils viennent en bas du tuyau.
Donc j'ai modifié mon code ci-dessus par...
Modification de FICHIER PHP à la ligne 4 de
echo $val;
àecho '{"name":"'.$val.'"};'
. Cette fonction génère une série d'objets JSON.Changer de FICHIER HTML, ligne 24 à partir de
console.log(this_response);
àNoter que ce système rudimentaire de code suppose que chaque "morceau" de venir le navigateur est valable un objet JSON. Ce ne sera pas toujours le cas, parce que vous ne pouvez pas prédire comment les paquets arriveront - vous pourra être amené à scinder la chaîne basé sur des points-virgules (ou un autre séparateur).
Ne pas utiliser
application/json
Ne PAS Pour le changement de vos en-têtes de
application/json
- je l'ai fait et il m'a fait une recherche sur Google pendant 3 jours. Lorsque le type de réponse estapplication/json
, le navigateur attend jusqu'à ce que la réponse est complète, entièrement terminée. La réponse complète est ensuite analysée afin de vérifier si elle est enfait JSON. Cependant, notre réponse COMPLÈTE est{...};{...};{...};
qui n'est PAS valide JSON. LejqXHR.done
méthode suppose, il y avait une erreur, car la réponse complète ne peut pas être analysée comme JSON.Comme mentionné dans les commentaires, vous pouvez désactiver cette case à côté client en utilisant:
Espère que certaines personnes trouvent cela utile.
console.log
s etdebugger
s dans votre code pour savoir exactement où il se casseUtilisation XMLHttpRequest.js
https://github.com/ilinsky/xmlhttprequest
http://code.google.com/p/xmlhttprequest
D'utiliser le temps d'interrogation avec PHP:
output.php:
run.php:
Cela devrait sortie:
Pour IE, vous devez regarder dans XDomainRequest
http://blogs.msdn.com/b/ieinternals/archive/2010/04/06/comet-streaming-in-internet-explorer-with-xmlhttprequest-and-xdomainrequest.aspx
http://msdn.microsoft.com/en-us/library/cc288060(SV.85).aspx
application/octet-stream
. Voir mon post mis à jour pour PHP par exemple.;
.Puisque vous dites que votre serveur est stream amical (asynchrone) et était à la recherche de jquery solution, avez-vous vérifié la jQuery Plugin Flux?
Il est vraiment facile à utiliser et il vous permet de ne pas vraiment vous soucier de quoi que ce soit. Il a assez bon la documentation ainsi.
Voici une façon simple de réaliser cela à l'aide de JQuery (comme demandé par l'OP):
D'abord, étendre l'ajax objet de soutenir onreadystatechange en exécutant le code ci-dessous à partir de https://gist.github.com/chrishow/3023092 (ajouté au bas de cette réponse). Puis il suffit d'appeler l'ajax à l'aide d'un onreadystatechange fonction qui va vérifier xhr.responseText un nouveau texte.
Si vous voulait encore plus sophistiqué, vous pouvez effacer le responseText de données chaque fois que vous le lisez, tels que décrits ici).
Voir, par exemple,https://jsfiddle.net/g1jmwcmw/1/, qui permettra de télécharger la réponse de https://code.jquery.com/jquery-1.5.js et de sortie en morceaux à l'intérieur de votre fenêtre de la console, à l'aide du code ci-dessous (que vous pouvez simplement copier dans une page html, puis l'ouvrir dans votre navigateur):