Salut
Est-ce qu'il est possible d'utiliser XHRConnection en mode synchrone ? Si oui, comment ?
Merci d'avance
Salut
Est-ce qu'il est possible d'utiliser XHRConnection en mode synchrone ? Si oui, comment ?
Merci d'avance
Oui, c'est possible. Il suffit de faire ceci :
C'est le false qui est important. Si c'est true, c'est asynchrone, si c'est false, c'est synchrone.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 xhr = new XHR(); // Création de l'objet, je passe sur les différents navigateurs. ... xhr.open(methode, URL, false); ...
Hum... Je ne suis pas sûr qu'on parle de la même librairie, je parle de celle-ci : http://xhrconnection.sutekidane.netEnvoyé par dingoth
Je sais mais je ne trouvais rien pour paramétrer ça dans xhrconnection.Envoyé par dingoth
Et j'ai trouvé pourquoi :
1. je n'utilisais pas la bonne fonction
2. ce n'est pas prévu par xhrconnection (true en dur dans le code)
J'ai donc modifié la librairie pour changer cela et c'est presque bon.
Dans Firefox ça ne va pas. Mon script s'exécute du début à la fin sans passer par ma fonction callback. Par contre avec d'autres navigateurs (j'ai testé Opera et Konqueror), tout fonctionne parfaitement
Au temps pour moi, je pensais que tu parlais de XmlHTTPRequest sous un autre nom.
Sinon, tu as fait ce que je t'aurais conseillé : modifier la librairie.
Par contre, si tu fais ça en mode synchrone, tu n'as pas besoin d'utiliser une fonction callback. XHRConnection reste-t-il un choix judicieux ? Je ne pense pas. Ou alors, il faut encore modifier la classe pour effectuer l'appel à la fonction souhaitée directement après le send(...);
En fait c'est le seul cas dans mon projet ou l'exécution doit être synchrone. La raison de l'utilisation synchrone est expliquée ici : http://xhrconnection.sutekidane.net/...opic.php?id=95Envoyé par dingoth
Donc, si j'ai bien compris, le problème avec Firefox c'est qu'il ignore totalement la propriété onreadystatechange en mode synchrone ?
La fonction (sans ma modification) de XHRConnection qui exécute les fonctions open/send est la suivante
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51 this.sendAndLoad = function(Url, httpMode, callBack) { httpMode = httpMode.toUpperCase(); conn.onreadystatechange = function() { if (conn.readyState == 4 && conn.status == 200) { // Si une fonction de callBack a été définie if (typeof callBack == "function") { callBack(conn); return; } // Si une zone destinée à récupérer le résultat a été définie else if (areaId.length > 0){ try { document.getElementById(areaId).innerHTML = conn.responseText; } catch(error) { if (debug) { alert('Echec, ' + areaId + ' n\'est pas un objet valide'); } } return; } } }; switch(httpMode) { case "GET": try { Url = (datas.length > 0) ? Url + "?" + datas : Url; conn.open("GET", Url); conn.send(null); } catch(error) { if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la méthode GET'); } return false; } break; case "POST": try { conn.open("POST", Url); conn.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); conn.send(datas); } catch(error) { if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la mthode POST'); } return false; } break; default : return false; break; } return true; };
Je pourrais donc ajouter une version modifiée de la fonction pour le cas synchrone :
ou quelque chose de ce genre
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
38
39
40
41
42
43
44
45
46
47
48 this.sendAndLoadSynchron = function(Url, httpMode) { httpMode = httpMode.toUpperCase(); switch(httpMode) { case "GET": try { Url = (datas.length > 0) ? Url + "?" + datas : Url; conn.open("GET", Url, false); conn.send(null); } catch(error) { if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la méthode GET'); } return false; } break; case "POST": try { conn.open("POST", Url, false); conn.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); conn.send(datas); } catch(error) { if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la mthode POST'); } return false; } break; default : return false; break; } if (conn.readyState == 4 && conn.status == 200) { if (areaId.length > 0){ try { document.getElementById(areaId).innerHTML = conn.responseText; } catch(error) { if (debug) { alert('Echec, ' + areaId + ' n\'est pas un objet valide'); } } return; } else { return conn; } } };
Partager