Soy consciente de las técnicas de JavaScript para detectar si una ventana emergente está bloqueada en otros navegadores (como se describe en la respuesta a esta pregunta ). Aquí está la prueba básica:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
Pero esto no funciona en Chrome. La sección "POPUP BLOCKED" nunca se alcanza cuando la ventana emergente está bloqueada.
Por supuesto, la prueba está funcionando hasta cierto punto, ya que Chrome en realidad no bloquea la ventana emergente, sino que la abre en una pequeña ventana minimizada en la esquina inferior derecha que enumera las ventanas emergentes "bloqueadas".
Lo que me gustaría hacer es saber si la ventana emergente fue bloqueada por el bloqueador de ventanas emergentes de Chrome. Intento evitar el rastreo del navegador a favor de la detección de funciones. ¿Hay alguna forma de hacer esto sin que el navegador rastree?
Editar : ahora he intentado hacer uso de newWin.outerHeight
, newWin.left
y otras propiedades similares para lograr esto. Google Chrome devuelve todos los valores de posición y altura como 0 cuando la ventana emergente está bloqueada.
Desafortunadamente, también devuelve los mismos valores incluso si la ventana emergente se abre durante un período de tiempo desconocido. Después de un período mágico (un par de segundos en mis pruebas), la información de ubicación y tamaño se devuelve como los valores correctos. En otras palabras, todavía no estoy más cerca de resolver esto. Cualquier ayuda sería apreciada.
fuente
Respuestas:
Bueno, el "momento mágico" del que hablas es probablemente cuando se ha cargado el DOM de la ventana emergente. O 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 (¡limpie 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 en 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 el código de prueba emergente anterior no funcionará para safari).
Creo que lo mejor que puede hacer es envolver su prueba en un setTimeout () y darle a la ventana emergente 3-5 segundos para completar la carga antes de ejecutar la prueba. No es perfecto, pero debería funcionar al menos el 95% del tiempo.
Este es el código que utilizo para la detección entre navegadores, sin la parte de Chrome.
Lo que hago es ejecutar esta prueba desde el padre y envolverla en un setTimeout (), dando a la ventana secundaria 3-5 segundos para cargar. En la ventana secundaria, debe agregar una función de prueba:
prueba de funcionamiento() {}
El detector de bloqueador de ventanas emergentes prueba para ver si la función "prueba" 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 a los padres que está cargado), pero los medios de comunicación han mejorado. Pude hacer este dominio cruzado del niño:
El padre escucha este mensaje usando:
Espero que esto ayude.
fuente
Solo una mejora del snipet de InvisibleBacon (probado en IE9, Safari 5, Chrome 9 y FF 3.6):
fuente
La siguiente es una solución de jQuery para verificar el bloqueador de ventanas emergentes. Ha sido probado 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.
Uso:
¡Espero que esto ayude! :)
fuente
La respuesta de Rich ya no funcionará para Chrome. Parece que Chrome en realidad ejecuta cualquier Javascript en la ventana emergente ahora. Terminé verificando un valor de screenX de 0 para verificar si hay ventanas emergentes bloqueadas. También creo que encontré una manera de garantizar que esta propiedad sea definitiva antes de verificar. Esto solo funciona para ventanas emergentes en su dominio, pero puede agregar un controlador de carga como este:
Como muchos han informado, la propiedad "screenX" a veces informa un valor distinto de cero para las ventanas emergentes fallidas, incluso después de la carga. También experimenté este comportamiento, pero si agrega el cheque después de un tiempo de espera de cero ms, la propiedad screenX siempre parece generar un valor consistente.
Avíseme si hay formas de hacer que este script sea más sólido. Sin embargo, parece funcionar para mis propósitos.
fuente
onload
nunca dispara.Esto funcionó para mí:
ExternalHeight y outerWidth son para Chrome porque el truco 'about: blank' de arriba ya no funciona en Chrome.
fuente
Voy a copiar / pegar la respuesta proporcionada aquí: https://stackoverflow.com/a/27725432/892099 por DanielB. funciona en cromo 40 y está muy limpio. sin trucos sucios o esperas.
fuente
¿Qué tal un
Promise
enfoque?Y puedes usarlo como el clásico
window.open
Podría cambiar el código para que falle la promesa en lugar de regresar
undefined
, solo pensé queif
era un flujo de control más fácil quetry / catch
en este caso.fuente
Compruebe la posición de la ventana en relación con el padre. Chrome hace que la ventana parezca casi fuera de la pantalla.
fuente
Tuve un problema similar con las ventanas emergentes que no se abren en Chrome. Estaba frustrado porque no estaba tratando de hacer algo furtivo, como una ventana emergente de carga, simplemente abriendo una ventana cuando el usuario hacía clic. Estaba DOBLEMENTE frustrado porque la ejecución de mi función, que incluía window.open () desde la línea de comando de firebug, funcionó, ¡mientras que hacer clic en mi enlace no funcionó! Aquí estaba mi solución:
Manera incorrecta: ejecutar window.open () desde un detector de eventos (en mi caso, dojo.connect al método de evento onclick de un nodo DOM).
Forma correcta: asignando una función a la propiedad onclick del nodo que llamó a window.open ().
Y, por supuesto, todavía puedo hacer detectores de eventos para ese mismo evento onclick si es necesario. Con este cambio, pude abrir mis ventanas a pesar de que Chrome estaba configurado en "No permitir que ningún sitio muestre ventanas emergentes". Alegría.
Si alguien sabio en las formas de Chrome puede decirnos al resto de nosotros por qué marca la diferencia, me encantaría escucharlo, aunque sospecho que es solo un intento de cerrar la puerta a las ventanas emergentes programáticas maliciosas.
fuente
Aquí hay una versión que funciona actualmente en Chrome. Solo una pequeña alteración de la solución de Rich, aunque agregué un contenedor que también maneja el tiempo.
Para usarlo solo haz esto:
Si la ventana emergente se bloquea, el mensaje de alerta se mostrará después del período de gracia de 5 segundos (puede ajustar eso, pero 5 segundos deberían ser bastante seguros).
fuente
Este fragmento incorpora todo lo anterior. Por alguna razón, StackOverflow excluye la primera y la última línea de código en el bloque de código a continuación, así que escribí un blog sobre él. Para obtener una explicación completa y el resto del código (descargable), consulte mi blog en thecodeabode.blogspot.com
fuente
Vaya, seguro que hay muchas soluciones aquí. Esto es mío, utiliza soluciones tomadas de la respuesta aceptada actual (que no funciona en la última versión de Chrome y requiere envolverla en un tiempo de espera), así como una solución relacionada en este hilo (que en realidad es Vanilla JS, no jQuery) .
El mío usa una arquitectura de devolución de llamada que se enviará
true
cuando la ventana emergente esté bloqueada y de lofalse
contrario.fuente
La respuesta de Jason es el único método en el que puedo pensar también, ¡pero confiar en una posición como esa es un poco arriesgado!
En estos días, realmente no necesita hacer la pregunta "¿se bloqueó mi ventana emergente no solicitada?", Porque la respuesta es invariablemente "sí": todos los navegadores principales tienen el bloqueador de ventanas emergentes activado de forma predeterminada. El mejor enfoque es solo window.open () en respuesta a un clic directo, que casi siempre está permitido.
fuente
HOLA
Modifiqué ligeramente las soluciones descritas anteriormente y creo que al menos funciona para Chrome. Mi solución está hecha para detectar si la ventana emergente está bloqueada cuando se abre la página principal, no cuando se abre la ventana emergente, pero estoy seguro de que hay algunas personas que pueden modificarla. :-) El inconveniente aquí es que se muestra la ventana emergente durante un par de segundos (podría ser posible acortar un poco) cuando no hay un bloqueador de ventanas emergentes.
Pongo esto en la sección de mi ventana 'principal'
El popuptest se ve así:
Cuando llamo a la función de prueba en la página emergente después de 3500 ms, Chrome ha configurado correctamente la altura interna.
Utilizo la variable popUpsBlocked para saber si las ventanas emergentes se muestran o no en otros javascripts. es decir
fuente
fuente
Por lo que puedo decir (por lo que he probado), Chrome devuelve un objeto de ventana con la ubicación "about: blank". Entonces, lo siguiente debería funcionar para todos los navegadores:
fuente