"ช่วงเวลามหัศจรรย์" ที่คุณพูดถึงน่าจะเป็นตอนที่โหลด DOM ของป๊อปอัปแล้ว หรือมิฉะนั้นอาจเป็นเมื่อโหลดทุกอย่าง (รูปภาพ CSS นอกเรือ ฯลฯ ) แล้ว คุณสามารถทดสอบสิ่งนี้ได้อย่างง่ายดายโดยการเพิ่มกราฟิกขนาดใหญ่ลงในป๊อปอัป (ล้างแคชของคุณก่อน!) หากคุณใช้ Javascript Framework เช่น jQuery (หรือสิ่งที่คล้ายกัน) คุณสามารถใช้เหตุการณ์ ready () (หรือสิ่งที่คล้ายกัน) เพื่อรอให้ DOM โหลดก่อนที่จะตรวจสอบการชดเชยหน้าต่าง อันตรายในกรณีนี้คือการตรวจจับ Safari ทำงานในลักษณะที่ขัดแย้งกัน: DOM ของป๊อปอัปจะไม่พร้อมใช้งาน () ใน Safari เนื่องจากจะให้หมายเลขอ้างอิงที่ถูกต้องสำหรับหน้าต่างที่คุณพยายามเปิดไม่ว่าจะเปิดขึ้นจริงหรือ ไม่. (อันที่จริงฉันเชื่อว่ารหัสทดสอบป๊อปอัปด้านบนของคุณใช้ไม่ได้กับซาฟารี)
ฉันคิดว่าสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือสรุปการทดสอบของคุณใน setTimeout () และให้ป๊อปอัป 3-5 วินาทีเพื่อทำการโหลดให้เสร็จสิ้นก่อนที่จะทำการทดสอบ มันไม่สมบูรณ์แบบ แต่ควรทำงานอย่างน้อย 95% ของเวลา
นี่คือรหัสที่ฉันใช้สำหรับการตรวจจับข้ามเบราว์เซอร์โดยไม่มีส่วนของ 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;
}
สิ่งที่ฉันทำคือเรียกใช้การทดสอบนี้จากผู้ปกครองและรวมไว้ใน setTimeout () ให้หน้าต่างย่อยโหลด 3-5 วินาที ในหน้าต่างลูกคุณต้องเพิ่มฟังก์ชันทดสอบ:
การทดสอบฟังก์ชัน () {}
ตัวตรวจจับตัวป้องกันป๊อปอัปจะทดสอบเพื่อดูว่ามีฟังก์ชัน "ทดสอบ" เป็นสมาชิกของหน้าต่างย่อยหรือไม่
เพิ่ม 15 มิถุนายน 2558:
ฉันคิดว่าวิธีที่ทันสมัยในการจัดการสิ่งนี้คือการใช้ window.postMessage () เพื่อให้เด็กแจ้งผู้ปกครองว่ามีการโหลดหน้าต่างแล้ว วิธีการนี้คล้ายกัน (เด็กบอกผู้ปกครองว่าโหลดแล้ว) แต่วิธีการสื่อสารดีขึ้น ฉันสามารถข้ามโดเมนได้ตั้งแต่เด็ก:
$(window).load(function() {
this.opener.postMessage({'loaded': true}, "*");
this.close();
});
ผู้ปกครองรับฟังข้อความนี้โดยใช้:
$(window).on('message', function(event) {
alert(event.originalEvent.data.loaded)
});
หวังว่านี่จะช่วยได้