Estou ciente das técnicas de javascript para detectar se um pop-up está bloqueado em outros navegadores (conforme descrito na resposta a esta pergunta ). Aqui está o teste básico:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
Mas isso não funciona no Chrome. A seção "POPUP BLOCKED" nunca é alcançada quando o popup é bloqueado.
Claro, o teste está funcionando até certo ponto, já que o Chrome não bloqueia o pop-up, mas o abre em uma pequena janela minimizada no canto inferior direito que lista os pop-ups "bloqueados".
O que eu gostaria de fazer é saber se o popup foi bloqueado pelo bloqueador de popup do Chrome. Tento evitar o farejamento do navegador em favor da detecção de recursos. Existe uma maneira de fazer isso sem farejar o navegador?
Editar : Eu já tentei fazer uso de newWin.outerHeight
, newWin.left
e outras propriedades semelhantes para alcançar este objetivo. O Google Chrome retorna todos os valores de posição e altura como 0 quando o pop-up é bloqueado.
Infelizmente, ele também retorna os mesmos valores, mesmo se o pop-up for realmente aberto por um período de tempo desconhecido. Após algum período mágico (alguns segundos no meu teste), as informações de localização e tamanho são retornadas como os valores corretos. Em outras palavras, ainda não estou mais perto de descobrir isso. Qualquer ajuda seria apreciada.
fonte
Respostas:
Bem, o "momento mágico" de que você fala é provavelmente quando o DOM do pop-up foi carregado. Ou então pode ser quando tudo (imagens, CSS externo, etc.) tiver sido carregado. Você pode testar isso facilmente adicionando um gráfico muito grande ao pop-up (limpe o cache primeiro!). Se você estava usando um Javascript Framework como jQuery (ou algo semelhante), você poderia usar o evento ready () (ou algo semelhante) para esperar o DOM carregar antes de verificar o deslocamento da janela. O perigo disso é que a detecção do Safari funciona de forma conflitante: o DOM do pop-up nunca estará pronto () no Safari porque ele fornecerá um identificador válido para a janela que você está tentando abrir - se ela realmente abre ou não. (na verdade, acredito que o código de teste pop-up acima não funcionará no Safari.)
Acho que a melhor coisa que você pode fazer é envolver seu teste em um setTimeout () e dar ao pop-up 3-5 segundos para completar o carregamento antes de executar o teste. Não é perfeito, mas deve funcionar pelo menos 95% do tempo.
Aqui está o código que uso para detecção de navegadores cruzados, sem a parte do Chrome.
O que faço é executar este teste do pai e envolvê-lo em um setTimeout (), dando à janela filho 3-5 segundos para carregar. Na janela filha, você precisa adicionar uma função de teste:
teste de funcionamento() {}
O detector do bloqueador de pop-up testa para ver se a função "teste" existe como um membro da janela filho.
ADICIONADO EM 15 DE JUNHO DE 2015:
Acho que a maneira moderna de lidar com isso seria usar window.postMessage () para que a criança notifique o pai de que a janela foi carregada. A abordagem é semelhante (a criança diz aos pais que está carregada), mas os meios de comunicação melhoraram. Consegui fazer este cross-domain desde a criança:
O pai ouve esta mensagem usando:
Espero que isto ajude.
fonte
Apenas uma melhoria no snipet do InvisibleBacon (testado no IE9, Safari 5, Chrome 9 e FF 3.6):
fonte
A seguir está uma solução jQuery para verificação de bloqueador de pop-up. Ele foi testado em FF (v11), Safari (v6), Chrome (v23.0.127.95) e IE (v7 e v9). Atualize a função _displayError para lidar com a mensagem de erro conforme achar necessário.
Uso:
Espero que isto ajude! :)
fonte
A resposta de Rich não vai funcionar mais para o Chrome. Parece que o Chrome realmente executa qualquer Javascript na janela pop-up agora. Acabei verificando se há um valor de screenX de 0 para verificar se há pop-ups bloqueados. Também acho que encontrei uma maneira de garantir que esta propriedade seja definitiva antes de verificar. Isso só funciona para pop-ups em seu domínio, mas você pode adicionar um gerenciador onload como este:
Como muitos relataram, a propriedade "screenX" às vezes relata diferente de zero para pop-ups com falha, mesmo após onload. Eu também experimentei esse comportamento, mas se você adicionar a verificação após um tempo limite de zero ms, a propriedade screenX sempre parece gerar um valor consistente.
Deixe-me saber se há maneiras de tornar este script mais robusto. Parece funcionar para meus propósitos.
fonte
onload
nunca dispara.Isso funcionou para mim:
OuterHeight e outerWidth são para cromo porque o truque 'about: blank' acima não funciona mais no cromo.
fonte
Vou apenas copiar / colar a resposta fornecida aqui: https://stackoverflow.com/a/27725432/892099 de DanielB. funciona no Chrome 40 e é muito limpo. nenhum hacks sujo ou envolve espera.
fonte
Que tal uma
Promise
abordagem?E você pode usá-lo como o clássico
window.open
Você poderia alterar o código para que ele falhasse a promessa em vez de retornar
undefined
, apenas pensei queif
era um fluxo de controle mais fácil do quetry / catch
neste caso.fonte
Verifique a posição da janela em relação ao pai. O Chrome faz a janela parecer quase fora da tela.
fonte
Eu tive um problema semelhante com pop-ups não abrindo no Chrome. Fiquei frustrado porque não estava tentando fazer algo sorrateiro, como um pop-up onload, apenas abrindo uma janela quando o usuário clicou. Eu estava DUVIDAMENTE frustrado porque executar minha função que incluía o window.open () da linha de comando do firebug funcionou, enquanto clicar no meu link não funcionou! Aqui estava minha solução:
Maneira errada: executando window.open () de um ouvinte de evento (no meu caso, dojo.connect para o método de evento onclick de um nó DOM).
Caminho certo: atribuindo uma função à propriedade onclick do nó que chamou window.open ().
E, é claro, ainda posso fazer ouvintes de evento para o mesmo evento onclick, se necessário. Com essa mudança, eu poderia abrir minhas janelas mesmo que o Chrome estivesse configurado para "Não permitir que nenhum site mostre pop-ups". Alegria.
Se alguém conhecedor do Chrome puder dizer ao restante de nós por que ele faz a diferença, adoraria ouvir, embora suspeite que seja apenas uma tentativa de fechar a porta para popups programáticos maliciosos.
fonte
Esta é uma versão que está funcionando atualmente no Chrome. Apenas uma pequena alteração da solução de Rich, embora eu tenha adicionado um invólucro que controla o tempo também.
Para usá-lo, faça o seguinte:
Se o pop-up for bloqueado, a mensagem de alerta será exibida após o período de cortesia de 5 segundos (você pode ajustar isso, mas 5 segundos deve ser bastante seguro).
fonte
Este fragmento incorpora todos os itens acima - por algum motivo - StackOverflow está excluindo a primeira e a última linha do código no bloco de código abaixo, então escrevi um blog sobre ele. Para obter uma explicação completa e o restante do código (para download), dê uma olhada em meu blog em thecodeabode.blogspot.com
fonte
Uau, com certeza existem muitas soluções aqui. Este é o meu, ele usa soluções retiradas da resposta aceita atual (que não funciona no Chrome mais recente e requer envolvê-la em um tempo limite), bem como uma solução relacionada neste tópico (que é na verdade JS vanilla, não jQuery) .
O meu usa uma arquitetura de retorno de chamada que será enviada
true
quando o pop-up for bloqueado efalse
caso contrário.fonte
A resposta de Jason é o único método que consigo pensar também, mas confiar em uma posição como essa é um pouco duvidoso!
Atualmente, você realmente não precisa fazer a pergunta “meu popup não solicitado foi bloqueado?”, Porque a resposta é invariavelmente “sim” - todos os principais navegadores têm o bloqueador de popup ativado por padrão. A melhor abordagem é apenas window.open () em resposta a um clique direto, que quase sempre é permitido.
fonte
OI
Modifiquei ligeiramente as soluções descritas acima e acho que está funcionando pelo menos para o Chrome. Minha solução é detectar se o pop-up está bloqueado quando a página principal é aberta, não quando o pop-up é aberto, mas tenho certeza que há algumas pessoas que podem modificá-lo. :-) A desvantagem aqui é que a janela pop-up é exibida por alguns segundos (pode ser possível encurtar um pouco) quando não há bloqueador de pop-up.
Eu coloquei isso na seção da minha janela 'principal'
O popuptest se parece com isto:
Como eu chamo a função de teste na página pop-up após 3500 ms, a altura interna foi configurada corretamente pelo Chrome.
Eu uso a variável popUpsBlocked para saber se os pop-ups são exibidos ou não em outros javascripts. ie
fonte
fonte
Até onde eu posso dizer (pelo que testei), o Chrome retorna um objeto de janela com localização de 'sobre: em branco'. Portanto, o seguinte deve funcionar para todos os navegadores:
fonte