まあ、あなたが言う「魔法の時間」は、ポップアップのDOMがロードされたときでしょう。あるいは、すべて(画像、外部CSSなど)がロードされたときかもしれません。非常に大きなグラフィックをポップアップに追加することでこれを簡単にテストできます(最初にキャッシュをクリアしてください!)jQuery(または類似のもの)のようなJavascriptフレームワークを使用している場合、ready()イベント(または類似のもの)を使用して、ウィンドウオフセットをチェックする前にDOMがロードされるのを待ちます。これの危険性は、Safariの検出が競合する方法で機能することです。ポップアップのDOMは、実際に開くかどうかに関係なく、開こうとしているウィンドウの有効なハンドルを提供するため、Safariでready()になることはありません。ない。(実際、上記のポップアップテストコードは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)
});
お役に立てれば。