XHR2 (lisez d'abord les réponses de Benjamin Gruenbaum et Felix King)
Si vous n'utilisez pas jQuery, et que vous voulez un XHR2 court et agréable qui fonctionne sur les navigateurs modernes et également sur les navigateurs mobiles, je vous suggère de l'utiliser de cette façon.
function ajax(a,b,c){ // Url, Callback, just a placeholder
c=new XMLHttpRequest;
c.open('GET',a);
c.onload=b;
c.send()
}
Comme vous pouvez le voir :
- Elle est plus courte que toutes les autres fonctions listées.
- Le callback est défini directement (donc pas de fermetures supplémentaires inutiles).
- Il utilise le nouveau onload (ainsi vous n'avez pas à vérifier le readystate && status)
- il y a d'autres situations dont je ne me souviens pas qui rendent le xhr1 ennuyeux.
Il y a 2 façons d'obtenir la réponse de cet appel ajax (3 en utilisant le nom de la variable xhr) :
Le plus simple
this.response
ou si pour une raison quelconque vous bind()
le rappel d'une classe
e.target.response
Exemple
function callback(e){
console.log(this.response);
}
ajax('URL',callback);
ou (la solution ci-dessus est meilleure, les fonctions anonymes posent toujours problème)
ajax('URL',function(e){console.log(this.response)});
Rien de plus facile.
Certains diront probablement qu'il est préférable d'utiliser onreadystatechange ou même le nom de la variable XMLHttpRequest. C'est faux.
Regarde ça : http://caniuse.com/xhr2
supporté par tous les navigateurs *modernes. Et je peux confirmer car j'utilise cette approche depuis que xhr2 existe. Je n'ai jamais eu aucun type de problème sur tous les navigateurs que j'utilise.
onreadystatechange n'est utile que si vous voulez obtenir les en-têtes à l'état 2.
Utilisation de la XMLHttpRequest
Le nom de la variable est une autre erreur importante, car vous devez exécuter le rappel à l'intérieur des fermetures onload/oreadystatechange, sinon vous le perdez.
Maintenant, si vous voulez quelque chose de plus complexe en utilisant post et FormData, vous pouvez facilement étendre cette fonction :
function x(a,b,e,d,c){ // Url,callback,method,formdata or {key:val},placeholder
c=new XMLHttpRequest;
c.open(e||'get',a);
c.onload=b;
c.send(d||null)
}
Encore une fois ... c'est une fonction très courte mais elle permet d'obtenir & post
des exemples d'utilisation :
x(url,callback);//by default it's get so no need to set
x(url,callback,'post',{'key':'val'}); //no need to set post data
ou passer un élément de formulaire complet ( document.getElementsByTagName('form')[0]
)
var fd=new FormData(form);
x(url,callback,'post',fd);
ou définissez des valeurs personnalisées
var fd=new FormData();
fd.append('key','val')
x(url,callback,'post',fd);
Comme vous pouvez le voir, je n'ai pas mis en œuvre la synchronisation... c'est une mauvaise chose.
Ceci dit... pourquoi ne pas le faire de la manière la plus simple ?
Comme mentionné dans le commentaire, l'utilisation de error && synchronous rompt complètement le point de la réponse, qui est un moyen court et agréable d'utiliser ajax de la manière appropriée.
Gestionnaire d'erreurs
function x(a,b,e,d,c){ // URL,callback,method,formdata or {key:val},placeholder
c=new XMLHttpRequest;
c.open(e||'get',a);
c.onload=b;
c.onerror=error;
c.send(d||null)
}
function error(e){
console.log('--Error--',this.type);
console.log('this: ',this);
console.log('Event: ',e)
}
function displayAjax(e){
console.log(e,this);
}
x('WRONGURL',displayAjax);
Dans le script ci-dessus, vous avez un gestionnaire d'erreur qui est défini statiquement afin de ne pas compromettre la fonction. Le gestionnaire d'erreurs peut également être utilisé pour d'autres fonctions.
Mais pour vraiment sortir une erreur le uniquement est d'écrire une mauvaise URL, auquel cas tous les navigateurs affichent une erreur.
les gestionnaires d'erreurs sont peut-être utiles si vous définissez des en-têtes personnalisés, si vous définissez le type de réponse (responseType) à blob arraybuffer ou autre.....
Même si vous passez 'POSTAPAPAP' comme methot, il n'y aura pas d'erreur.
Même si vous passez 'fdggdgilfdghfldj' comme données de formulaire, il n'y aura pas d'erreur.
Dans le premier cas, l'erreur se trouve à l'intérieur du displayAjax()
sous this.statusText
comme Method not Allowed
.
Dans le second cas, cela fonctionne tout simplement. Vous devez vérifier du côté du serveur si vous avez passé les bonnes données de post.
crossdomain not allowed lance automatiquement une erreur.
Dans la réponse d'erreur, il n'y a pas de code d'erreur.
Il n'y a que le this.type
qui a la valeur "erreur".
Pourquoi ajouter un gestionnaire d'erreurs si vous n'avez absolument aucun contrôle sur les erreurs ? La plupart des erreurs sont renvoyées à l'intérieur de cette fonction de rappel. displayAjax()
Donc : PAS besoin de contrôles d'erreurs si vous êtes capable de copier et coller l'url correctement ;)
ps. : Comme premier test, j'ai écrit x('x',displayAjax)... et j'ai obtenu une réponse... ??? alors j'ai vérifié le dossier où se trouve le HTML... et il y avait un fichier appelé 'x.xml'... donc même si vous oubliez l'extension de votre fichier xhr2 LE TROUVERA J'ai ri.
Lire un fichier de manière synchrone
Ne fais pas ça.
si vous voulez bloquer le navigateur pendant un certain temps, chargez un gros fichier txt synchrone.
function omg(a,c){ // Url
c=new XMLHttpRequest;
c.open('GET',a,true);
c.send();
return c; //or c.response
}
maintenant vous pouvez faire
var res=omg('thisIsGonnaBlockThePage.txt');
Il n'y a pas d'autre moyen de faire cela de manière non asynchrone (oui avec la boucle setTimeout... mais srsly ?).
Un autre point est si vous travaillez avec des API ou juste vos propres fichiers de liste ou autre, vous utilisez toujours des fonctions différentes pour chaque demande
Seulement si vous avez une page où vous chargez toujours le même XML/JSON ou autre, vous n'avez besoin que d'une seule fonction, dans ce cas modifiez un peu la fonction ajax et remplacez b par votre fonction spéciale.
les fonctions ci-dessus sont destinées à une utilisation de base.
si vous voulez EXTENSIONNER la fonction ...
oui, vous pouvez
J'utilise beaucoup d'API et l'une des premières fonctions que j'intègre dans chaque page html est la première fonction ajax de cette réponse ... avec GET seulement...
mais vous pouvez faire beaucoup de choses avec xhr2 :
J'ai fait un gestionnaire de téléchargement (en utilisant des plages des deux côtés avec resume,filereader,filesystem),divers convertisseurs de redimensionnement d'images en utilisant canvas,alimenter des bases de données websql avec des images base64 et bien plus encore... mais dans ces cas vous devriez créer une fonction uniquement dans ce but... parfois vous avez besoin de blob, de arraybuffers, vous pouvez définir des en-têtes, remplacer mimetype et il y a beaucoup plus encore...
mais la question ici est de savoir comment retourner une réponse Ajax ... (j'ai ajouté un moyen simple)