¿Cómo puedo detectar si un navegador está bloqueando una ventana emergente?


De vez en cuando, me he encontrado 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?

 97
Author: Gerstmann, 2008-08-06

6 answers

Si usas JavaScript para abrir la ventana emergente, puedes usar algo como esto:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
 120
Author: omar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 16:54:20

He intentado una serie de los ejemplos anteriores, pero no pude conseguir que funcionen con Chrome. Este sencillo enfoque 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.

openPopUp: function(urlToOpen) {
    var popup_window=window.open(urlToOpen,"myWindow","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=400, height=400");            
    try {
        popup_window.focus();   
    } catch (e) {
        alert("Pop-up Blocker is enabled! Please add this site to your exception list.");
    }
}
 34
Author: DanielB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 16:57:12

Esta solución para la comprobación de bloqueadores de ventanas emergentes se ha 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.

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! :)

 26
Author: Kevin B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 16:56:47

Una "solución" que siempre funcionará independientemente de la compañía o la versión del navegador es simplemente poner un mensaje de advertencia en la pantalla, en algún lugar cerca del control que creará una ventana emergente, que advierta educadamente al usuario que la acción requiere una ventana emergente y que por favor los habilite para el sitio.

Sé que no es elegante ni nada, pero no puede ser más simple y solo requiere unos 5 minutos de prueba, luego puede pasar a otras pesadillas.

Una vez que el usuario tiene permite ventanas emergentes para su sitio, también sería considerado si no exagerar las ventanas emergentes. Lo último que quieres hacer es molestar a tus visitantes.

 10
Author: UncaAlby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-26 22:49:35

He probado muchas soluciones, pero la única que se me ocurrió que también funcionó con uBlock Origin, fue utilizando un tiempo de espera para verificar el estado cerrado de la ventana emergente.

function popup (url, width, height) {
    const left = (window.screen.width / 2) - (width / 2)
    const top = (window.screen.height / 2) - (height / 2)
    let opener = window.open(url, '', `menubar=no, toolbar=no, status=no, resizable=yes, scrollbars=yes, width=${width},height=${height},top=${top},left=${left}`)

    window.setTimeout(() => {
        if (!opener || opener.closed || typeof opener.closed === 'undefined') {
            console.log('Not allowed...') // Do something here.
        }
    }, 1000)
}

Obviamente esto es un truco; como todas las soluciones a este problema.

Debe proporcionar suficiente tiempo en su setTimeout para dar cuenta de la apertura y el cierre iniciales, por lo que nunca será completamente preciso. Será una posición de prueba y error.

Añadir esto a su lista de intento.

 0
Author: Michael Giovanni Pumo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 16:57:40

Usando el evento onbeforeunload podemos comprobar lo siguiente

    function popup()
    {
        var chk=false;
        var win1=window.open();
        win1.onbeforeunload=()=>{
            var win2=window.open();
            win2.onbeforeunload=()=>{
                chk=true;
            };
        win2.close();
        };
        win1.close();
        return chk;
    }

Se abrirá 2 ventanas negras en el fondo

La función devuelve el valor booleano.

 0
Author: Yash Bora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-29 15:56:05