2010-08-10 4 views
2

Je suis en train de le faire:Attatching setTimeout() à window.opener de fenêtre de rappel unload

$(function() { 
    var parent = window.opener; 

    $(window).bind('unload', function() { 
     parent.setTimeout(function() { 
      parent.console.log('Fired!'); 
     }, 200); 
    } 
}); 

L'exemple ci-dessus fonctionne bien dans FF, etc. Chrome, mais pas IE8. Dans ce dernier, le rappel spécifié dans setTimeout() ne semble jamais être déclenché.

La raison est que je voudrais exécuter du code dans la fenêtre parent (window.opener), quand une fenêtre popup est fermée. Je voudrais que le popup soit responsable de ceci, et pas l'inverse.

Juste pour montrer que le concept fonctionne:

$(function() { 
    var parent = window.opener; 

    $(window).bind('unload', function() { 
     parent.console.log('Fired!'); 
    } 
}); 

Appel console.log immédiatement dans le rappel lié à décharger (comme dans l'exemple ci-dessus) semble fonctionner dans tous les navigateurs (ne pas cibler IE6 ici) , mais dès que j'ajoute setTimeout() au mix, ça casse.

Est-ce possible? Est-ce un problème de portée?

Répondre

1

Dans IE, les fonctions sont liées à leur fenêtre propriétaire. Ils peuvent être appelés depuis une autre fenêtre, mais lorsqu'une fenêtre est déchargée, toutes ses fonctions meurent. Si vous essayez d'en appeler un explicitement après onunload, vous obtiendrez une erreur "L'objet invoqué a été déconnecté de ses clients". Donc, dans l'enfant onunload, vous devriez rappeler le parent immédiatement. Si le parent a besoin d'un délai, il devra le fournir lui-même.

(Vous devriez probablement vérifier également que le parent n'est pas null, n'a pas été closed, et envelopper la tentative d'accès dans un try, de sorte que vous ne recevez pas une erreur si la fenêtre parent a été fermé ou naviguée .)

+0

Aww bummer. Devinez que je dois essayer une approche différente alors. Y a-t-il une chance qu'il soit possible de passer une fonction de rappel de 'l'enfant' à son parent? Les commentaires ne sont probablement pas un bon endroit pour le code, mais je pense quelque chose le long des lignes: parent. $ (Parent) .trigger ('myEvent', {'callback': function() {alert ('foo') ;}); J'ai essayé ce qui précède et le rappel semble également lié à la fenêtre enfant. Y a-t-il une solution à cela? – peterfarsinsen

Questions connexes