Eu tenho um timer no meu JavaScript que precisa emular o clique em um link para ir para outra página depois que o tempo passa. Para fazer isso, estou usando a click()
função jQuery . Eu usei $().trigger()
e window.location
também, e posso fazê-lo funcionar como planejado com todos os três.
Eu observei algum comportamento estranho click()
e estou tentando entender o que acontece e por quê.
Estou usando o Firefox para tudo o que descrevo nesta pergunta, mas também estou interessado no que outros navegadores farão com isso.
Se eu não usei $('a').bind('click',fn)
ou $('a').click(fn)
defini um manipulador de eventos, a chamada $('a').click()
parece não fazer nada. Ele não chama o manipulador padrão do navegador para este evento, pois o navegador não carrega a nova página.
No entanto, se eu definir um manipulador de eventos primeiro, ele funcionará conforme o esperado, mesmo que o manipulador de eventos não faça nada.
$('a').click(function(){return true;}).click();
Isso carrega a nova página como se eu tivesse clicado no a.
Portanto, minha pergunta é dupla: esse comportamento é estranho porque estou fazendo algo errado em algum lugar? e por que chamar não click()
faz nada com o comportamento padrão se eu não criei meu próprio manipulador?
EDITAR:
Como Hoffman determinou quando tentou duplicar meus resultados, o resultado que descrevi acima não acontece realmente. Não sei ao certo o que causou os eventos que observei ontem, mas hoje estou certo de que não foi o que descrevi na pergunta.
Portanto, a resposta é que você não pode "falsificar" cliques no navegador e tudo o que o jQuery faz é chamar seu manipulador de eventos. Você ainda pode usar window.location
para alterar a página, e isso funciona bem para mim.
Respostas:
Interessante, essa é provavelmente uma "solicitação de recurso" (ou seja, bug) para o jQuery. O evento click do jQuery aciona apenas a ação click (chamada evento onClick no DOM) no elemento se você vincular um evento jQuery ao elemento. Você deve ir para as listas de discussão do jQuery ( http://forum.jquery.com/ ) e relatar isso. Esse pode ser o comportamento desejado, mas acho que não.
EDITAR:
Fiz alguns testes e o que você disse está errado, mesmo que você vincule uma função a uma tag 'a', ela ainda não o levará ao site especificado pelo atributo href. Tente o seguinte código:
Ele nunca acessa o google.com, a menos que você clique diretamente no link (com ou sem o código comentado). Observe também que, mesmo que você vincule o evento click ao link, ele ainda não ficará roxo quando você clicar no botão. Só fica roxo se você clicar no link diretamente.
Eu fiz algumas pesquisas e parece que o .click não deve funcionar com as tags 'a' porque o navegador não suporta "cliques falsos" com javascript. Quero dizer, você não pode "clicar" em um elemento com javascript. Com as tags 'a', você pode acionar o evento onClick, mas o link não muda de cor (para a cor do link visitado, o padrão é roxo na maioria dos navegadores). Portanto, não faria sentido fazer o evento $ (). Click funcionar com as tags 'a', pois o ato de ir para o atributo href não faz parte do evento onClick, mas é codificado no navegador.
fonte
Outra opção é, obviamente, usar apenas o javascript de baunilha:
fonte
Se você olhar para o código da
$.click
função, aposto que há uma declaração condicional que verifica se o elemento possui ouvintes registrados para oclick
evento antes de prosseguir. Por que não obter ohref
atributo no link e alterar manualmente o local da página?EDIT: Aqui está o motivo pelo qual ele não clica na
trigger
fonte jQuery da versão 1.3.2:Depois de chamar manipuladores (se houver), o jQuery dispara um evento no objeto. No entanto, ele chama apenas manipuladores nativos para eventos de clique se o elemento não for um link. Eu acho que isso foi feito propositadamente por algum motivo. Isso deve ser verdade, independentemente de um manipulador de eventos ser definido ou não, portanto, não sei por que, no seu caso, anexar um manipulador de eventos fez com que o
onClick
manipulador nativo fosse chamado. Você terá que fazer o que eu fiz e percorrer a execução para ver para onde está sendo chamada.fonte
Os manipuladores de cliques nas tags âncora são um caso especial no jQuery.
Eu acho que você pode estar ficando confuso entre o evento onclick da âncora (conhecido pelo navegador) e o evento click do objeto jQuery que envolve a noção de DOM da tag anchor.
Você pode baixar a fonte do jQuery 1.3.2 aqui .
As seções relevantes da fonte são as linhas 2643-2645 (eu dividi isso em várias linhas para facilitar a compreensão):
fonte
JS / jQuery não suporta o comportamento padrão dos links "clicados" programaticamente.
O que você pode fazer é criar um formulário e enviá-lo. Dessa forma, você não precisa usar
window.location
ouwindow.open
, que geralmente são bloqueados como pop-ups indesejados pelos navegadores.Esse script possui 2 métodos diferentes: um que tenta abrir 3 novas guias / janelas (abre apenas 1 no IE e Chrome, mais informações abaixo) e outro que aciona um evento personalizado ao clicar no link.
Aqui está como:
HTML
jQuery (script.js)
O que ele faz é para cada elemento do link:
Agora você tem um novo carregamento de guia / janela
"https://google.nl"
(ou qualquer URL que desejar, basta substituí-lo). Infelizmente, ao tentar abrir mais de uma janela dessa maneira, você recebe umaPopup blocked
barra de mensagens ao tentar abrir a segunda (a primeira ainda está aberta).Mais informações sobre como cheguei a esse método são encontradas aqui:
Abrir nova janela / guia sem usar
window.open
ouwindow.location.href
fonte
Acione um elemento Hyperlink que esteja dentro do elemento que você deseja conectar ao jquery .click ()
No seu script, você conecta ao contêiner principal no qual deseja o evento click. Então você usa a metodologia jquery padrão para encontrar o elemento (tipo, classe, ID) e acionar o clique. O que acontece é que o jquery entra em uma função recursiva para acionar o clique e você interrompe a função recursiva ao pegar a função de evento 'e' e stopPropagation () e retornar false porque você não deseja que o jquery faça mais nada além de acionar o link.
A solução alternativa é envolver os contêineres no elemento e colocá-los como contêineres dentro, em vez de s. Defina os vãos para exibir o bloco em conformidade com os padrões w3c.
fonte
Você pode usar o jQuery para selecionar o objeto jQuery para esse elemento. Em seguida, obtenha o elemento DOM subjacente e chame seu
click()
método.por id
ou use o jQuery para clicar em vários links por classe CSS
fonte
Não faz nada porque nenhum evento foi vinculado ao evento. Se bem me lembro, o jQuery mantém sua própria lista de manipuladores de eventos que estão vinculados a NodeLists para desempenho e outros fins.
fonte
Se você precisar desse recurso para um caso ou muito poucos casses. (o aplicativo inteiro não está exigindo esse recurso) Prefiro deixar o jQuery como está (por vários motivos, incluindo a possibilidade de atualizar para versões mais recentes, CDN etc.) e ter a seguinte solução alternativa:
fonte
Para abrir o hiperlink na mesma guia, use:
fonte