Quero realizar um evento até estar pronto para dispará-lo, por exemplo
$('.button').live('click', function(e){
e.preventDefault();
// do lots of stuff
e.run() //this proceeds with the normal event
}
Existe um equivalente à run()
função descrita acima?
jquery
jquery-events
Mazatec
fonte
fonte
Respostas:
Não. Após o cancelamento, o evento é cancelado.
No entanto, você pode reiniciar o evento mais tarde, usando um sinalizador para determinar se seu código personalizado já foi executado ou não - como este (ignore a flagrante poluição do espaço para nome):
Uma variante mais generalizada (com o benefício adicional de evitar a poluição global do espaço para nome) poderia ser:
Uso:
Plugin jQuery super-minimalista de bônus com
Promise
suporte:Uso:
fonte
lots_of_stuff_already_done = true;
sinalizador - caso contrário, não há como a função continuar se repetindo.Uma versão mais recente da resposta aceita.
Versão resumida:
Um bom caso de uso para algo assim é onde você pode ter algum código de formulário herdado que funcione, mas foi solicitado que você aprimore o formulário adicionando algo como validação de endereço de e-mail antes de enviar o formulário. Em vez de pesquisar no código postal do formulário de back-end, você pode escrever uma API e, em seguida, atualizar seu código de front-end para acessá-la primeiro antes de permitir que o formulário faça o POST tradicional.
Para fazer isso, você pode implementar um código semelhante ao que escrevi aqui:
fonte
Você pode fazer algo como
fonte
Substitua a propriedade
isDefaultPrevented
assim:IMHO, esta é a maneira mais completa de recuperar o evento com exatamente os mesmos dados.
fonte
e
está indefinido. deveria serevt.preventDefault()
. Tentei editar, mas as minhas edições tem que ser> 6 caracteres e eu acabamos de adicionar 2 :(event.isPropagationStopped = function(){ return false; };
. Também adicionei uma propriedade customizada ao evento para que eu possa detectar no manipulador se a verificação que impediu a ação foi feita, para que não seja feita novamente. Ótimo!É possível usar
currentTarget
oevent
. O exemplo mostra como proceder com o envio do formulário. Da mesma forma, você pode obter funções doonclick
atributo etc.fonte
submit()
o mesmo elemento, não retornará seu código `` $ ('form'). on ('submit') e o refazerá repetidamente?Apenas não execute
e.preventDefault();
ou execute condicionalmente.Você certamente não pode alterar quando a ação original do evento ocorre.
Se você quiser "recriar" o evento original da interface do usuário algum tempo depois (digamos, no retorno de chamada para uma solicitação AJAX), será necessário falsificá-lo de outra maneira (como na resposta do vzwick) ... questionar a usabilidade de tal abordagem.
fonte
Uma resposta mais recente usa habilmente
jQuery.one()
https://stackoverflow.com/a/41440902/510905
fonte
desde que "muitas coisas" não estejam fazendo algo assíncrono, isso é absolutamente desnecessário - o evento chamará todos os manipuladores em seu caminho em sequência; portanto, se houver um evento onklick em um elemento pai, ele será acionado após o onclik- evento da criança foi processado completamente. O javascript não faz algum tipo de "multithreading" aqui que torna "interrompido" o processamento de eventos necessário. conclusão: "pausar" um evento apenas para continuar no mesmo manipulador não faz sentido.
se "muita coisa" é algo assíncrono, isso também não faz sentido, pois impede que as coisas assíncronas façam o que devem fazer (coisas assíncronas) e as fazem se comportar como se tudo estivesse em sequência (onde voltamos ao meu primeiro parágrafo )
fonte
async
-fag: api.jquery.com/jQuery.ajax ) ... mas fazer solicitação de ajax sinônima é uma má ideia em quase todos os casos, então seria melhor encontrar uma solução diferente.A abordagem que eu uso é esta:
fonte
A solução aceita não funcionará se você estiver trabalhando com uma marca de âncora. Nesse caso, você não poderá clicar no link novamente após ligar
e.preventDefault()
. Isso ocorre porque o evento de clique gerado pelo jQuery é apenas uma camada sobre os eventos do navegador nativo. Portanto, o acionamento de um evento 'clique' em uma tag de âncora não seguirá o link. Em vez disso, você pode usar uma biblioteca como jquery-simulate que permitirá iniciar eventos do navegador nativo.Mais detalhes sobre isso podem ser encontrados neste link
fonte
Outra solução é usar window.setTimeout no ouvinte de eventos e executar o código após a conclusão do processo do evento. Algo como...
fonte
Sei que esse tópico é antigo, mas acho que posso contribuir. Você pode disparar o comportamento padrão de um evento em um elemento específico a qualquer momento na função do manipulador, se você já conhece esse comportamento. Por exemplo, quando você aciona o evento click no botão de redefinição, na verdade você chama a função de redefinição no formulário mais próximo como o comportamento padrão. Na sua função de manipulador, depois de usar a função preventDefault, você pode recuperar o comportamento padrão chamando a função de redefinição no formulário mais próximo em qualquer lugar no código do manipulador.
fonte
Se este exemplo puder ajudar, adicione um "popin de confirmação personalizado" em alguns links (eu mantenho o código "$ .ui.Modal.confirm", é apenas um exemplo do retorno de chamada que executa a ação original):
fonte