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

AJAX Discussion :

[AJAX] Méthode open d'httpRequest silencieuse ?


Sujet :

AJAX

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut [AJAX] Méthode open d'httpRequest silencieuse ?
    Bonsoir à tous,

    J'ai un petit soucis avec cette méthode, elle me parait bien silencieuse, je m'explique : Je fais tourner des html offline avec dedans du JS et de l'ajax qui va faire des requêtes sur un serveur, tout marche nickel, mais si jamais l'utilisateur n'a pas de connexion, ça explose.

    J'ai essayé de catcher la ligne mais ça passe tout le temps dedans, même quand il y a une connexion... et apparemment cette méthode de renvoie rien.

    Donc que puis-je faire si jamais l'utilisateur n'a pas de connexion ou a un soucis pour lui signaler gentillement sans que la moitié de l'univers s'écroule ?

    Merci beaucoup.

    La fonction en question (en entier tant qu'à faire) :

    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
    function sendRequest(params)
    {
    	var httpRequest = false;
     
    	if (window.XMLHttpRequest) {
    		httpRequest = new XMLHttpRequest();
    		if (httpRequest.overrideMimeType) {
    			httpRequest.overrideMimeType('text/xml');
    		}
    	}
    	else if (window.ActiveXObject) {
    		try {
    			httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    		}
    		catch (e) {
    			try {
    				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    			}
    			catch (e) {}
    		}
    	}
     
    	if (!httpRequest) {
    		alert('Abandon :( Impossible de créer une instance XMLHTTP');
    		return false;
    	}
    	httpRequest.onreadystatechange = function() { alertContents(httpRequest); };
     
    	httpRequest.open('GET', 'http://mon-url.com/' + params, true);
    //		document.getElementById('errorMessage').innerHTML = 'Check your connection !';
     
    	httpRequest.send(null);
     
    	return true;
    }

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Comme ça de prime abord, il semble que tu ne traites pas les événements générés par AJAX lors de l'envoi de la requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    httpRequest.onreadystatechange = function() { alertContents(httpRequest); };
    Tu peux traiter httpRequest.status qui renvoie le code Server de la requete HTTP (200, 404, ...) . Si il est nul ou en dehors des plages habituelles c'est que tu serais en erreur. A tester.

    ERE

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Hum, mais le problème c'est que ça ne fonctionne pas sur le open, pourtant la méthode n'envoie rien ?!

    J'ai fais ça mais bon si ya aucune connexion d'ouverte ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (httpRequest.status == '200')
    	{
    		httpRequest.onreadystatechange = function() { alertContents(httpRequest); };
    		document.getElementById('errorMessage').innerHTML = httpRequest.status;
    		httpRequest.open('GET', 'http://mon-url.com/' + params, true);
    		httpRequest.send(null);
    	}
    	else
    	{
    		document.getElementById('errorMessage').innerHTML = 'Check your connection !';
    		return false;
    	}

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Salut,
    Les methodes "open" et "send" doit être en dehors de la fonction appelé par onreadystatechange. Le test du status doit être dans la fonction du onreadystatechange. Tu récupères ensuite le résultat du requête avec httpRequest.responseText ou httpRequest.responseXML.
    Tu trouveras les détails ici:
    http://siddh.developpez.com/articles/ajax/

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Pour le send et le open c'est déjà le cas, j'ai viré le status aussi. Mais je ne vois pas comment faire s'il n'y a pas de connexion, ou plus généralement, catcher les problèmes qu'il pourrait y avoir.

    Une idée ? Merci.

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Salut,
    Pour le send et le open c'est déjà le cas, j'ai viré le status aussi
    On peut voir?
    Tu peux gérer les problèmes qu'il pourrait y avoir avec la valeur de httpRequest.status.
    Tu trouveras plus de détails ici:
    http://mathieu-lemoine.developpez.co...reponse#LIII-A.

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Ben pour l'instant ya rien de spécial :

    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
    52
    53
    54
    55
    function sendRequest(params)
    {
    	var httpRequest = false;
     
    	if (window.XMLHttpRequest) {
    		httpRequest = new XMLHttpRequest();
    		if (httpRequest.overrideMimeType) {
    			httpRequest.overrideMimeType('text/xml');
    		}
    	}
    	else if (window.ActiveXObject) {
    		try {
    			httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    		}
    		catch (e) {
    			try {
    				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    			}
    			catch (e) {}
    		}
    	}
     
    	if (!httpRequest) {
    		alert('Abandon :( Impossible de créer une instance XMLHTTP');
    		return false;
    	}
     
    	httpRequest.onreadystatechange = function() { alertContents(httpRequest); };
    	httpRequest.open('GET', 'http://mon-url.com/test.php' + params, true);
    	httpRequest.send(null);
    	//document.getElementById('errorMessage').innerHTML = 'Check your connection !';
    }
     
    function alertContents(httpRequest)
    {
    	try {
    		if (httpRequest.readyState == 4) {
    			if (httpRequest.status == 200) {
    				//var xmldoc = httpRequest.responseXML;
    				document.getElementById('errorMessage').innerHTML = httpRequest.responseText;
    				alert(httpRequest.responseText);
    				if (httpRequest.responseText != '')
    					return false;
    				//window.location.href='http://url/';
     
    			} else {
    				alert('An error occurred during the request.');
    			}
    		}
    	}
    	catch( e ) {
    		alert("An exception occurred : " + e.description);
    	}
    	return true;
    }

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Je pense que le try n'est pas utile car il n'y a que de test de valeur à l'intérieur.
    Le paramètre "params" doit être de la forme "?var=valeur1&var2=valeur2".
    +
    Citation Envoyé par emmanuel.remy
    Tu peux traiter httpRequest.status qui renvoie le code Server de la requete HTTP (200, 404, ...) . Si il est nul ou en dehors des plages habituelles c'est que tu serais en erreur.

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    En fait... je viens de voir quelque chose, le readyState reste toujours à 1...

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Citation Envoyé par woodstock1212 Voir le message
    En fait... je viens de voir quelque chose, le readyState reste toujours à 1...
    Bon ça j'ai trouvé, j'ai remplacé true par false :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    httpRequest.open('GET', 'http://mon-url.com/test.php' + params, true);
    Par contre ça braille toujours à cet endroit, je mets un alert avant et après et le deuxième est pas affiché, donc on revient au même point. ^^

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Citation Envoyé par woodstock1212 Voir le message
    Bon ça j'ai trouvé, j'ai remplacé true par false :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    httpRequest.open('GET', 'http://mon-url.com/test.php' + params, true);
    Par contre ça braille toujours à cet endroit, je mets un alert avant et après et le deuxième est pas affiché, donc on revient au même point. ^^
    Décidément je me fais bien la discussion.

    J'ai enroulé le open dans du jambon (try/catch) et ça roule.

    Donc tout marche, par contre j'ai quand même une question : Comment ça se fait que je sois obligé de désactiver la fonction asynchrone ? (mettre le 3ème argument de open à false)

  12. #12
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    A ta place ce que je ferai:
    1/ Déclencher un timeout au lancement de la requete
    2/ Quand le timeout expire, tester la valeur du readyState. Les valeurs correspondant à :
    * 0 : non initialisé
    * 1 : ouverture du transfert
    * 2 : données envoyées
    * 3 : les données arrivent
    * 4 : données arrivées
    Si tu n'as pas de connexion, tu ne devrais pas aller plus loin que 1 (ou 2 je sais pas trop, a tester), donc a ce moment tu peux considérer que l'utilisateur n'a pas de connection. Sinon, tu laisses continuer, c'est que la requete prend du temps mais que l'utilisateur est quand meme connecté.

Discussions similaires

  1. [AJAX] Permission refusée d'utiliser la méthode open
    Par DaSoul dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/11/2006, 07h34
  2. [AJAX] Méthode jamais appelée sous IE
    Par Mister Nono dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 29/09/2006, 16h19
  3. [AJAX] Concaténer 2 objets HttpRequest
    Par Braz dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/06/2006, 14h45
  4. méthode Open : temps de réponse
    Par olivierlsf dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/11/2005, 15h32
  5. [ADO] Méthode open échoue
    Par Odulo dans le forum Access
    Réponses: 3
    Dernier message: 03/10/2005, 09h24

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