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] Requête Ajax lors de la fermeture d'une pop up


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Points : 3
    Points
    3
    Par défaut [AJAX] Requête Ajax lors de la fermeture d'une pop up
    Bonjour, j'ai un petit souci Ajax.

    Je suis en train de créer un jeu, comme beaucoup d'autres, et j'y mets en place une taverne, un lieu de discussion. Je développe en php, mysql et ajax. On accède à la taverne par un pop up et tout fonctionne à peu près correctement jusqu'au moment du départ. Lors du départ, j'ai mis en place une requête ajax pour que la personne qui part soit retirée des présents dans la taverne de la base de données mais si ça fonctionne sous IE et Mozilla, ça ne fonctionne pas sous Safari. Je pensais jusqu'ici que Safari ne reconnaissait pas le onbeforeunload mis dans mon body, mais en fait si... Par contre, il n'exécute a priori pas la requête Ajax. De plus, j'ai constaté sur le serveur free (j'y teste mon jeu en grandeur réelle) qu'après la sortie de la taverne, le serveur était dans les choux.

    Je me pose donc les questions suivantes : peut-on lancer une requête ajax lors de la sortie d'une pop up, avec Safari ? Que se passe-t-il si la requête n'est pas encore terminée et que le pop up est déjà fermé ? Et est-cela qui pose problème sous free, beaucoup plus lent que chez moi ?


    Pour info, voici mon code, enfin, la partie intéressante :

    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
    <script type="text/javascript" >
    function quitter() {
    		     new Ajax.Request('supprimerpresence.php', 
    			     {method : 'POST', 
    			      postBody : ''});		  
    		  }
    </script>
     
     
    <body onLoad='historique(); presents();' onbeforeunload='quitter();' >
       <form method="post" action="taverne.php" onsubmit="return ajoutmessage(<?php echo "'" . $_SESSION['pseudo'] . "'"; ?>, document.getElementById('message').value);">		 
     
           <p> <input type="text" name="message" id="message" value=""> 
                 <input type='submit' name='envoyer' value='envoyer' /> 
           </p>
     
       </form>
    Merci pour votre aide.

  2. #2
    Membre du Club Avatar de knoxville
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 61
    Points
    61
    Par défaut
    Salut,
    A priori tu dois pouvoir lancer ton AJAX avec la fonction onbeforeunload(), une pop-up c'est rien de moins qu'une fenêtre de ton navigateur redimensionné.
    A mon avis c'est un problème d'objet XMLHttpRequest. Il me semble tout de même que l'ajax pose quelques souci à safari, cependant essai ce 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
    <script type="text/javascript">
     
    var xhr = false;
     
    if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
    }
    else {
    if (window.ActiveXObject) {
    try {
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e) { }
    }
     
    function makerequest(serverPage, objID){
    var obj = document.getElementById(objID);
     
    xhr.onreadystatechange = function() {
    if (xhr.readystate == 4 && xhr.status == 200){
    obj.innerHTML = xhr.responseText;
    }
    else {
    obj.innerHTML = "There was a problem with the request " + xhr.status;
    }
    }
     
    xhr.open("GET", serverPage, true);
    xhr.send(null);
    }
     
    </script>
    http://blog.van-proosdij.fr/2006/10/...-ajax-ma-tuer/

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Merci Knoxville.

    Excuse moi mais avec un tel code, je ne ferme pas ma pop up puisque j'affiche un résultat et si le but de la manoeuvre est, comme je le pense, de tester que la requête fonctionne avec Safari en dehors de la fermeture de la pop up, j'ai déjà essayé et elle fonctionne très bien.

    Si je me trompe, peux-tu m'expliquer le but de la manoeuvre ? J'avoue ne pas connaitre l'objet XMLHttpRequest. Je suis allée à la facilité en utilisant prototype, beaucoup plus simple à appréhender.

  4. #4
    Membre du Club Avatar de knoxville
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 61
    Points
    61
    Par défaut
    Oui effectivement le but de mon code était de tester l'exécution correcte du code AJAX, et ce code tu peux le tester lors de la fermeture de ta pop-up.
    En réalité ce code représente un exemple de moteur AJAX, cependant ces lignes sont absolument indispensables si tu veux que ton code fonctionne sur tous les navigateurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
    }
    else {
    if (window.ActiveXObject) {
    try {
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e) { }
    }
    Remplace cette ligne xhr.open("GET", serverPage, true); par
    xhr.open("GET", 'tonscriptatoi.php', true);

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Je ne voudrais pas paraitre désobligeante mais est-ce que prototype ne gère pas le cas de tous les navigateurs ? Le code que tu me proposes revient à abandonner prototype. Je vais essayer mais il va me falloir beaucoup de temps pour le mettre en place, vu que je ne connais rien en dehors de prototype.

    En fait, j'ai pensé à une solution alternative. Je vais tester les deux et je te dirai.

    Merci

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Ah, j'ai trouvé, à moins que mon anglais ne soit encore plus déplorable que je ne le pensais... C'est un bug Safari ou plutôt une volonté Safari d'empêcher les requêtes lors de la fermeture d'une page, allez savoir pourquoi. Voici le lien que j'ai trouvé.

    https://bugs.webkit.org/show_bug.cgi?id=19922

    Comme tu le disais Knoxville, Safari a quelques soucis avec ajax.

    Quelqu'un aurait une idée de parade, sachant qu'on ne peut pas empêcher un utilisateur de fermer une fenêtre par la petite croix ? Beaucoup de gens utilisent Safari ?

  7. #7
    Membre expérimenté
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Points : 1 316
    Points
    1 316
    Billets dans le blog
    1
    Par défaut
    Yop!

    Quelqu'un aurait une idée de parade, sachant qu'on ne peut pas empêcher un utilisateur de fermer une fenêtre par la petite croix ?
    Une idée , oui, mais je ne sais pas si elle est réalisable.

    Utiliser l'évènement onClick du popup (voir si cet évènement est appelé si on clique sur la croix de fermeture) pour exécuter une fonction définie dans l'opener (ce doit être possible, il me semble avoir vu passer une discussion à ce sujet).

    Cette fonction teste l'existence de la fenêtre popup (qui doit donc avoir un nom), il sera peut-être nécessaire de temporiser légèrement la fonction.

    Si la fenêtre popup n'existe plus, mettre à jour la base de donnée.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Je vais chercher dans ce sens. Merci, Ryan. On vient aussi de me proposer de vérifier côté serveur si je continuais de recevoir des periodicalupdater de la part des personnes présentes dans la taverne. Si plus de periodicalupdater, c'est que la personne n'est plus présente en taverne. Il me faudrait juste un script qui passe régulièrement. Je vais voir les deux possibilités. Merci.

Discussions similaires

  1. [AJAX] Requête ajax par un seul ou plusieurs fichiers ?
    Par codefalse dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/10/2008, 15h25
  2. [AJAX] requète AJAX en boucle
    Par Emcy dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/04/2008, 11h30
  3. [AJAX] InlineMod - Ajax - Requêtes PHP-MySQL
    Par funkyy dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/04/2008, 17h17
  4. perte de mes données lors de la fermeture d'une pop up
    Par paolo2002 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 09/04/2008, 09h32
  5. perte de mes données lors de la fermeture d'une pop up
    Par paolo2002 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/04/2008, 11h54

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