Що ж, "чарівний час", про який ви говорите, - це, ймовірно, коли 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 червня 2015 року:
Я думаю, що сучасним способом вирішити це було б використовувати window.postMessage (), щоб дитина повідомляла батьків про те, що вікно було завантажено. Підхід схожий (дитина каже батькові, що він завантажений), але засоби спілкування покращилися. Я зміг зробити цей крос-домен від дитини:
$(window).load(function() {
this.opener.postMessage({'loaded': true}, "*");
this.close();
});
Батько слухає це повідомлення, використовуючи:
$(window).on('message', function(event) {
alert(event.originalEvent.data.loaded)
});
Сподіваюся, це допомагає.