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] Bouclage sur readyState : provoque erreur du Navigateur (script ne répond plus)


Sujet :

AJAX

  1. #1
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut [AJAX] Bouclage sur readyState : provoque erreur du Navigateur (script ne répond plus)
    Bonjour,

    J'ai les 2 actions suivantes :

    (1) Ajax: Sélection (JS) qui ouvre vers un traitement (php)
    (2) JS : Téléchargement si (readyState(action1) = 4) => window.open(url de mon download)

    Dans (2) je boucle dans une fonction sur readyState(action1) et j'y reste tant que readyState < 3 (pour anticiper un peu).

    Tout fonctionne bien sauf que :
    Quand le client lance 2 requêtes AJAX consécutives, son navigateur interprète la boucle comme une erreur potentielle du JS et jette un beau "Un script sur cette page est peut-être occupé ou ne répond plus", du fait du while dans le 3eme code ci-dessous (en bold red).

    => La question est :
    - Peut on éviter ce message en forçant l'exécution (comment..) ?
    ou bien
    - faut il mettre une condition de sortie bidon du while pour faire plaisir au navigateur ?
    ou encore
    - traiter le cas aussi par une requête Ajax (ce qui me pose problème car ma page de download ne s'ouvre évidemment pas dans ce cas)
    ou enfin :
    - En cas de 2 requêtes Ajax consécutives, annuler la première ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Download() {
    	PopUp('https://www/mondomain/pop_download.html', 'open', 'test', '200', '200', 'left', 'center', '6000', false);
    	Sleep(1000);
    	CheckSelectStatus();
    	if (globale_js4) var newWindow = window.open( globale_js4 ) ;
    	else		 alert ('Téléchargement non réalisé'); 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function Sleep(timeout_ms) {
    setTimeout("Sleep()", timeout_ms);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function CheckSelectStatus() {
    	var timeout = ( select_request.readyState == 0) ? 2000 : ( select_request.readyState == 1) ? 1000 : 500 ;
    	
    	// Boucle d'attente de la réception server:
    	while ( select_request.readyState < 3 ) {
    		setTimeout("CheckSelectStatus()", timeout);
    	}
    }

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Salut !
    Y a-t-il une raison particulière à vouloir s'acharner ainsi à ne pas utiliser la propriété onreadtstatechange ?
    Parce que là, à vouloir réinventer la roue, tu entres dans plusieurs erreurs de conception qui surchargent la mémoire
    Tout d'abord, ta fonction Sleep() ne sert absolument à rien, un setTimeout ne bloquant pas l'exécution du reste du script et tu génères un (étant un grand optimiste, je me persuade que tu n'appelles cette fonction qu'une fois...) timer inutile et infini...
    Concernant ton while...
    Plutôt qu'un long discours, je te propose juste d'incrémenter un compteur pour t'imaginer du nombre de fois ou tu passes dans la boucle et donc le nombre de nouveaux timers inutiles que tu déclenches... pour au final ne rien faire quand le readyState arrive à 4
    Je pense que tu gagneras beaucoup en productivité avec classique onreadystatechange.
    Je te donnerais bien un exemple de code adapté, mais je n'ai absolument rien compris à ce que tu essayes de faire...

    EDIT :
    Ah si, avec un peu d'imagination
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function Download() {
        PopUp('https://www/mondomain/pop_download.html', 'open', 'test', '200', '200', 'left', 'center', '6000', false);
        select_request.onreadystatechange = function(){
            if (select_request.readyState==4){
                if(select_request.status==200){var newWindow = window.open( globale_js4 ) ;}
                else{alert ('Téléchargement non réalisé');}
            }
        } 
    }
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    La raison est que j'avais crée unn fonction de requete Ajax appelées par différentes autres fonctions. Mais ça n'est pas justifié. Donc j'ai tout recodé avec une logique plus "Ajax" (trop marqué php que je suis..).

    Et merci, je suis finalement arrivé ... au même code.

    Donc félicitations pour avoir joué à Madame Soleil en décodant mes explications pas très claires.

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

Discussions similaires

  1. Que faire lorsque votre navigateur internet ne répond plus ?
    Par Stéphane le calme dans le forum Google Chrome
    Réponses: 45
    Dernier message: 11/12/2014, 17h29
  2. Requete paramétrée sur vue provoque erreur incompréhensible
    Par Arnaud B. dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 20/02/2011, 16h47
  3. Réponses: 0
    Dernier message: 25/02/2010, 16h57
  4. Réponses: 4
    Dernier message: 09/07/2009, 15h23
  5. [AJAX] requête sur fichier.xml => erreur 405 sous IE !
    Par jeje13009 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 26/03/2007, 21h42

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