2009-11-13 6 views
1

Je souhaite lier une fonction à l'événement beforeunload d'une fenêtre enfant en Javascript. J'ai le code suivant:window.onbeforeunload ne se déclenche pas dans la fenêtre enfant

newWind = window.open(settings.url, "Dialog", "width=" + settings.width + ",height=" + settings.height + ",resizable=" + settings.resizable + ",scrollbars=" + true); 

newWind.onunload = function() { alert('test'); } 

fonctionne très bien dans Firefox, mais échoue dans IE7. Quelqu'un peut-il voir ce que je fais mal?

+0

en fonction de votre titre, vouliez-vous dire à mettre newWind.onbeforeunload? Je considère également que définir onbeforeunload dans la page "settings.url" n'est pas une option? – scunliffe

Répondre

4
newWind.onunload = function() { alert('test'); } 

IE ne vous laissera pas attribuer une fonction d'un contexte de fenêtre sur le déchargement [avant] d'une autre fenêtre, pour une raison quelconque. Vous pouvez affecter une fonction étrangère à d'autres gestionnaires d'événements, y compris newWind.document.body.onunload, mais ce n'est pas une bonne idée. Tout d'abord parce que la récupération de place d'IE est basée sur des fenêtres, si vous fermez ou naviguez dans la fenêtre d'ouverture, la fenêtre contextuelle essaiera d'exécuter une fonction morte ou fonctionnera avec des variables inutilisées. Et d'autre part parce que vous ne savez pas à partir de l'ouvreur quand le document contextuel est suffisamment chargé pour pouvoir définir le gestionnaire. Au moment de l'appel open, le chargement du document n'a peut-être pas du tout démarré, auquel cas vous ne pouvez pas y définir un gestionnaire d'événements en toute sécurité. Vous aurez donc besoin d'un court délai avant de définir le gestionnaire onunload, et l'utilisateur pourrait fermer la fenêtre à ce moment-là. Et l'ouvreur ne sait pas combien de temps il faut attendre; à la place, le dialogue enfant devrait rappeler le parent pour lui dire qu'il est prêt. Mieux vaut que l'enfant pop-up se charge de recevoir ses propres événements et appelle le premier à le faire savoir à leur sujet.

Les scripts de fenêtres croisées ont des pièges interminables. Essayez de l'éviter autant que possible. Pour les boîtes de dialogue, utilisez toujours des éléments dans la page, qui sont beaucoup plus fiables et moins gênants que les fenêtres contextuelles.

0

J'utilise le hack pour savoir quand la fenêtre enfant a été fermée:

function checkChildWindow(win, onclose) { 
    var w = win; 
    var cb = onclose; 
    var t = setTimeout(function() { checkChildWindow(w, cb); }, 500); 
    var closing = false; 
    try { 
     if (win.closed || win.top == null) //happens when window is closed in FF/Chrome/Safari 
     closing = true;   
    } catch (e) { //happens when window is closed in IE   
     closing = true; 
    } 
    if (closing) { 
     clearTimeout(t); 
     onclose(); 
    } 
} 

function openWindow(url) { 
    ... 
    var wnd = window.open(url, "window_name", "[...flags...]"); 
    checkChildWindow(wnd, function() { alert('child was closed!'); }); 
    ... 
} 
Questions connexes