好吧,您所说的“神奇时间”可能是加载弹出窗口的 DOM 时。否则可能是当所有内容(图像、外置 CSS 等)都已加载时。您可以通过向弹出窗口添加一个非常大的图形来轻松测试(首先清除缓存!)。如果您使用像 jQuery(或类似的东西)这样的 Javascript 框架,您可以使用 ready() 事件(或类似的东西)在检查窗口偏移量之前等待 DOM 加载。这样做的危险在于 Safari 检测以一种相互冲突的方式工作:弹出窗口的 DOM 永远不会在 Safari 中就绪(),因为它会为您尝试打开的窗口提供一个有效的句柄——无论它是实际打开还是不是。(事实上,我相信你上面的弹出测试代码不适用于 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 秒的加载时间。在子窗口中,需要添加一个测试函数:
功能测试() {}
弹出窗口拦截器检测器测试以查看“测试”函数是否作为子窗口的成员存在。
2015 年 6 月 15 日添加:
我认为处理这个问题的现代方法是使用 window.postMessage() 让孩子通知父母窗口已加载。方法类似(孩子告诉父母它已加载),但沟通方式有所改善。我能够从孩子那里做这个跨域:
$(window).load(function() {
this.opener.postMessage({'loaded': true}, "*");
this.close();
});
父母使用以下方法侦听此消息:
$(window).on('message', function(event) {
alert(event.originalEvent.data.loaded)
});
希望这可以帮助。