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

votos
88

Ocasionalmente, me he topado 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?

Publicado el 05/08/2008 a las 23:01
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
109

Si usa JavaScript para abrir la ventana emergente, puede usar algo como esto:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
Respondida el 05/08/2008 a las 23:03
fuente por usuario

votos
30

He intentado un número de los ejemplos anteriores, pero no podía llegar a trabajar con Chrome. Este enfoque simple parece que funciona con Chrome 39, Firefox 34, Safari 5.1.7, y el IE 11. Aquí está el fragmento de código de nuestra biblioteca de 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.");
    }
}
Respondida el 31/12/2014 a las 19:16
fuente por usuario

votos
24

Esta solución para la comprobación de bloqueo de ventanas emergentes ha sido probado en FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 y v9). Actualizar 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! :)

Respondida el 30/11/2012 a las 21:39
fuente por usuario

votos
10

Una "solución" que siempre trabajar independientemente de la empresa o de la versión del navegador es simplemente poner un mensaje de advertencia en la pantalla, en algún lugar cerca de la de control que va a crear un pop-up, que cortésmente advierte al usuario de que la acción requiere un emergente y para complacer a fin de que para el sitio.

Sé que no es lujoso ni nada, pero no puede ser más simple y sólo requiere una prueba de unos 5 minutos, a continuación, puede pasar a otras pesadillas.

Una vez que el usuario ha permitido ventanas emergentes para su sitio, también sería considerado si no se exceda las ventanas emergentes. La última cosa que quieres hacer es molestar a sus visitantes.

Respondida el 26/02/2016 a las 19:49
fuente por usuario

votos
0

Mediante el uso de onbeforeunload caso podemos comprobar como sigue

    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 en el fondo negro

la función devuelve valor booleano.

Respondida el 29/05/2018 a las 11:56
fuente por usuario

votos
0

He intentado muchas soluciones, pero la única que pude llegar a que también trabajó con uBlock origen, era mediante la utilización de un tiempo de espera para comprobar 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.

Es necesario para proporcionar suficiente tiempo en su setTimeout para dar cuenta de la apertura y el cierre inicial, por lo que nunca va a estar completamente exacta. Será una posición de prueba y error.

Agregue esto a su lista de intentos.

Respondida el 30/01/2018 a las 09:29
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more