web-dev-qa-db-fra.com

window.onunload ne fonctionne pas correctement dans le navigateur Chrome. Quelqu'un peut-il m'aider?

J'ai écrit ce code 

function winUnload() {
    alert("Unload Window");
    MyMethod();
}

window.onunload = function() { winUnload(); }

Ce code fonctionne bien dans IE et Firefox. Mais ce code ne fonctionne pas dans Chrome. Les deux déclarations alert("Unload Window"); et MyMethod(); ne fonctionnent pas.

31
Imran

Certaines actions ne fonctionnent pas en chrome, à l'intérieur de l'événement unload. Les boîtes d’alerte ou de confirmation sont telles.

Mais ce qui est possible (autant que je sache):

  1. Ouvrez les popups (avec window.open) - mais cela ne fonctionnera que si le bloqueur de popup est désactivé pour votre site
  2. Renvoie une simple chaîne (dans l'événement beforeunload), qui déclenche une boîte de confirmation, qui demande à l'utilisateur s'il souhaite quitter la page.

Exemple pour # 2:

$(window).on('beforeunload', function() {
    return 'Your own message goes here...';
});

Démo: http://jsfiddle.net/PQz5k/

52
Armin

Je sais que c'est vieux, mais j'ai trouvé le moyen de faire fonctionner décharger avec Chrome

window.onbeforeunload = function () {
  myFunction();
};
6
Carlos

La réponse d'Armin est tellement utile, merci. N ° 2 est le plus important à savoir lorsque vous essayez de configurer des événements de déchargement qui fonctionnent dans la plupart des navigateurs: vous ne pouvez pas alert () ou confirmer (), mais le renvoi d'une chaîne générera une confirmation modale.

Mais j’ai constaté que même si je ne faisais que renvoyer une chaîne, je rencontrais des problèmes de navigation entre navigateurs spécifiques à Mootools (avec la version 1.4.5 dans cet exemple). Cette implémentation spécifique à Mootools a bien fonctionné dans Firefox, mais n'a pas abouti à une fenêtre de confirmation dans Chrome ou Safari: 

window.addEvent("beforeunload", function() {
    return "Are you sure you want to leave this page?";
});

Donc, pour que mon événement onbeforeonload fonctionne sur plusieurs navigateurs, je devais utiliser l'appel natif JavaScript: 

window.onbeforeunload = function() {
    return "Are you sure you want to leave this page?";
}

Vous ne savez pas pourquoi, ou si cela a été corrigé dans les versions ultérieures de Mootools.

5
Tracy

Vous pouvez essayer d’utiliser l’événement pagehide pour Chrome and Safari.

Vérifiez ces liens:

Comment détecter le support de navigateur pour pageShow et pageHide?

http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

3
Leonardo Calzavara

Veuillez essayer window.onbeforeunload à la place de window.onunload pour chrome . Vous pouvez également appeler onbeforeunload à partir de la balise body>, qui pourrait fonctionner en chrome.

Cependant, nous avons un problème avec la fonction de déchargement dans le navigateur chrome . Veuillez vérifier

location.href ne fonctionne pas en chrome lorsqu'il est appelé via l'événement body/window unload

Merci, Nived

3
Nivedittan

L'événement onunload ne se déclenchera pas s'il ne s'est pas déclenché. Malheureusement, l'événement onload attend que tout le contenu binaire (images, par exemple) soit chargé, et les scripts en ligne exécutés avant l'événement onload se déclenche. DOMContentLoaded se déclenche lorsque la page est visible, avant que le chargement ne le soit. Et il est maintenant standard en HTML 5 , et vous pouvez tester la prise en charge du navigateur mais notez que cela nécessite le <!DOCTYPE html> (au moins sous Chrome). Cependant, je ne trouve pas d’événement correspondant au déchargement du DOM. Et un tel événement hypothétique risque de ne pas fonctionner car certains navigateurs peuvent conserver le DOM pour exécuter la fonctionnalité "onglet de restauration".

La seule solution potentielle que j'ai trouvée jusqu'à présent est la Page Visibility API , qui semble nécessiter le <!DOCTYPE html>.

1
Shelby Moore III

Cela marche : 

var unloadEvent = function (e) {
    var confirmationMessage = "Warning: Leaving this page will result in any unsaved data being lost. Are you sure you wish to continue?";
    (e || window.event).returnValue = confirmationMessage; //Gecko + IE
    return confirmationMessage; //Webkit, Safari, Chrome etc.
};
window.addEventListener("beforeunload", unloadEvent);
1
Amulya Kashyap