2009-05-12 4 views
1

Je suis tombé sur un scénario impair dans lequel window.open() ne déclenche pas l'événement 'load' si la fenêtre actuelle est déjà à l'écran.Javascript window.open observation quand la fenêtre existe déjà en utilisant Prototype

Synopsis
J'ai un bouton lorsque vous cliquez dessus exécute quelques javascript et ouvre une page dans une nouvelle fenêtre. Code standard que tout développeur JS a vu. Lorsque la méthode (partie d'une classe plus grande) est appelée, elle vérifie si elle a une référence à la fenêtre (this.preview_window). Si c'est le cas, il fonctionnera, il essaiera de l'ouvrir à nouveau. Une fois ouvert, il exécute une méthode de mise à jour sur cette fenêtre.

Problème
Si la fenêtre n'existe pas, tout se passe comme prévu. Si la fenêtre existe mais que la classe ne contient pas de référence, la référence est acquise avec window.open(), mais la fonction de mise à jour n'est pas appelée.

pertinentes du Code

// This code is run whenever there is no reference to the window 
this.preview_window = window.open('/folder/page.php','page_previewer'); 
Event.observe(this.preview_window, 'load',this.update.bindAsEventListener(this)); 

Le reste du code a été testé beaucoup donc je suis assez confiant que je me manque quelque chose dans la façon dont l'événement de chargement fonctionne. Les fonctions window.open() et update() fonctionnent comme prévu dans tous les cas sauf celui-ci.

Répondre

1

J'expérimenté avec ce un peu et il semble que le problème est quelque chose de la réponse précédente avait fait allusion - si vous avez déjà une fenêtre ouverte l'appel à window.open() ne se déclenche pas l'événement de chargement. Par conséquent, vous devez essentiellement actualiser la fenêtre d'aperçu chaque fois que le gestionnaire d'événements de votre bouton est appelé afin de vous assurer que l'événement de chargement sera déclenché et que votre gestionnaire de mise à jour peut également être appelé. Voici le code je en faire la démonstration:

var preview_window; 

function openPreviewWindow() { 
    if (preview_window) { 
     preview_window.close(); //Load will not fire unless we close the window first 
    } 
    preview_window = window.open('/', 'preview_window'); 
    Event.observe(preview_window, 'load', function() { 
     alert('Updating opened window.'); 
    }.bindAsEventListener(this)); 
} 

<a href="#" onclick="openPreviewWindow()">Open Preview Window</a> 

Cela peut ne pas être terriblement instructif mais nous espérons qu'il vous met sur une voie plus prometteuse.

1

Je suppose que la fenêtre enfant se trouve dans un domaine différent lorsque la liaison se produit ou qu'elle se charge à partir du cache avant que le chargement ne se produise. essayez de mettre votre liaison dans un délai de 500ms. Si vous contrôlez l'url de la fenêtre enfant, il serait plus facile d'appeler le parent de l'enfant. Alternativement, fermer & ré-ouvrir.

if (this.preview_window && !this.preview_window.closed) 
    this.preview_window.close(); 
... open window ... 
Questions connexes