2009-09-03 12 views
14

Czy istnieje łatwy hak do wykrycia, że ​​okno otwarte przez skrypt zakończyło ładowanie? Zasadniczo chcę odpowiednik haka onLoad(), ale nie mogę ustawić go bezpośrednio - załóżmy, że dokument podrzędny jest podany i nie mogę faktycznie umieścić w nim żadnego własnego kodu.Oczekiwanie na załadowanie okna dziecięcego do końca

Załóżmy, że mam następujące dwa pliki:

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> 

Ponieważ ustawienie location.href jest bez blokowania, w.doSomething() ISN” t zdefiniowany jeszcze i wywołanie doSomething() wysadzi w powietrze. Jak mogę wykryć, że dziecko zakończyło ładowanie?

Odpowiedz

15

To działa, jeśli lokalizacja nowo otwartym oknie jest samo-origin:

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

Czy możesz wyjaśnić" ten sam pochodzenie "? Nie wydaje się działać z' file: /// 'URLs w moim polu lokalnym, ale może to jest rzeczą bezpieczeństwa? –

+0

Tak, prawdopodobnie. samo pochodzenie oznacza po prostu, że cel musi znajdować się na tym samym _host_ i sa ja _protocol_. Czy mieszacie to z 'http: //', może? –

+0

Zapomniałem dodać, że 'addEventLister' nie jest poprawnie obsługiwany w IE, więc używanie jQuery, jak sugeruje gabtub (lub innej struktury JS, która naprawia niezgodności przeglądarek do obsługi zdarzeń) jest prawdopodobnie dobrym pomysłem ... –

4

jak o

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

wymaga jQuery, choć ... może nie być lepsze ... – peirix

+0

Nie wydaje się nic. :(Nie widziałem jeszcze operatora '$' wcześniej (większość czasu spędzam w Javie), co powinien zrobić? Debugger JavaScript Chrome daje mi 'niezniszczony wyjątek ReferenceError: $ is not defined'. –

+0

Ups, komentarz krzyżykowy Tak, jQuery, to by wyjaśniało, dlaczego go nie widziałem Wygląda na to, że powinien istnieć jakiś sposób na zrobienie tego tylko z DOM po wyjęciu z pudełka –