2008-09-26 9 views
12

Je souhaite déclencher un événement lorsqu'une fenêtre contextuelle est fermée, ou de préférence juste avant la fermeture. Je stocke l'objet de la fenêtre contextuelle en tant qu'objet, mais je ne connais aucun moyen de lier l'événement close ou un événement juste avant la fermeture de la fenêtre.Comment est-ce que je soulèverais un événement (jQuery ou vanilla Javascript) quand une fenêtre de popup est fermée?

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780"); 

Y at-il un moyen de s'abonner à l'événement close en utilisant jQuery, ou juste javascript brut? J'utilise jQuery et je ne peux pas ajouter une autre bibliothèque, donc si cela ne peut pas être fait dans jQuery, je vais devoir lancer mon propre système d'événements pour qu'il fonctionne dans tous les navigateurs.

MISE À JOUR:
J'ai essayé d'utiliser l'événement unload dans jQuery et pour une raison quelconque l'événement est déclenché dès que mon pop-up ouvre au lieu de quand il est fermé. Si j'utilise Firebug pour définir un point d'arrêt pour retarder l'abonnement à l'événement de déchargement, l'événement unload fonctionne comme prévu, mais pour une raison quelconque, il ne fonctionne pas correctement lorsque le javascript est autorisé à s'exécuter naturellement.

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780"); 
$(popupWindow.window).unload(function() { alert('hello'); }); 

Quelqu'un a-t-il une idée de la raison pour laquelle l'événement de déchargement pourrait être déclenché lors du chargement de la fenêtre?

Un autre hic est que je l'ai remarqué que l'événement « unload » jQuery ne reste pas souscrit à la fenêtre comme il le fait normalement si je fais juste:

popupWindow.onunload = function(){alert('hello')}; 

Il semble se désabonner de l'événement tous les le temps il est levé. Est-ce censé se produire? S'il n'y avait pas ce bug (ou fonctionnalité?) Dans jQuery, il serait très bien que l'événement soit levé sur load puisque je peux vérifier la propriété popupWindow.closed à l'intérieur de l'événement pour m'assurer que la fenêtre était vraiment fermée.

Répondre

2

L'exemple de code jQuery pour l'événement unload

$(window).unload(function() { alert("Bye now!"); });

De l'jQuery unload documentation

Edit:

J'ai joué et n'a pas été en mesure d'obtenir le parent fenêtre pour être en mesure de définir le déchargement. La seule façon de le faire fonctionner était d'avoir le script présent dans la fenêtre popup html. La fenêtre contextuelle devait également charger jQuery. Je n'ai rien sur cette base, mais je crois que le déchargement est déclenché, parce que la fenêtre popup est en train d'être déchargée de la portée de la fenêtre parent. Juste une supposition.

0

Il y a une petite prise, je dois mentionner par rapport à la précédente mentions de onunload en fonction de mon expérience précédente:

Opera 9.0.x-9.2.x ne fonctionne que window.onunload si l'utilisateur quitte une page. Si l'utilisateur ferme à la place la fenêtre, l'événement ne se déclenchera jamais.Je suppose que cela a été fait pour lutter contre le problème de popup auto-rechargement (où une fenêtre contextuelle pourrait se rouvrir à la fermeture de la page).

Cela a probablement persisté à Opera 9.5.x. D'autres navigateurs peuvent également implémenter ceci, mais je ne crois pas IE ou Firefox faire.

0

D'après ce que j'ai vérifié, le déchargement de jQuery est juste un wrapper pour la fonction native. Je pourrais me tromper puisque je n'ai pas creusé aussi profondément.

Cet exemple a fonctionné pour moi.

$(document).ready(function(){ 
    $(window).unload(function(){ 
     alert('preget'); 
     $.get(
      '/some.php', 
      { request: 'some' } 
     ); 
     alert('postget'); 
    }); 
}); 

Rappelez-vous que certains browsers block the window.open requests on unload, IE for example.

18

J'ai créé un veilleur qui vérifie si la fenêtre a été fermée:

var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true); 
var watchClose = setInterval(function() { 
    if (w.closed) { 
    clearTimeout(watchClose); 
    //Do something here... 
    } 
}, 200); 
+0

Grand, ce a résolu mon problème;) –

7

J'ai essayé l'approche de veilleur, mais a couru dans la question « permission refusée » lors de l'utilisation dans IE6. Cela est dû à la propriété fermée de ne pas être entièrement accessible autour de l'événement de fermeture de la fenêtre ... mais heureusement avec une construction catch try {} cela fonctionne bien: o)

var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true); 

var watchClose = setInterval(function() { 
    try { 
     if (w.closed) { 
      clearTimeout(watchClose); 
      //Do something here... 
     } 
    } catch (e) {} 
}, 200); 

Merci magnus

3

Je pense que j'ai compris ce qui se passe:

Lorsque vous utilisez window.open, il ouvre une nouvelle fenêtre avec l'emplacement "about: blank", puis le modifie pour l'URL que vous avez fourni lors de l'appel de fonction. Ainsi, l'événement de déchargement est lié avant le passage de "about: blank" à l'URL de droite et est déclenché lorsque le changement se produit.

Je l'ai travailler avec JQuery faire:

$(function(){ 
    var win = window.open('http://url-at-same-domain.com','Test', 'width=600,height=500'); 
    $(win).unload(function(){ 
     if(this.location == 'about:blank') 
     { 
      $(this).unload(function(){ 
       // do something here 
      }); 
     } 
    }); 
}); 
Questions connexes