J'ai pas mal d'appels ajax dans l'application web que je développe actuellement, et comme la plupart d'entre eux (les plus simples en fait) ont la même structure, je me suis dit que j'allais faire une petite fonction... mais je perds tout l'avantage de l'asynchronicité ajax...
Je peux me débrouiller sans cette fonction, bien sûr, mais je me dis que je ne devais pas être loin... peut-être en définissant un événement personnalisé au retour de l'appel, que je récupèrerais avec un gestionnaire adapté...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
30
31
32
33
34
35
36
37 // NE PAS UTILISER : problème à résoudre : perte de l'avantage de l'asynchronicité ajax //( piste de résolution : gestionnaire d'événement pour récupérer la valeur de retour au lieu de l'attendre ) // --------------------------------------------------------- // --- FONCTION APPEL AJAX STANDARD --- // --------------------------------------------------------- // >>> réalise un appel ajax standard à partir des paramètres donnés : // PARAM #1 : URL de l'appel (chemin relatif à appeler par ajax, exemple : "./repertoire/page.php" ) // PARAM #2 (optionnel) : chaine de paramètres au format "paramètres de requête" ( exemple : param1="bonjour"¶m2="99548652"¶m3="false" ) // RETOUR : (string) de retour du traitement ajax ( ici ==> xhr.responseText ) function appel_ajax_standard(url, params) { window["retour"] = ""; var xhr = getXhr(); var ms = new Date().getTime(); params = (params)?(params + '&ms=' + ms):('ms=' + ms); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { // pas de return ici car il serait interprété comme étant le retour de la fonction "onreadystatechange" window["retour"] = xhr.responseText; } else { window["retour"] = "Le serveur ne répond pas."; } } } xhr.open("GET", url + "?" + params, true); xhr.send(null); while (window["retour"] === "") { /* attente de la réponse */ } return retour; }
Si vous avez des suggestions... je suis preneur
(détail à prendre en compte : je n'ai pas la liberté d'ajouter de nouveau framework à cette application, bien entendu, sinon j'aurais déjà collé du Prototype partout ^^)
EDIT : corrections effectuées après commentaires de Bovino
Partager