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] Arrêter une requete xhtmlrequest


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 88
    Points : 44
    Points
    44
    Par défaut [AJAX] Arrêter une requete xhtmlrequest
    Bonjour,

    J'ai cherché un peu partout et malheureusement je n'ai pas trouvé mon bonheur.
    Je voudrai stopper une requete si elle dépasse un délai de x secondes.

    j'ai testé la méthode abort() mais elle ne marche pas sur tous les navigateurs et ne m'affiche pas ce que je veux.

    Si quelqu'un a des infos sur ce sujet.
    Merci car là je suis bloqué.

  2. #2
    Membre actif Avatar de Ikonic
    Inscrit en
    Février 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 197
    Points : 202
    Points
    202
    Par défaut
    Salut,

    Je cherche aussi depuis un an...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 88
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Ikonic Voir le message
    Salut,

    Je cherche aussi depuis un an...
    ça me rassure pas ce que tu me dis la

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    Citation Envoyé par watchabongo Voir le message
    j'ai testé la méthode abort() mais elle ne marche pas sur tous les navigateurs et ne m'affiche pas ce que je veux.
    peux-tu préciser (vu que ça devrait être la bonne méthode) ?
    Avec quel navigateur ne fonctionne-t-elle pas ?
    Comment l'utilises-tu ?
    Qu'est-ce que tu voudrais qu'elle t'affiche, si la requête est interrompue ?

    A+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 88
    Points : 44
    Points
    44
    Par défaut
    Donc déjà voila mon code :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <script type="text/javascript">
     
        function makeRequest(url) {
     
            var xhr = false;
     
            if (window.XMLHttpRequest) { // Mozilla, Safari,...
                xhr = new XMLHttpRequest();
                if (xhr.overrideMimeType) {
                    xhr.overrideMimeType('text/xml');
                    // Voir la note ci-dessous à propos de cette ligne
                }
            }
            else if (window.ActiveXObject) { // IE
                try {
                    xhr = new ActiveXObject("Msxml2.XMLHTTP");
                }
                catch (e) {
                    try {
                        xhr = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    catch (e) {}
                }
            }
     
            if (!xhr) {
                alert('Abandon :( Impossible de créer une instance XMLHTTP');
                return false;
            }
     
     
    		xhr.onreadystatechange = function() { alertContents(xhr); };
            xhr.open('GET', url, true);
    		xhr.send(null);
    		setTimeout(abortRequest, 10000);
     
     
    // on annule la requete après 10 secondes
    function abortRequest() {
     
    		var content = document.getElementById('ShareContent');
    		//si la requete n'est pas terminée
    		if (xhr.readyState != 4) {
    			//on affiche le message d'erreur
    			content.innerHTML = 'Le serveur ne répond pas, il est trop lent';  
    			//on crash la requete
    			xhr.abort();
    		}
    } 	
     
        }
     
        function alertContents(xhr) {
     
    		var content = document.getElementById('ShareContent');
     
    		if(xhr.readyState == 1){
    			content.innerHTML = '<img src="loading.gif">';
    		}
     
    		if (xhr.readyState == 4) {
                if (xhr.status == 200) {
                   content.innerHTML = xhr.responseText;
                } 
    			else if (xhr.status == 404) {
    				content.innerHTML = 'Le fichier n\'existe pas.';
    			}
    			else if (xhr.status == 500) {
    				content.innerHTML = 'Erreur interne du serveur.';
    			}
    			else {
    				content.innerHTML = 'Un problème est survenu avec la requête.';
    			}
            }
     
        }
     
    </script>
    Ensuite voila les différentes choses que j'obtiens :
    Sur Firefox :
    erreur JS:
    [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://url/tests/cours/vraicours.html :: alertContents :: line 64" data: no]
    [Break on this error] if (xhr.status == 200) {

    Sur IE 7 :
    affichage de ce message :
    Un problème est survenu avec la requête.

    Sur IE 6 :
    affichage de ce message :
    Un problème est survenu avec la requête.

    Pour Internet explorer, malheureusement je ne peux pas afficher pour savoir s'il y a des erreurs JS, mais bon ce n'est pas le message que je souhaite obtenir. Je souhaite avoir "Le serveur ne répond pas, il est trop lent".

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Tu fais appel à l'objet xhr dans plusieurs fonctions.
    Or il est déclaré en variable locale dans makeRequest(url) et ne doit donc être "visible" que dans cette fonction.
    As-tu essayé de passer en global ?

    Ca devrait résoudre certains des problèmes ...

    A+

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 88
    Points : 44
    Points
    44
    Par défaut
    C'est sûrement une bonne idée E.Bzz
    malheureusement je n'arrive pas à la mettre en pratique, j'essaye de passer xhr en paramètre, marche pas. Je ne vois pas trop comment la passer en paramètre.

    Si tu peux m'aider, merci d'avance.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par watchabongo Voir le message
    C'est sûrement une bonne idée E.Bzz
    malheureusement je n'arrive pas à la mettre en pratique, j'essaye de passer xhr en paramètre, marche pas. Je ne vois pas trop comment la passer en paramètre.
    En globale, pas en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <script type="text/javascript">
     
        var xhr = false;
     
        function makeRequest(url) {
     
            if (window.XMLHttpRequest) { // Mozilla, Safari,...
                xhr = new XMLHttpRequest();
    .....
    Comme elle est visible de partout, plus besoin de la passer en paramètre ...

    A+

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 88
    Points : 44
    Points
    44
    Par défaut
    Oui j'avais testé ça, malheureusement j'ai toujours l'erreur :

    Sur Firefox :
    [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://url/tests/cours/vraicours.html :: alertContents :: line 61" data: no]
    [Break on this error] if (xhr.status == 200) {

    En fait ce qui est byzarre c'est qu'après qu'on est stopper la requette, son état passe à 4.

    j'ai tenté de mettre un booléen mais du coup ça crée aussi des erreurs

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Tu as essayé de mettre le contenu de la fonction alertContents() directement dans onreadystatechange() ?

    A+

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 88
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par E.Bzz Voir le message
    Tu as essayé de mettre le contenu de la fonction alertContents() directement dans onreadystatechange() ?

    A+
    je viens de le passer et j'ai toujours la même erreur JS :

    [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://url/tests/cours/vraicours.html :: anonymous :: line 41" data: no]
    [Break on this error] if (xhr.status == 200) {

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    La page que tu appelles est bien sur le même domaine ?

    Sinon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		if (xhr.readyState == 4) {
                alert(xhr.status);
    ...
    donne quoi ?

    A+

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 88
    Points : 44
    Points
    44
    Par défaut
    En fait j'ai une page qui récupère le contenu sur un autre domaine (donc sans ajax)

    Et ensuite j'attaque ce fichier sur mon domaine en ajax, pour gérer des cas d'erreurs. Et je souhaiterai pouvoir gérer le cas ou le fichier met trop longtemps à répondre.

    200 quand tout va bien

    et rien pour mon fichier qui est trop lent à répondre.
    mon fichier Asp qui est trop lent à répondre et que j'appelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <% 
    maintenant = now()
    while dateadd("s", 30, maintenant) > now()
    wend
    response.write "10 secondes plus tard"
    %>

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Essaye d'enlever
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	var content = document.getElementById('ShareContent');
     
    		if(xhr.readyState == 1){
    			content.innerHTML = '<img src="loading.gif">';
    		}
    J'ai lu qu'il y avait des problèmes avec les messages d'attentes (je les gère hors fonction Ajax).

    Trouvé aussi ça:
    This happens when you have a XMLHttpRequest onerror handler in which you tried to read the result's status (or statusText) when that value is not available, usually meaning it was broken off, or it failed in a specific way.
    En gros : il fat pas essayer de lire le status en cas d'erreur

    A+

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 88
    Points : 44
    Points
    44
    Par défaut
    Bah j'ai testé ça ne change pas
    toujours pareil.

    En tout cas merci de m'aider.

  16. #16
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    hello tout le monde,

    moi aussi j'ai le problème

    essaies ça (il faut que xhr soit défini en globale)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // on annule la requete après 10 secondes
    function abortRequest() {
     
    		var content = document.getElementById('ShareContent');
    		//si la requete n'est pas terminée
    		if (xhr.readyState != 4) {
    			//on affiche le message d'erreur
    			content.innerHTML = 'Le serveur ne répond pas, il est trop lent';  
    			//on crash la requete
                            xhr.onreadystatechange = null;
    			xhr.abort();
    		}
    }
    => en fait, je crois que le problème vient que lorsqu'on fait un xhr.abort();, ça lance la fonction défini par onreadystatechange

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/02/2015, 22h10
  2. [AJAX] Recharger une requete SQL via lien<a href>
    Par pinkdev dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/06/2007, 13h30
  3. [AJAX] Requete ajax sur une meme page php
    Par Bownobo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/06/2007, 11h25
  4. [AJAX] deux requetes ajax dans une même page
    Par mitmit dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/05/2007, 12h52
  5. champs qui s'efface lors d'une requete ajax.
    Par starr dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2006, 08h33

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