Ocasionalmente, encontrei uma página da Web que tenta abrir uma nova janela (para entrada do usuário ou algo importante), mas o bloqueador de pop-ups impede que isso aconteça.
Quais métodos a janela de chamada pode usar para garantir que a nova janela seja iniciada corretamente?
Eu tentei vários dos exemplos acima, mas não consegui fazê-los funcionar com o Chrome. Essa abordagem simples parece funcionar com o Chrome 39, Firefox 34, Safari 5.1.7 e IE 11. Aqui está o trecho de código da nossa biblioteca JS.
fonte
Atualização: Os pop-ups existem desde os tempos realmente antigos. A ideia inicial era mostrar outro conteúdo sem fechar a janela principal. A partir de agora, existem outras maneiras de fazer isso: o JavaScript pode enviar solicitações de servidor, portanto os pop-ups raramente são usados. Mas às vezes eles ainda são úteis.
No passado, sites malignos abusavam muito de pop-ups. Uma página ruim pode abrir toneladas de janelas pop-up com anúncios. Portanto, agora a maioria dos navegadores tenta bloquear pop-ups e proteger o usuário.
A maioria dos navegadores bloqueia pop-ups se forem chamados fora dos manipuladores de eventos acionados pelo usuário, como o onclick.
Se você pensar bem, isso é um pouco complicado. Se o código estiver diretamente em um manipulador onclick, é fácil. Mas qual é o pop-up aberto no setTimeout?
Tente este código:
O pop-up é aberto no Chrome, mas é bloqueado no Firefox.
… E isso também funciona no Firefox:
A diferença é que o Firefox trata um tempo limite de 2000ms ou menos são aceitáveis, mas depois disso - remove a "confiança", assumindo que agora está "fora da ação do usuário". Então o primeiro está bloqueado e o segundo não.
Resposta original atual em 2012:
Espero que isto ajude! :)
fonte
Content-Disposition: attachment;
no cabeçalho de resposta), o pop-up será fechado imediatamente, portanto osetTimeout
código falhará e o navegador reclamará que "O bloqueador de pop- ups está ativado!". Para o Chrome, eu recomendo a solução do @ DanielB e funciona muito bem.Content-Disposition: attachment;
cabeçalho, você não precisa abri-lo em um pop-up. Basta criar um link direto para o ativo que você deseja baixar e o comportamento nativo do navegador permitirá que você faça o download sem redirecioná-lo para fora da página atual.window.location
, se o primeiro arquivo demorar muito para ser gerado, ele será ignorado quando o segundo pedido for iniciado. Essa é a razão pela qual tenho que usarwindow.open
, poiswindow.location
nunca me avisa quando a resposta termina.Uma "solução" que sempre funcionará, independentemente da empresa ou versão do navegador, é simplesmente colocar uma mensagem de aviso na tela, em algum lugar próximo ao controle que criará um pop-up, que educadamente avisa o usuário que a ação requer um pop- e habilitá-los para o site.
Sei que não é nada chique, mas não pode ser mais simples e requer apenas 5 minutos de teste; então você pode passar para outros pesadelos.
Depois que o usuário permitir pop-ups para o seu site, também será considerado se você não exagerar nos pop-ups. A última coisa que você quer fazer é irritar seus visitantes.
fonte
Combinei as soluções @ Kevin B e @ DanielB.
Isto é muito mais simples.
Uso:
fonte
isPopupBlockerActivated
a função nunca retornareturn (popupWindow.innerHeight > 0) === false;
. Sua função retorna false quando seu navegador não é o Chrome. Porque onload é um processo assíncrono. Sua função retorna false e, em seguida, onload executado, mas seu resultado nunca retorna.Eu tentei muitas soluções, mas a única que eu consegui e que também funcionou com o uBlock Origin foi utilizando um tempo limite para verificar o status fechado do pop-up.
Obviamente, isso é um hack; como todas as soluções para esse problema.
Você precisa fornecer tempo suficiente no seu setTimeout para contabilizar a abertura e o fechamento inicial, para que nunca seja totalmente preciso. Será uma posição de tentativa e erro.
Adicione isso à sua lista de tentativas.
fonte
Uma abordagem simples, se você também possui o código filho , seria criar uma variável simples em seu html, como abaixo:
E, em seguida, verifique a existência do pai com algo semelhante ao seguinte:
Aguardamos algum tempo para garantir que a página da Web foi carregada e verificamos sua existência. Obviamente, se a janela não carregasse após 1500ms, a variável ainda estaria
undefined
.fonte
Usando o evento onbeforeunload, podemos verificar da seguinte forma
ele abrirá 2 janelas pretas em segundo plano
a função retorna valor booleano.
fonte