Cóż, "magiczny czas", o którym mówisz, jest prawdopodobnie wtedy, gdy zostanie załadowany DOM wyskakującego okienka. Albo może się tak zdarzyć, gdy wszystko (obrazy, zewnętrzny CSS itp.) Zostało załadowane. Możesz to łatwo przetestować, dodając bardzo dużą grafikę do wyskakującego okienka (najpierw wyczyść pamięć podręczną!). Jeśli używasz JavaScript Framework, takiego jak jQuery (lub coś podobnego), możesz użyć zdarzenia ready () (lub czegoś podobnego), aby poczekać na załadowanie DOM przed sprawdzeniem przesunięcia okna. Niebezpieczeństwo polega na tym, że wykrywanie Safari działa w sposób sprzeczny: DOM wyskakującego okienka nigdy nie będzie gotowy () w Safari, ponieważ da ci prawidłowy uchwyt dla okna, które próbujesz otworzyć - niezależnie od tego, czy faktycznie się otworzy, czy nie. (w rzeczywistości uważam, że powyższy kod testu wyskakującego okienka nie zadziała w przypadku safari).
Myślę, że najlepszą rzeczą, jaką możesz zrobić, jest zawinięcie testu w setTimeout () i pozostawienie wyskakującemu okienku 3-5 sekund na zakończenie ładowania przed uruchomieniem testu. Nie jest doskonały, ale powinien działać co najmniej w 95% przypadków.
Oto kod, którego używam do wykrywania w różnych przeglądarkach, bez części Chrome.
function _hasPopupBlocker(poppedWindow) {
var result = false;
try {
if (typeof poppedWindow == 'undefined') {
// Safari with popup blocker... leaves the popup window handle undefined
result = true;
}
else if (poppedWindow && poppedWindow.closed) {
// This happens if the user opens and closes the client window...
// Confusing because the handle is still available, but it's in a "closed" state.
// We're not saying that the window is not being blocked, we're just saying
// that the window has been closed before the test could be run.
result = false;
}
else if (poppedWindow && poppedWindow.test) {
// This is the actual test. The client window should be fine.
result = false;
}
else {
// Else we'll assume the window is not OK
result = true;
}
} catch (err) {
//if (console) {
// console.warn("Could not access popup window", err);
//}
}
return result;
}
To, co robię, to uruchamianie tego testu od rodzica i zawijanie go w setTimeout (), dając okno podrzędne 3-5 sekund na załadowanie. W oknie podrzędnym musisz dodać funkcję testową:
test funkcji () {}
Detektor blokowania wyskakujących okienek sprawdza, czy funkcja „test” istnieje jako element składowy okna podrzędnego.
DODANO 15 CZERWCA 2015:
Myślę, że nowoczesnym sposobem radzenia sobie z tym byłoby użycie window.postMessage (), aby dziecko powiadomiło rodzica, że okno zostało załadowane. Podejście jest podobne (dziecko mówi rodzicowi, że jest załadowane), ale sposób komunikacji się poprawił. Mogłem zrobić to między domenami od dziecka:
$(window).load(function() {
this.opener.postMessage({'loaded': true}, "*");
this.close();
});
Rodzic nasłuchuje tej wiadomości za pomocą:
$(window).on('message', function(event) {
alert(event.originalEvent.data.loaded)
});
Mam nadzieję że to pomoże.