web-dev-qa-db-fra.com

window.onbeforeunload exécuté à l'actualisation de la page au lieu de à la fermeture de la page

J'utilise window.onbeforeunload pour ouvrir une boîte de dialogue de confirmation lorsqu'un événement de fermeture se produit, mais la boîte de dialogue de confirmation apparaît lors de l'actualisation de la page et ne s'exécute pas à la fermeture de la page.

Voici le code JavaScript:

<script language="JavaScript">
    window.onbeforeunload = confirmWinClose();
    function confirmWinClose() {
        var confirmClose = confirm('Close?');
        return confirmClose;
    }    
</script>

Je l'ai essayé sur Chrome, Firefox et Internet Explorer.

10
Java Player

PROBLÈME AVEC VOTRE CODE:

la fonction sera appelée lorsque vous refresh, car on refresh the page is unloaded and then reloaded.

dans votre solution, vous devez également noter que vous n'affectez pas une function à window.onbeforeunload mais que vous affectez le return value of the function lorsque vous écrivez

window.onbeforeunload = confirmWinClose();

qui peut également exécuter la fonction (en fonction de l'endroit où vous la placez dans le javascript) chaque fois que l'assignation est effectuée. Par exemple 

function confirmWinClose() {
var confirmClose = confirm('Close?');
return confirmClose;
}

window.onbeforeunload = confirmWinClose();

le code ci-dessus exécutera la fonction confirmWinClose chaque fois que ce js est chargé.

(pas votre cas car vous avez défini la fonction après l'appel, donc ne sera pas exécuté au chargement, mais vous devriez vous en souvenir)

SOLUTION:

la solution ci-dessous fonctionne pour close également

au lieu de votre solution, j'ai essayé ceci

JS:

window.onbeforeunload = function() {
    var confirmClose = confirm('Close?');
    return confirmClose;
}

ou 

 window.onbeforeunload = confirmWinClose; //note the absence of calling parantheses

    function confirmWinClose() {
        var confirmClose = confirm('Close?');
        return confirmClose;
    }

cela fonctionne comme prévu.

notez également que vous devriez explicitement ajouter return à partir de onbeforeunload

même si vous devez appeler une fonction, vous devriez faire

<script>
    window.onbeforeunload = function(e) {
       callSomeFunction();
       return null;
    };
</script>
5
gaurav5430

Pas de solution complète, mais vous pouvez intercepter la touche F5 (pas intercepté si l'utilisateur clique sur le bouton d'actualisation du navigateur ...)

var isRefresh = false;

// with jquery

$(function() {
  $(document).on("keydown", function(e) {
    if (e.which === 116)
    {
      isRefresh = true;
    }
  });
});

window.onbeforeunload = function() {
 if (! isRefresh)
 {
   return confirm ('Close ?');
 }
 return false;
};
3
Paul Rad

Essayez ceci cela fonctionnera. Vous affectiez la méthode à onload qui doit être exécutée lorsqu’il se produit, elle doit donc ressembler à objet. référencez le lien pour une meilleure explication - var functionName = function () {} vs function functionName () {}

 window.onbeforeunload = confirmWinClose;
 function confirmWinClose () {
 var confirmClose = confirm('Close?');
 return confirmClose;
 };
0
Neha

Puisque de toute façon vous ne voulez afficher que votre texte, qu’est-ce que l’utilisation de onbeforeunload comme il est attendu revient à renvoyer la chaîne?

<script language="JavaScript">
  window.onbeforeunload = confirmWinClose;
  function confirmWinClose() {return "close?";}
</script>
0
Daniel