IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[AJAX] XHRConnection en synchrone


Sujet :

JavaScript

  1. #1
    Invité
    Invité(e)
    Par défaut [AJAX] XHRConnection en synchrone
    Salut

    Est-ce qu'il est possible d'utiliser XHRConnection en mode synchrone ? Si oui, comment ?


    Merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Oui, c'est possible. Il suffit de faire ceci :

    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);
    ...
    C'est le false qui est important. Si c'est true, c'est asynchrone, si c'est false, c'est synchrone.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dingoth
    Oui, c'est possible. Il suffit de faire ceci :

    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.net


    Citation Envoyé par dingoth
    C'est le false qui est important. Si c'est true, c'est asynchrone, si c'est false, c'est synchrone.
    Je sais mais je ne trouvais rien pour paramétrer ça dans xhrconnection.
    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

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    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(...);

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dingoth
    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=95



    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 :

    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;
          }
       }
    };
    ou quelque chose de ce genre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Utilisation d'AJAX en mode synchrone
    Par dust62 dans le forum jQuery
    Réponses: 2
    Dernier message: 23/05/2014, 11h04
  2. [AJAX] Pb avec mutli requete synchrone (FF)
    Par Sly^iti dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/03/2007, 22h43
  3. [AJAX] Pb de listes liées en mode Synchrone sous FireFox
    Par olive_le_malin dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/12/2006, 17h28
  4. [AJAX] : pb en communication Synchrone sous Firefox !
    Par Foub dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/08/2006, 17h32
  5. [AJAX] Ajax en mode synchrone sur Safari
    Par The Blec dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/02/2006, 17h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo