Ocasionalmente, me encuentro con una página web que intenta abrir una nueva ventana (para la entrada del usuario, o algo importante), pero el bloqueador de ventanas emergentes evita que esto suceda.
¿Qué métodos puede usar la ventana de llamada para asegurarse de que la nueva ventana se inicie correctamente?
Intenté varios de los ejemplos anteriores, pero no pude hacer que funcionaran con Chrome. Este enfoque simple parece funcionar con Chrome 39, Firefox 34, Safari 5.1.7 e IE 11. Aquí está el fragmento de código de nuestra biblioteca JS.
fuente
Actualización: las ventanas emergentes existen desde tiempos muy antiguos. La idea inicial era mostrar otro contenido sin cerrar la ventana principal. A partir de ahora, hay otras formas de hacerlo: JavaScript puede enviar solicitudes de servidor, por lo que rara vez se utilizan ventanas emergentes. Pero a veces todavía son útiles.
En el pasado, los sitios malvados abusaron mucho de las ventanas emergentes. Una página incorrecta podría abrir toneladas de ventanas emergentes con anuncios. Entonces, la mayoría de los navegadores intentan bloquear las ventanas emergentes y proteger al usuario.
La mayoría de los navegadores bloquean las ventanas emergentes si se llaman fuera de los controladores de eventos activados por el usuario, como onclick.
Si lo piensas, es un poco complicado. Si el código está directamente en un controlador onclick, entonces eso es fácil. Pero, ¿cuál es la ventana emergente que se abre en setTimeout?
Prueba este código:
La ventana emergente se abre en Chrome, pero se bloquea en Firefox.
... Y esto también funciona en Firefox:
La diferencia es que Firefox trata un tiempo de espera de 2000 ms o menos aceptable, pero después de eso, elimina la "confianza", suponiendo que ahora está "fuera de la acción del usuario". Entonces el primero está bloqueado y el segundo no.
Respuesta original que era actual 2012:
¡Espero que esto ayude! :)
fuente
Content-Disposition: attachment;
en el encabezado de respuesta), la ventana emergente se cerrará inmediatamente, por lo tanto, elsetTimeout
código fallará y el navegador se quejará de que "¡El Bloqueador de ventanas emergentes está habilitado!". Para Chrome, recomiendo la solución de @ DanielB y funciona muy bien.Content-Disposition: attachment;
encabezado, no necesita abrirlo en una ventana emergente. Simplemente haga un enlace directo al activo que desea descargar y el comportamiento nativo del navegador le permitirá descargar sin redirigirlo fuera de la página actual.window.location
, si el primer archivo tarda demasiado en generarse, se ignorará cuando se inicie la segunda solicitud. Esa es la razón por la que tengo que usarwindow.open
, ya quewindow.location
nunca me avisa cuando finaliza la respuesta.Una "solución" que siempre funcionará independientemente de la compañía o versión del navegador es simplemente colocar un mensaje de advertencia en la pantalla, en algún lugar cercano al control que creará una ventana emergente, que advierte cortésmente al usuario que la acción requiere una ventana emergente. arriba y habilitarlos para el sitio.
Sé que no es lujoso ni nada, pero no puede ser más simple y solo requiere unos 5 minutos de prueba, luego puedes pasar a otras pesadillas.
Una vez que el usuario ha permitido ventanas emergentes para su sitio, también sería considerado si no se excede en las ventanas emergentes. Lo último que quieres hacer es molestar a tus visitantes.
fuente
Combiné las soluciones de @Kevin B y @ DanielB.
Esto es mucho más simple.
Uso:
fuente
isPopupBlockerActivated
La función nunca regresareturn (popupWindow.innerHeight > 0) === false;
. Su función devuelve falso cuando su navegador no es Chrome. Porque onload es un proceso asincrónico. Su función devuelve falso y luego se ejecuta la carga, pero su resultado nunca regresa.He intentado muchas soluciones, pero la única que se me ocurrió que también funcionó con uBlock Origin fue utilizar un tiempo de espera para verificar el estado cerrado de la ventana emergente.
Obviamente esto es un hack; como todas las soluciones a este problema.
Debe proporcionar suficiente tiempo en su setTimeout para dar cuenta de la apertura y cierre iniciales, por lo que nunca será completamente preciso. Será una posición de prueba y error.
Agregue esto a su lista de intentos.
fuente
Un enfoque simple si también posee el código hijo , sería crear una variable simple en su html como se muestra a continuación:
Y luego verifique su existencia del padre algo similar a lo siguiente:
Esperamos un tiempo para asegurarnos de que se haya cargado la página web y verificamos su existencia. Obviamente, si la ventana no se carga después de 1500 ms, la variable aún lo sería
undefined
.fuente
Al usar el evento onbeforeunload podemos verificar lo siguiente
abrirá 2 ventanas negras en el fondo
La función devuelve un valor booleano.
fuente