2009-07-10 15 views
9

Zadałem już to pytanie, a problem został rozwiązany w połowie w tym sensie, że pomogło mi przekonać się, że JavaScript ma pewne twarde zabezpieczenia.Jak uruchomić funkcję okna nadrzędnego po zamknięciu okna podrzędnego?

Co się nauczyłem: Okno rodzica otwiera okno potomne. Okno podrzędne przekierowuje do innej domeny i zostaje przekierowane z powrotem. Próbuje odpalić funkcję okna nadrzędnego po zamknięciu się.

window.opener.startLoad(); 

Prowadzi to do problemu uprawnień (zabezpieczeń) i nie będzie działać.

(Połowa) Nowy problem: Jak mogę uzyskać okno do otwierania okna podrzędnego, a po jego zamknięciu uruchomić funkcję w oknie nadrzędnym?

Potrzebuję bardzo skutecznego sposobu robienia tego, ponieważ to będzie się działo bardzo często!

Dziękuję za pomoc.

+0

W odpowiedzi na twój ostatni komentarz na temat mojej odpowiedzi, obawiam się, że nie mogę wymyślić powodu, dla którego nie wywołanie funkcji po zamknięciu okna. Czy mógłbyś opublikować swój kod w miejscu, w którym otworzysz okno, i funkcję, którą próbujesz wywołać, gdy się zamknie? Być może będę w stanie ci pomóc więcej, ale teraz nie mam pomysłów. – Sean

Odpowiedz

19

Spróbuj tego:

var win = window.open(url, name); 
win.onunload = afterChildClose; // afterChildClose() is the function. 
win.close(); // afterChildClose() should fire now. 

Wszystko to kod będzie się znajdować i wykonywane w oknie macierzystej javascript (w tym afterChildClose()). Tworzysz okno i przypisujesz funkcję do zdarzenia zwolnienia.

Jedna rzecz, o której właśnie pomyślałem. Jeśli okno podrzędne odświeży się lub przejdzie do innego adresu URL, uruchomi się także zdarzenie onunload. Jeśli chcesz, aby wydarzenie było uruchamiane tylko wtedy, gdy okno jest zamknięte, powinieneś dodać check in afterChildClose() na win.closed.

EDYCJA: Oto kod dwóch stron próbnych, które przygotowałem, aby wypróbować to.

okno nadrzędny:

<html> 
<body> 
<script type="text/javascript"> 
    var win = window.open("secondwindow.html", "woo"); 
    win.onunload =onun; 

    function onun() { 
     if(win.location != "about:blank") // This is so that the function 
              // doesn't do anything when the 
              // window is first opened. 
     { 
      alert("closed"); 
     } 
    } 
</script> 
</body> 
</html> 

okno dziecko ("secondwindow.html"):

<html> 
<body> 
<script type="text/javascript"> 
    setTimeout('window.close();', 5000); 
</script> 
</body> 
</html> 

Przy próbie otwarcia pierwszego dokumentu w firefox, to otwiera okno, okno czeka 5 sekund i kończy pracę, a pierwszy dokument pokazuje alert(), więc działa, nawet gdy okno podrzędne się zamyka.

+0

Gdzie znajduje się funkcja afterChildClose? – Abs

+0

Czy zamkniesz okno Dziecko z okna nadrzędnego? – Abs

+0

Tak, 'win.close()' jest właśnie po to, aby pokazać, co się stanie, gdy okno potomne zostanie zamknięte. Kod w mojej odpowiedzi nie jest twoim pełnym rozwiązaniem, pokazuje jedynie technikę, która pozwoli ci zrobić to, czego potrzebujesz.Ta technika polega na przechwyceniu obiektu okna potomnego po jego otwarciu, a następnie przypisaniu zdarzeń do tego obiektu (np. Onunload). – Sean

2

Wylądowałem tutaj, szukając podobnej funkcjonalności, ale nigdy nie mogłem jej uruchomić z kompatybilnością z różnymi przeglądarkami. Więc tutaj jest inny sposób na wykonanie kodu jako dziecko zamyka się okno:

var win = window.open("http://www.google.com"); 

var winClosed = setInterval(function() { 

    if (win.closed) { 
     clearInterval(winClosed); 
     location.assign("http://www.bing.com/"); //Execute your code here 
    } 

}, 250); 

Nie używa żadnych obsługi zdarzeń z okna dziecko, i nie trzeba modyfikować zawartość okna dziecka.

Powiązane problemy