Sözünü ettiğiniz "sihirli zaman", muhtemelen pop-up'ın DOM'u yüklendiğinde. Ya da her şey (resimler, dıştan CSS, vb.) Yüklendiğinde olabilir. Açılır pencereye çok büyük bir grafik ekleyerek bunu kolayca test edebilirsiniz (önce önbelleğinizi temizleyin!). JQuery gibi bir Javascript Framework kullanıyorsanız (veya benzeri bir şey), pencere ofsetini kontrol etmeden önce DOM'un yüklenmesini beklemek için ready () olayını (veya benzer bir şeyi) kullanabilirsiniz. Buradaki tehlike, Safari algılamasının çelişkili bir şekilde çalışmasıdır: açılır pencerenin DOM'si Safari'de asla hazır olmayacaktır () çünkü açmaya çalıştığınız pencere için size geçerli bir tutamaç verecektir - gerçekte açılır veya değil. (aslında, yukarıdaki açılır pencere test kodunuzun safari için çalışmayacağına inanıyorum.)
Sanırım yapabileceğiniz en iyi şey, testinizi bir setTimeout () içine sarmak ve testi çalıştırmadan önce açılır pencereye yüklemeyi tamamlamak için 3-5 saniye süre vermek. Mükemmel değil, ancak zamanın en az% 95'inde çalışmalıdır.
İşte Chrome parçası olmadan tarayıcılar arası algılama için kullandığım kod.
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;
}
Yaptığım şey, bu testi ebeveynden çalıştırmak ve bir setTimeout () içine sarmak, alt pencereye yüklemesi için 3-5 saniye vermek. Alt pencerede bir test işlevi eklemeniz gerekir:
fonksiyon testi() {}
Açılır pencere engelleyici algılayıcı, "test" işlevinin alt pencerenin bir üyesi olarak var olup olmadığını test eder.
EKLENEN 15 HAZİRAN 2015:
Sanırım bunu halletmenin modern yolu, çocuğun ebeveyne pencerenin yüklendiğini bildirmesini sağlamak için window.postMessage () kullanmak olacaktır. Yaklaşım benzerdir (çocuk ebeveyne yüklendiğini söyler), ancak iletişim araçları gelişmiştir. Bu çapraz etki alanını çocuktan yapabildim:
$(window).load(function() {
this.opener.postMessage({'loaded': true}, "*");
this.close();
});
Ebeveyn bu mesajı aşağıdakileri kullanarak dinler:
$(window).on('message', function(event) {
alert(event.originalEvent.data.loaded)
});
Bu yardımcı olur umarım.