Pergunta

Ocasionalmente, eu vim através de uma página da web que tenta pop abrir uma nova janela (para entrada do usuário, ou algo importante), mas o bloqueador de pop-up impede que isso aconteça.

Quais métodos podem chamar a janela de usar para se certificar de que a nova janela lançado corretamente?

Foi útil?

Solução

Se você usar o JavaScript para abrir o menu de contexto, você pode usar algo como isto:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}

Outras dicas

Eu tentei uma série de exemplos acima, mas eu não podia levá-los a trabalhar com o google Chrome.Esta simples abordagem parece funcionar com o Chrome 39, Firefox 34, Safari 5.1.7, e o internet explorer 11.Aqui está o trecho de código da nossa 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.");
    }
}

Atualização:Pop-ups de existir realmente os tempos antigos.A idéia inicial era mostrar outro conteúdo sem fechar a janela principal.A partir de agora, há outras maneiras de o fazer:JavaScript é capaz de enviar solicitações para o servidor, portanto, pop-ups, que são raramente usadas.Mas, às vezes, eles ainda são úteis.

No passado, o mal sites abusado popups muito.Uma má página pode abrir toneladas de janelas popup com anúncios.Então, agora a maioria dos navegadores tentam bloquear pop-ups e proteger o usuário.

A maioria dos navegadores para bloquear pop-ups, se eles são chamados fora de usuário acionou os manipuladores de eventos como onclick.

Se você pensar sobre isso, que é um pouco complicado.Se o código está diretamente em um manipulador onclick, então o que é fácil.Mas o que é o pop-up é aberta no setTimeout?

Tente este código:

 // open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);

O pop-up abre no Chrome, mas fica bloqueado no Firefox.

...E isso funciona no Firefox também:

 // open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);

A diferença é que o Firefox trata de um tempo de espera de 2000ms ou menos aceitáveis, mas depois que – remove a "confiança", partindo do princípio de que agora é "fora da ação do usuário".O primeiro é bloqueado, e o segundo é não.


Original em uma resposta que foi 2012 atual:

Esta solução para o bloqueador de pop-up de verificação foi testado no FF (v11), Safari (v6), Cromo (v23.0.127.95) & IE (v7 & v9).Atualizar o displayError função para processar a mensagem de erro como você vê o ajuste.

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

Uma "solução" que vai sempre trabalho, independentemente do navegador da empresa ou versão é simplesmente colocar uma mensagem de aviso no ecrã, em algum lugar perto de controle que irá criar uma janela de pop-up, que, educadamente, avisa o usuário que a ação requer uma janela de pop-up e, por favor, capacitá-los para o site.

Eu sei que não é chique nem nada, mas ele não pode ficar mais simples e requer apenas cerca de 5 minutos de teste, em seguida, você pode passar para outros pesadelos.

Uma vez que o usuário tem permissão de pop-ups para o seu site, gostaria de ser atencioso se você não exagerar o bloqueador de pop-ups.A última coisa que você quer fazer é irritar seus visitantes.

Eu tentei muitas soluções, mas o único que eu poderia vir acima com a que também trabalhou com uBlock Origem, foi utilizando um tempo de espera para verificar o status fechado de pop-up.

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, este é um hack;como todas as soluções para este problema.

Você precisa de fornecer tempo suficiente em seu setTimeout a conta para o processo inicial de abertura e de encerramento, por isso nunca vai ser completamente precisas.Vai ser uma posição de tentativa e erro.

Adicionar isso à sua lista de tentativas.

Utilizando o evento onbeforeunload podemos verificar como se segue

    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;
    }

ele vai abrir 2 janelas pretas em fundo

a função retorna o valor booleano.

Eu combinados @Kevin B e @DanielB soluções.
Isso é muito mais simples.

var isPopupBlockerActivated = function(popupWindow) {
    if (popupWindow) {
        if (/chrome/.test(navigator.userAgent.toLowerCase())) {
            try {
                popupWindow.focus();
            } catch (e) {
                return true;
            }
        } else {
            popupWindow.onload = function() {
                return (popupWindow.innerHeight > 0) === false;
            };
        }
    } else {
        return true;
    }
    return false;
};

Uso:

var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
    // Do what you want.
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top