Quero mostrar uma caixa de diálogo JQuery condicionalmente no evento de clique de um hiperlink.
Eu tenho um requisito como na condição1 abrir um diálogo JQuery e se a condição1 não for satisfeita, navegue até a página conforme referenciado pela tag 'href' cujo evento de clique está em questão.
Consigo chamar uma função no evento de clique do link. Esta função agora verifica a referida condição executando outra URL (que executa meu controlador Spring e retorna uma resposta).
Tudo funciona perfeitamente com apenas window.open sendo bloqueado pelo bloqueador de pop-up.
$('a[href*=/viewpage?number]').live('click', function(e) {
e.preventDefault();
redirectionURL = this.href;
pageId= getUrlVars(redirectionURL)["number"];
$.getJSON("redirect/" + pageId, {}, function(status) {
if (status == null) {
alert("Error in verifying the status.");
} else if(!status) {
$("#agreement").dialog("open");
} else {
window.open(redirectionURL);
}
});
});
Se eu remover e.preventDefault();
do código, o bloqueador de popoup não bloqueia a página, no entanto, para a condição1, ele abre a caixa de diálogo, bem como abre a página 'href'.
Se eu resolver um, criará problemas para outro. Não sou capaz de fazer justiça a ambas as condições simultaneamente.
Você poderia me ajudar a resolver este problema, por favor?
Assim que isso for resolvido, tenho outro problema para resolver, ou seja, a navegação no evento OK do diálogo :)
fonte
Respostas:
Os bloqueadores de pop-up normalmente só permitirão
window.open
se usados durante o processamento de um evento do usuário (como um clique). No seu caso, você está ligandowindow.open
mais tarde , não durante o evento, porque$.getJSON
é assíncrono.Você tem duas opções:
Faça outra coisa, em vez de
window.open
.Faça a chamada ajax síncrona, que é algo que você normalmente deve evitar como uma praga, pois bloqueia a IU do navegador.
$.getJSON
é equivalente a:... e assim você pode fazer sua
$.getJSON
chamada síncrona mapeando seus parâmetros para o acima e adicionandoasync: false
:Novamente, eu não defendo chamadas ajax síncronas se você puder encontrar qualquer outra maneira de atingir seu objetivo. Mas se você não puder, aí está.
Aqui está um exemplo de código que falha no teste por causa da chamada assíncrona:
Exemplo ao vivo | Fonte ao vivo(os links ao vivo não funcionam mais devido às mudanças no JSBin)E aqui está um exemplo que funciona, usando uma chamada síncrona:
Exemplo ao vivo | Fonte ao vivo(os links ao vivo não funcionam mais devido às mudanças no JSBin)fonte
você pode chamar window.open sem o bloqueio do navegador apenas se o usuário realizar alguma ação diretamente. O navegador envia alguma bandeira e determina a janela aberta pela ação do usuário.
Então, você pode tentar este cenário:
fonte
myWindow.postMessage
), mas devido à restrição do Safaris de não executar JavaScript em segundo plano, a janela pai nunca pode enviar essa mudança de local.Eu tive esse problema e não tinha meu url pronto até que o retorno de chamada retornasse alguns dados. A solução foi abrir a janela em branco antes de iniciar o retorno de chamada e então apenas definir o local quando o retorno de chamada retornar.
fonte
action().then(doWindowOpenThing).catch(doSomethingElseThatDoesntOpenAPopup)
então não posso abrir uma janela antes (para guardar a referência, etc) se depois não vou mais usar, certo?tente isso, funciona para mim,
É violar este http://jsfiddle.net/safeeronline/70kdacL4/1/
fonte
O Windows deve ser criado na mesma pilha (também conhecido como microtarefa ) que o evento iniciado pelo usuário, por exemplo, um retorno de chamada de clique - para que não possam ser criados posteriormente, de forma assíncrona.
No entanto, você pode criar uma janela sem um URL e, em seguida, alterar o URL dessa janela assim que o souber , mesmo de forma assíncrona!
Os navegadores modernos abrirão a janela com uma página em branco (frequentemente chamada
about:blank
) e, supondo que sua tarefa assíncrona para obter a URL seja bastante rápida, o UX resultante é geralmente bom. Se você quiser renderizar uma mensagem de carregamento (ou qualquer coisa) na janela enquanto o usuário espera, você pode usar URIs de dados .fonte
Este código me ajuda. Espero que ajude algumas pessoas
fonte
Tente usar um elemento de link e clique nele com javascriipt
e o roteiro
Use assim
fonte
A observação de que o evento tinha que ser iniciado pelo usuário me ajudou a descobrir a primeira parte disso, mas mesmo depois disso o Chrome e o Firefox ainda bloquearam a nova janela. A segunda parte foi adicionar target = "_ blank" ao link, que foi mencionado em um comentário.
Em resumo: você precisa chamar window.open de um evento iniciado pelo usuário, neste caso clicando em um link, e esse link precisa ter target = "_ blank".
No exemplo abaixo, o link está usando class = "button-twitter".
fonte
isso funcionou para mim.
fonte
Estou usando esse método para evitar o bloqueador de pop-up em meu código React. funcionará em todos os outros códigos javascript também.
Quando você estiver fazendo uma chamada assíncrona no evento de clique, apenas abra uma janela em branco primeiro e depois escreva o URL quando a chamada assíncrona for concluída.
sobre o sucesso da chamada assíncrona, escreva o seguinte
fonte