Nah, "waktu ajaib" yang Anda bicarakan mungkin adalah ketika DOM munculan telah dimuat. Atau mungkin juga ketika semuanya (gambar, CSS tempel, dll.) Telah dimuat. Anda dapat menguji ini dengan mudah dengan menambahkan grafik yang sangat besar ke popup (bersihkan cache Anda terlebih dahulu!). Jika Anda menggunakan Javascript Framework seperti jQuery (atau yang serupa), Anda dapat menggunakan event ready () (atau yang serupa) untuk menunggu DOM dimuat sebelum memeriksa offset jendela. Bahayanya adalah deteksi Safari bekerja dengan cara yang bertentangan: DOM popup tidak akan pernah siap () di Safari karena ini akan memberi Anda pegangan yang valid untuk jendela yang Anda coba buka - apakah itu benar-benar terbuka atau tidak. (faktanya, saya yakin kode pengujian popup Anda di atas tidak akan berfungsi untuk safari.)
Saya pikir hal terbaik yang dapat Anda lakukan adalah membungkus pengujian Anda dalam setTimeout () dan memberikan popup 3-5 detik untuk menyelesaikan pemuatan sebelum menjalankan pengujian. Ini tidak sempurna, tetapi harus berhasil setidaknya 95% dari waktu.
Berikut kode yang saya gunakan untuk deteksi lintas-browser, tanpa bagian 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;
}
Apa yang saya lakukan adalah menjalankan tes ini dari induk dan membungkusnya dalam setTimeout (), memberikan jendela anak 3-5 detik untuk dimuat. Di jendela anak, Anda perlu menambahkan fungsi pengujian:
uji fungsi () {}
Detektor pemblokir popup menguji apakah fungsi "test" ada sebagai anggota jendela anak.
DITAMBAHKAN 15 JUNI 2015:
Saya pikir cara modern untuk menangani ini akan menggunakan window.postMessage () agar anak memberi tahu orang tua bahwa jendela telah dimuat. Pendekatannya serupa (anak memberi tahu orang tua bahwa itu dimuat), tetapi sarana komunikasi telah meningkat. Saya dapat melakukan ini lintas-domain dari anak:
$(window).load(function() {
this.opener.postMessage({'loaded': true}, "*");
this.close();
});
Orang tua mendengarkan pesan ini menggunakan:
$(window).on('message', function(event) {
alert(event.originalEvent.data.loaded)
});
Semoga ini membantu.