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 :

Un message à la fermeture de la fenêtre


Sujet :

JavaScript

  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Un message à la fermeture de la fenêtre
    Bonjour à tous,

    Dans une interface administration privée, je souhaite, pour des mesures de sécurité, forcer à cliquer un lien "sortie" qui tuerait la session PHP plutôt que la croix de fermeture du navigateur. J'ai écrit la petite fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function avert_fermeture()
    {
    if(confirm('Avez-vous pensé à cliquer sur le bouton \"Sortie\" pour vous déconnecter de votre interface Administration ? Le fait de laisser votre session active constitue une faille de sécurité pour d\'éventuels hackers.')){
    	window.close();
    }else{
    	return false;
    }
    }
     
    window.onbeforeunload = function (){avert_fermeture()};
    Le message s'affiche bien, mais le navigateur se ferme quelque soit le choix que l'on clique. Mais est ce que c'est possible ?
    Où le choix du user est prioritaire quoi que l'on fasse ?

    Merci d'avance de vos lumières.

  2. #2
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Précision : je vois cette fonction sur le web :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <script type="text/javascript">
      window.onbeforeunload = function(e){ return 'Avez-vous pensé à cliquer sur le bouton \"Sortie\" pour vous déconnecter de votre interface Administration ? Le fait de laisser votre session active constitue une faille de sécurité pour d\'éventuels hackers...'; } 
    </script>
    Mais elle se déclenche à chaque clic sur un lien interne ce qui n'est pas le but. Je voudrais que ce soit vraiment à le fermeture du navigateur...

  3. #3
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Dans une interface administration privée
    Je comprends bien pourquoi tu apportes cette précision, cependant il n'existe pas de version de JavaScript spécifique aux interfaces d'administration donc d'une part, il semble évident qu'il ne doit pas être possible d'empêcher de quitter une page et encore moins de d'empêcher de fermer le navigateur, d'autre part, il est malgré tout possible de demander à l'utilisateur s'il veut vraiment quitter la page (un simple onbeforeunload = return false suffit) mais JavaScript est incapable de savoir si tu continues à naviguer sur le même site ou non.
    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

  4. #4
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Merci de ta précision.
    Effectivement, il ne s'agit en aucun cas de forcer qui que ce soit à rester sur une page. C'est privé.

    J'ai essayé le unbeforeunload, mais il se produit à chaque clic sur un lien interne au cours de la navigation au sein de l'interface admin, ce qui est un peu pénible... Il n'est pas possible de le déclencher uniquement à la fermeture du navigateur (la vraie "sortie") ? car le but est de faire en sorte qu'il clique sur un lien de sortie pour détruire la session.

  5. #5
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Une solution pourrait être de spécifier un nom de classe spécifique pour les liens autorisés (par exemple "lienOK") puis de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    window.onload = function(){
        window.onbeforeunload = function(){return false};
        var tempLiens = document.getElementsByTagName('a'), nbLiens = tempLiens.length;
        for(var i=0; i<nbLiens; i++){
            if(templiens[i].className == 'lienOK'){
                tempLiens[i].onclick = function(){window.onbeforeunload = function{return true;}}
            }
        }
    }
    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

  6. #6
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Oui...je pense que cette idée est bonne !
    Il y avait quelques bugs de syntaxe dans la console FF, j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <script type="text/javascript">
    window.onload = function(){
        window.onbeforeunload = function(){return 'Avez-vous pensé à cliquer sur le bouton \"Sortie\" pour vous déconnecter de votre interface Administration ? Le fait de laisser votre session active constitue une faille de sécurité pour d\'éventuels hackers...'};
        var tempLiens = document.getElementsByTagName('a'), nbLiens = tempLiens.length;
        for(var i=0; i<nbLiens; i++){
            if(tempLiens[i].className == 'lienMenu'){
                tempLiens[i].onclick = function(){window.onbeforeunload = function(){return true;}}
            }
        }
    }
    </script>
    Mais là, problème : non seulement mon message d'alerte ne s'affiche pas, mais il ne tient pas compte de l'exception et se déclenche sur les liens même si leur classe est "lienMenu".

  7. #7
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Attention !
    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.onbeforeunload = function(){return 'Avez-vous pensé à cliquer sur le bouton \"Sortie\" pour vous déconnecter de votre interface Administration ? Le fait de laisser votre session active constitue une faille de sécurité pour d\'éventuels hackers...'};
    Cela n'a aucun effet.
    Le fait de renvoyer false sur onbeforeunload génère un message de demande de confirmation. Ce message ne peut pas être modifié et c'est le seul moyen d'empêcher de sortir de la page.
    Sinon, pour annuler le onbeforeunload, ça m'étonne un peu, mais essaye peut-être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tempLiens[i].onclick = function(){window.onbeforeunload = null;}
    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

  8. #8
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Non, effectivement... c'est pareil : chaque lien cliqué provoque le msg, même si sa classe est définie dans la fonction js.

  9. #9
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Bonjour,

    à mon avis,le passage à l'autre site doit se faire avant le onclick...
    Il faudrait donc faire une navigation par le biais de javascript et non "classique",ce qui nous laisserait le temps de désactiver le message

  10. #10
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Citation Envoyé par supersnail Voir le message
    Bonjour,

    à mon avis,le passage à l'autre site doit se faire avant le onclick...
    Il faudrait donc faire une navigation par le biais de javascript et non "classique",ce qui nous laisserait le temps de désactiver le message
    Bonsoir,

    Humm...ça c'est pas gagné et me ferait restructurer beaucoup de choses...
    Mais je pense à un truc (peut-être débile, m'enfin...) :

    Existe-t-il un objet qui considère la fenêtre entière du navigateur, croix de fermeture incluse ? Si oui, ne serait-il pas possible, avec les offsets, de créer un genre de "zone réactive" qui pourrait générer un confirm() au passage souris ?


  11. #11
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ca m'étonne, car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    window.onload = function(){
        window.onbeforeunload = function(){return 'Avez-vous pensé à cliquer sur le bouton \"Sortie\" pour vous déconnecter de votre interface Administration ? Le fait de laisser votre session active constitue une faille de sécurité pour d\'éventuels hackers...'};
        var tempLiens = document.getElementsByTagName('a'), nbLiens = tempLiens.length;
        for(var i=0; i<nbLiens; i++){
            tempLiens[i].onclick = function(){window.onbeforeunload = null;}
        }
    }
    fonctionne bien sur FF

    Concernant la solution que tu proposais, ce n'est pas possible, l'interface du navigateur est un programme exécuté par l'OS du poste client, heureusement que JavaScript n'y a pas accès !
    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

  12. #12
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut


    Non seulement ça fonctionne impec sur FF, mais également sur IE !
    Alors là, bravo, Monsieur l'Administrateur / Rédacteur / Responsable et chapeau bas !

    Même pas besoin de spécifier de classe de lien. C'est top.
    Je te remercie beaucoup et bonne soirée.

  13. #13
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    Monsieur l'Administrateur / Rédacteur / Responsable et chapeau bas !
    Non, pas Administrateur
    Mais sinon merci
    Même pas besoin de spécifier de classe de lien. C'est top.
    Je te remercie beaucoup et bonne soirée.
    En fait, j'avais prévu cette option au cas où tu aies des liens dans ton admin qui fassent sortir de l'interface et donc qui devraient être traités comme une fermeture de la page.
    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

  14. #14
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour à tous,


    je me permets de rouvrir ce post, car je voudrais ajouter d'autres exceptions à la balise <a> pour que le warning ne se déclenche pas :

    - La validation d'un formulaire.
    - Un reload ou un window.location.href JS, sur un select, par exemple.

    Est-ce possible ?
    Faut-il que j'incrémente la var nbliens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var tempLiens = document.getElementsByTagName('a');
    var tempLiens += document.getElementsByTagName('Submit');
    ...etc...
    nbLiens = tempLiens.length;
    Merci de votre patience...

  15. #15
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Non, tu ne peux pas faire comme ça, déjà parce qu'il n'existe pas de dalise <submit> en HTML mais surtout parce que les méthodes getElementsBy renvoient des collections, c'est-à-dire au sens de JavaScript, des objets Object, or il n'existe pas de méthode native pour fusionner deux objets.
    Le plus simple serait selon moi de récupérer les input et les filtrer en fonction de leur type.
    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

  16. #16
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Hello, merci d'être encore là.
    Oui, oup's par "Submit" je voulais dire "<form>"


    Le plus simple serait selon moi de récupérer les input et les filtrer en fonction de leur type.
    Humm... j'ai bien peur que "le plus simple pour toi" ne devienne une effroyable usine à gaz pour moi...
    Peux-tu me donner un exemple de ce "filtrage" ?

  17. #17
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        var textboxes = document.getElementsByTagName("input");
        for(i=0;i<textboxes.length;i++)
        {
                if(textboxes[i].type == 'submit')  
                {
                     //ce qu'il y a à faire
                }
        }
    par exemple

  18. #18
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Euh... une dernière question car un truc m'étonne :


    Comment se fait-il que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
     
    	for(var i=0; i<nbLiens; i++){
            tempLiens[i].onclick = function(){window.onbeforeunload = null;}
        }
    rende inopérant les liens d'ouverture de popup ?

  19. #19
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Parce qu'affecter le onclick comme ça écrase les événements déjà présents...
    Essaye avec des fonctions (fais une recherche dessus) du type addEvent ou éventuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var tempEvent;
    for(var i=0; i<nbLiens; i++){
        tempEvent = tempLiens[i].onclick;
        tempLiens[i].onclick = function(){
            tempEvent();
            window.onbeforeunload = null;
        }
    }
    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

  20. #20
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour,

    Je viens de regarder du côté de ces fonctions addEventListener et attachEvent, qui déjà n'ont pas le même comportement avec IE et FF, mais bon...ça dépasse mes compétences même si j'ai bien compris à quoi elles servent - assigner un évènement à un objet JS - je ne vois pas comment les adapter à ce cas précis...
    Dommage.

Discussions similaires

  1. Message d'erreur à la fermeture d'une fenêtre
    Par Pascal Lob dans le forum VB.NET
    Réponses: 5
    Dernier message: 16/11/2011, 11h20
  2. Exécuter une action à la fermeture d'une fenêtre
    Par wwave dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 28/07/2005, 15h15
  3. Fermeture d'une fenêtre .dos
    Par VirginieGE dans le forum Windows
    Réponses: 2
    Dernier message: 03/06/2005, 13h56
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 14h08

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