Digamos que eu tenho um aplicativo da web que possui uma página que pode conter 4 blocos de script - o script que eu escrevo pode ser encontrado em um desses blocos, mas não sei qual deles é tratado pelo controlador.
Vinculo alguns onclick
eventos a um botão, mas acho que eles às vezes são executados em uma ordem que eu não esperava.
Existe uma maneira de garantir a ordem ou como você lidou com esse problema no passado?
javascript
jquery
events
mkoryak
fonte
fonte
Respostas:
Há anos que eu tentava generalizar esse tipo de processo, mas no meu caso eu estava preocupado apenas com a ordem do primeiro ouvinte de eventos na cadeia.
Se for de alguma utilidade, aqui está o meu plugin jQuery que liga um ouvinte de eventos que é sempre acionado antes de qualquer outro:
** ATUALIZADO em linha com as alterações do jQuery (obrigado Toskan) **
Coisas a serem observadas:
fonte
this.data("events")
, veja aqui stackoverflow.com/questions/12214654/…Se a ordem for importante, você poderá criar seus próprios eventos e ligar os retornos de chamada quando esses eventos forem acionados por outros retornos de chamada.
Algo assim, pelo menos.
fonte
O método de Dowski é bom se todos os seus retornos de chamada sempre estiverem presentes e você ficar feliz com eles dependerem um do outro.
Se você deseja que os retornos de chamada sejam independentes um do outro, você pode tirar vantagem da interferência e anexar eventos subsequentes como delegados aos elementos pai. Os manipuladores nos elementos pai serão acionados após os manipuladores no elemento, continuando até o documento. Isso é muito bom, como você pode usar
event.stopPropagation()
,event.preventDefault()
etc, para pular manipuladores e cancelar ou cancelar a ação.Ou, se você não gostar disso, poderá usar o plug-in bindLast de Nick Leaches para forçar a última vinculação de um evento: https://github.com/nickyleach/jQuery.bindLast .
Ou, se você estiver usando o jQuery 1.5, também poderá fazer algo inteligente com o novo objeto Adiado.
fonte
.delegate
não é usado mais e agora você deve usar.on
, mas eu não sei como você pode alcançar o mesmo comportamento comon
A ordem em que os retornos de chamada associados são chamados é gerenciada pelos dados de eventos de cada objeto jQuery. Não existem funções (que eu conheça) que permitam visualizar e manipular esses dados diretamente; você só pode usar bind () e unbind () (ou qualquer uma das funções auxiliares equivalentes).
O método de Dowski é o melhor, você deve modificar os vários retornos de chamada vinculados para vincular a uma sequência ordenada de eventos personalizados, com o "primeiro" retorno de chamada vinculado ao evento "real". Dessa forma, não importa em que ordem eles estejam vinculados, a sequência será executada da maneira correta.
A única alternativa que eu vejo é algo que você realmente não quer contemplar: se você sabe que a sintaxe de ligação das funções pode ter sido vinculada antes de você, tente desassociar todas essas funções e depois religá-las na ordem correta você mesmo. Isso está apenas pedindo problemas, porque agora você tem código duplicado.
Seria legal se o jQuery permitisse simplesmente alterar a ordem dos eventos vinculados nos dados de evento de um objeto, mas sem escrever algum código para ligar ao núcleo do jQuery que não parece possível. E provavelmente há implicações em permitir isso que eu não tenha pensado, então talvez seja uma omissão intencional.
fonte
Observe que no universo jQuery isso deve ser implementado de maneira diferente da versão 1.8. A seguinte nota de versão é do blog do jQuery:
Temos controle completo da ordem em que os manipuladores serão executados no universo jQuery . Ricoo aponta isso acima. Não parece que sua resposta lhe valeu muito amor, mas essa técnica é muito útil. Considere, por exemplo, sempre que você precisar executar seu próprio manipulador antes de algum manipulador em um widget de biblioteca ou precisar ter o poder de cancelar a chamada ao manipulador do widget condicionalmente:
fonte
basta ligar o manipulador normalmente e, em seguida, execute:
por exemplo:
fonte
$._data(element, 'events')[name].reverse()
funcionafonte
Você pode tentar algo como isto:
fonte
Eu tenho o mesmo problema e encontrei este tópico. as respostas acima podem resolver esses problemas, mas não acho que sejam bons planos.
vamos pensar no mundo real.
se usarmos essas respostas, temos que mudar nosso código. você precisa alterar seu estilo de código. algo assim:
original:
hackear:
À medida que o tempo passa, pense no seu projeto. o código é feio e difícil de ler! anthoer razão é simples é sempre melhor. se você tiver 10 bindAtTheStart, pode haver erros. se você tiver 100 bindAtTheStart, tem certeza de que pode mantê-los na ordem certa?
Então, se você tiver que ligar vários mesmos eventos. Acho que a melhor maneira é controlar a ordem de carregamento do arquivo js ou do código js. jquery pode manipular dados de eventos como fila. o pedido é primeiro a entrar, primeiro a sair. você não precisa alterar nenhum código. basta alterar a ordem de carregamento.
fonte
Aqui está minha chance, cobrindo diferentes versões do jQuery:
fonte
Em alguns casos especiais, quando você não pode alterar como os eventos de clique são vinculados (as ligações de eventos são feitas a partir dos códigos de outras pessoas) e pode alterar o elemento HTML, aqui está uma solução possível ( aviso : esta não é a maneira recomendada de vincular eventos, outros desenvolvedores podem assassiná-lo por isso):
Com essa forma de associação, seu manipulador de eventos será adicionado primeiro e, portanto, será executado primeiro.
fonte
O JQuery 1.5 apresenta promessas, e aqui está a implementação mais simples que eu já vi para controlar a ordem de execução. Documentação completa em http://api.jquery.com/jquery.when/
fonte