Presta atención porque en este enunciado vas a hallar el arreglo que buscas.
Solución:
Bueno, el “momento mágico” del que hablas es probablemente cuando se ha cargado el DOM de la ventana emergente. O bien, podría ser cuando todo (imágenes, CSS externo, etc.) se haya cargado. Puede probar esto fácilmente agregando un gráfico muy grande a la ventana emergente (¡borre su caché primero!). Si estaba usando un marco de Javascript como jQuery (o algo similar), podría usar el evento ready () (o algo similar) para esperar a que se cargue el DOM antes de verificar el desplazamiento de la ventana. El peligro de esto es que la detección de Safari funciona de manera conflictiva: el DOM de la ventana emergente nunca estará listo() en Safari porque le dará un identificador válido para la ventana que está tratando de abrir, ya sea que realmente se abra o no. (de hecho, creo que su código de prueba emergente anterior no funcionará para safari).
Creo que lo mejor que puede hacer es envolver su prueba en setTimeout() y darle a la ventana emergente de 3 a 5 segundos para completar la carga antes de ejecutar la prueba. No es perfecto, pero debería funcionar al menos el 95% del tiempo.
Aquí está el código que uso para la detección de navegadores cruzados, sin la parte de 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;
Lo que hago es ejecutar esta prueba desde el padre y envolverla en un setTimeout(), dando a la ventana secundaria de 3 a 5 segundos para cargar. En la ventana secundaria, debe agregar una función de prueba:
prueba de funcionamiento()
El detector de bloqueo de ventanas emergentes comprueba si la función “probar” existe como miembro de la ventana secundaria.
AÑADIDO EL 15 DE JUNIO DE 2015:
Creo que la forma moderna de manejar esto sería usar window.postMessage() para que el niño notifique al padre que la ventana se ha cargado. El enfoque es similar (el niño le dice al padre que está cargado), pero el medio de comunicación ha mejorado. Pude hacer este dominio cruzado desde el niño:
$(window).load(function()
this.opener.postMessage('loaded': true, "*");
this.close();
);
El padre escucha este mensaje usando:
$(window).on('message', function(event)
alert(event.originalEvent.data.loaded)
);
Espero que esto ayude.
Solo una mejora al fragmento de InvisibleBacon (probado en IE9, Safari 5, Chrome 9 y FF 3.6):
var myPopup = window.open("popupcheck.htm", "", "directories=no,height=150,width=150,menubar=no,resizable=no,scrollbars=no,status=no,titlebar=no,top=0,location=no");
if (!myPopup)
alert("failed for most browsers");
else
myPopup.onload = function()
setTimeout(function()
if (myPopup.screenX === 0)
alert("failed for chrome");
else
// close the test window if popups are allowed.
myPopup.close();
, 0);
;
Lo siguiente es un jQuery solución para la verificación del bloqueador de ventanas emergentes. Se probó en FF (v11), Safari (v6), Chrome (v23.0.127.95) e IE (v7 y v9). Actualice la función _displayError para manejar el mensaje de error como mejor le parezca.
var popupBlockerChecker =
check: function(popup_window)
var _scope = this;
if (popup_window)
if(/chrome/.test(navigator.userAgent.toLowerCase()))
setTimeout(function ()
_scope._is_popup_blocked(_scope, popup_window);
,200);
else
popup_window.onload = function ()
_scope._is_popup_blocked(_scope, popup_window);
;
else
_scope._displayError();
,
_is_popup_blocked: function(scope, popup_window)
if ((popup_window.innerHeight > 0)==false) scope._displayError();
,
_displayError: function()
alert("Popup Blocker is enabled! Please add this site to your exception list.");
;
Uso:
var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);
¡Espero que esto ayude! 🙂
Si te apasiona la programación, tienes la habilidad dejar una noticia acerca de qué le añadirías a este tutorial.