2009-09-03 18 views
14

C'è un gancio facile per rilevare che una finestra aperta da uno script ha terminato il caricamento? Fondamentalmente, voglio l'equivalente del gancio onLoad(), ma non posso impostarlo direttamente - presuppongo che il documento figlio sia un dato e non posso inserire alcun codice personale.In attesa del caricamento della finestra figlio per il completamento

Ad esempio, dire che ho i seguenti due file:

parent.html:

<html> 
    <head> 
    <title>Parent</title> 
    </head> 
    <script type="text/javascript"> 
    var w; 
    function loadChild() { 
     w = window.open(); 
     w.location.href="child.html"; 
     // block until child has finished loading... how? 
     w.doSomething(); 
    } 
    </script> 
</html> 
<body> 
    I am a parent window. <a href="javascript:loadChild()">Click me</a>. 
</body> 

child.html:

<html> 
    <head> 
    <title>Child</title> 
    </head> 
    <script type="text/javascript"> 
    function doSomething() { 
     alert("Hi there"); 
    } 
    </script> 
</html> 
<body> 
    I am a child window 
</body> 

Dal impostazione location.href è non-blocking, w.doSomething() isn' t definito ancora e la chiamata doSomething() esplode. Come posso rilevare che il bambino ha terminato il caricamento?

risposta

15

Questo funziona se la posizione della finestra appena aperta è la stessa origine:

var w = window.open('child.html') 
w.addEventListener('load', w.doSomething, true); 
+0

Puoi chiarire" same-origin "? Non sembra funzionare con' file: /// 'URL nella mia casella locale, ma forse è una cosa di sicurezza? –

+0

Sì, probabilmente. Nel browser, la stessa origine significa fondamentalmente che il target deve essere sullo stesso host_host e sa me _protocol_. Lo stai mescolando con 'http: //', forse? –

+0

Ho dimenticato di aggiungere che 'addEventLister' non è supportato in IE, quindi usare jQuery come suggerisce gabtub (o un altro framework JS che risolve le incompatibilità del browser per la gestione degli eventi) è probabilmente una buona idea ... –

4

come su

Parent.html:

<html> 
<head> 
<title>Parent</title> 
</head> 
<script type="text/javascript"> 
    var w; 
    function loadChild() { 
    w = window.open(); 
    w.location.href="child.html"; 
    // like this (with jquery) 
    $(w).ready(function() 
    { 
     w.doSomething(); 
    }); 
    } 
</script> 
</html> 
<body> 
    I am a parent window. <a href="javascript:loadChild()">Click me</a>. 
</body> 
+2

questo richiede jQuery, anche se ... potrebbe non essere preferibile ... – peirix

+0

Sembra non fare nulla. :(Non ho mai visto l'operatore '$' prima (trascorro la maggior parte del mio tempo in Java), cosa dovrebbe fare? Il debugger JavaScript di Chrome mi dà l'eccezione' non rilevata ReferenceError: $ non definita. " –

+0

Oops, commento incrociato Sì, jQuery, questo spiegherebbe perché non l'ho visto, sembra che ci dovrebbe essere un modo per farlo solo con il DOM fuori dalla scatola. –

Problemi correlati