Estou procurando algumas informações sobre como implementar o tratamento de eventos personalizado no jquery da melhor maneira. Eu sei como conectar eventos dos elementos dom como 'click' etc, mas estou construindo uma pequena biblioteca / plugin javascript para lidar com algumas funcionalidades de visualização.
Eu tenho um script em execução para atualizar algum texto em um elemento dom a partir de um conjunto de regras e dados / entrada de usuário que obtive, mas agora preciso do mesmo texto mostrado em outros elementos que esse script não pode conhecer. O que eu preciso é de um bom padrão para observar de alguma forma esse script produzindo o texto necessário.
Então, como faço isso? Eu negligenciei algumas funcionalidades internas no jquery para aumentar / manipular eventos do usuário ou preciso de algum plugin jquery para fazer isso? Qual você acha que é a melhor maneira / plugin para lidar com isso?
Respostas:
Dê uma olhada neste:
(reimpresso da página expirada do blog http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ com base na versão arquivada em http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Publicar / Assinar com jQuery
17 de junho de 2008
Com o objetivo de escrever uma interface do usuário do jQuery integrada à funcionalidade off-line do Google Gears, tenho usado algum código para pesquisar o status da conexão de rede usando o jQuery.
O objeto de detecção de rede
A premissa básica é muito simples. Criamos uma instância de um objeto de detecção de rede que pesquisará uma URL em intervalos regulares. Se essas solicitações HTTP falharem, podemos assumir que a conectividade da rede foi perdida ou o servidor está inacessível no momento.
Você pode ver a demonstração aqui. Defina seu navegador para trabalhar offline e veja o que acontece…. não, não é muito emocionante.
Trigger and Bind
O que é empolgante (ou pelo menos o que me empolga) é o método pelo qual o status é retransmitido através do aplicativo. Eu me deparei com um método amplamente discutido de implementar um sistema pub / sub usando os métodos trigger e bind do jQuery.
O código de demonstração é mais obtuso do que precisa ser. O objeto de detecção de rede publica eventos de 'status' no documento que os escuta ativamente e, por sua vez, publica eventos de 'notificação' a todos os assinantes (mais sobre os que serão posteriormente). O raciocínio por trás disso é que, em um aplicativo do mundo real, provavelmente haveria mais lógica controlando quando e como os eventos de 'notificação' são publicados.
Devido à abordagem centrada no DOM, os eventos do jQuery são publicados para (acionados) elementos do DOM. Pode ser o objeto de janela ou documento para eventos gerais ou você pode gerar um objeto jQuery usando um seletor. A abordagem adotada na demonstração é criar uma abordagem quase espaçada para definir assinantes.
Os elementos DOM que devem ser assinantes são classificados simplesmente com "subscriber" e "networkDetection". Podemos publicar eventos apenas para esses elementos (dos quais existe apenas um na demonstração) acionando um evento de notificação em
$(“.subscriber.networkDetection”)
A
#notifier
div que faz parte do.subscriber.networkDetection
grupo de assinantes tem uma função anônima vinculada a ela, atuando efetivamente como ouvinte.Então, lá vai você. É tudo bem detalhado e meu exemplo não é nada emocionante. Também não mostra nada de interessante que você possa fazer com esses métodos, mas se alguém estiver interessado em procurar na fonte, sinta-se à vontade. Todo o código está embutido no cabeçalho da página de demonstração
fonte
O link fornecido na resposta aceita mostra uma boa maneira de implementar o sistema pub / sub usando jQuery, mas achei o código um pouco difícil de ler, então aqui está minha versão simplificada do código:
http://jsfiddle.net/tFw89/5/
fonte
n
número de argumentos.var eventData = [].slice.call(arguments).splice(1)
Eu acho que sim .. é possível 'ligar' eventos personalizados, como (de: http://docs.jquery.com/Events/bind#typedatafn ):
fonte
myCustomEvent
é gerado, a ligação na parte superior adiciona um ouvinte.Eu tinha uma pergunta semelhante, mas estava realmente procurando uma resposta diferente; Estou procurando criar um evento personalizado. Por exemplo, em vez de sempre dizer isso:
Quero abreviá-lo para isso:
trigger e bind não contam toda a história - este é um plugin JQuery. http://docs.jquery.com/Plugins/Authoring
A função "enterKey" é anexada como uma propriedade ao jQuery.fn - este é o código necessário:
http://jsfiddle.net/b9chris/CkvuJ/4/
Um dos detalhes acima é que você pode manipular a entrada do teclado normalmente em ouvintes de link, como:
Edições: atualizadas para passar adequadamente o
this
contexto correto para o manipulador e retornar qualquer valor de retorno do manipulador para o jQuery (por exemplo, no caso de você querer cancelar o evento e fazer bolhas). Atualizado para passar um objeto de evento jQuery adequado para os manipuladores, incluindo código de chave e capacidade de cancelar o evento.Jsfiddle antigo: http://jsfiddle.net/b9chris/VwEb9/24/
fonte
scroll
, que não se propaga. Penso que, em vez de ter os ouvintes codificados no corpo, preciso dos elementos que têm oon
-evento vinculado a eles para disparar o evento eles mesmos.É um post antigo, mas tentarei atualizá-lo com novas informações.
Para usar eventos personalizados, é necessário vinculá-lo a algum elemento DOM e ativá-lo. Então você precisa usar
e
O código fica assim:
Uma boa explicação pode ser encontrada aqui e aqui . Por que exatamente isso pode ser útil? Eu descobri como usá-lo nesta excelente explicação do engenheiro do twitter .
PS Em javascript comum, você pode fazer isso com o novo CustomEvent , mas cuidado com os problemas do IE e do Safari.
fonte
Aqui está como eu crio eventos personalizados:
Concedido, você poderia simplesmente fazer
Mas a maneira como escrevi permite detectar se o usuário impediu o padrão ou não fazendo
Isso permite que você ouça a solicitação do usuário final para interromper o processamento de um evento específico, como se você clicar em um elemento de botão em um formulário, mas não desejar que o formulário seja publicado se houver um erro.
Eu costumo ouvir eventos como esse
Mais uma vez, você poderia fazer
Mas sempre achei isso um tanto inseguro, principalmente se você estiver trabalhando em equipe.
Não há nada errado com o seguinte:
No entanto, suponha que eu precise desvincular este evento por qualquer motivo (imagine um botão desativado). Então eu teria que fazer
Isso removerá todos os
eventname
eventos de$(element)
. Você não pode saber se alguém no futuro também vinculará um evento a esse elemento e, inadvertidamente, também desvinculará esse evento.A maneira segura de evitar isso é colocar um namespace em seus eventos, fazendo
Por fim, você deve ter notado que a primeira linha foi
Eu pessoalmente sempre unbind um evento antes obrigatório apenas para se certificar de que o mesmo manipulador de eventos nunca é chamado várias vezes (imagine esse foi o botão enviar em um formulário de pagamento e o evento tinha sido obrigado 5 vezes)
fonte