Pergunta

Eu escrevi aplicativos orientados a eventos C ++ usando o MFC para GUI botões, e eu uso eventos HTML como onmousedown para acionar alguns Javascript em uma página web. A idéia de programação orientada a eventos é intuitivo quando você estiver usando a interface e os eventos são codificados.

Eu sei como usar um ponteiro de função em C, e vejo como o Windows usa para executar um ciclo de eventos. Eu posso escrever código para chamar dinamicamente uma função diferente.

O meu problema é que, se afastando de tempo de compilação e em tempo de execução. Eu estou falando qualquer língua aqui, mas se você precisa de um idioma, escolha Javascript ou PHP como eu usá-los a maioria destes dias. Eu não tenho um aperto em todos como eu poderia usar o meu próprio objeto de evento para fazer algo. Não é apenas um conceito que eu recebo. E desde que eu não usá-los, eu não sei o seu uso prático pode ser.

Por exemplo, eu acho que se eu queria fazer um jogo baseado em turnos costume que eu poderia usar o evento objetos para representar um efeito de alguma habilidade jogo peças que as necessidades só para "acontecer".

Alguém pode me dar um uso simples de eventos personalizados? Ou situações em que é útil ou prático? Será que depende em grande parte da linguagem e ambiente e como os eventos são tratados? A Javascript resposta seria bom, mas eu li muitas línguas.

Desculpe, eu sou apenas deficiente nesta matéria e precisam de algum avançado (? Intermediário) uma visão prática,. É como ponteiros em C. Eu ponteiros "get" e como eles são seu amigo. Mas houve um tempo em que eu não fiz, e muitas pessoas que eu conheço ainda não. É simples uma vez que você obtê-lo, eu simplesmente não entendo costume, eventos dinâmicos dessa forma.

Foi útil?

Solução

Quando falamos de programação orientada a eventos, estamos geralmente falando de um ou mais implementações do observador padrão de design . E um objetivo do padrão de design do observador é conseguir baixo acoplamento entre os objetos

Isso provavelmente não significa muito sem um bom exemplo, e há certamente muitos bons lá fora; Duvido meu será o melhor deles, mas eu vou dar uma pancada nele mesmo assim. Imagine que dois objetos. Um objeto quer saber quando algo acontece com o outro objeto, para que ele possa fazer alguma coisa em si - talvez o cão da família, Rover, quer cumprimentar o pai na porta quando ele chegar em casa do trabalho. Há um par de maneiras que você pode programar esse cenário, certo?

  • Certifique-se de papai tem uma referência para Rover, e quando ele chega em casa, chame greetDatAtTheDoor do Rover () método, ou

  • Dê Rover uma referência ao pai, ouvir para o evento onArriveHome do meu pai, e quando ele é acionado, chamada greetDadAtTheDoor () internamente.

Na superfície, pode não parece haver muita diferença entre os dois, mas, na verdade, papai tem alguns dos implementação do Rover queimado dentro dele; se a implementação de Rover teve que mudar por algum motivo, nós teríamos que fazer mudanças em dois locais: uma vez em Rover, e depois novamente em papai. Não é um grande negócio, talvez, mas ainda assim, não é o ideal.

Agora imagine a mãe quer para cumprimentar o pai também. E o gato, Mr. Bigglesworth, quem não gosta de papai muito, quer ter certeza de que ele não está por perto, então ele prefere ir para fora. E um vizinho, Joe, quer saber quando o pai chegar em casa, para que ele possa bug ele sobre isso vinte dólares pai lhe deve. Como podemos explicar todos esses cenários, e os adicionais que inevitavelmente vai surgir? Colocar referências a greetHusband da mãe () método, o método do gato getOutNow (), o método do cão greetDadAtTheDoor () e Joe goGetMyMoney () método para definição de classe do pai iria estragar as coisas rápido para o pai - e por nenhuma boa razão, pois todos pai realmente precisa fazer, ele mesmo, é voltar para casa. Mãe, o cão, o gato, eo vizinho só quero ser notificado quando isso acontece, para que eles possam fazer o que suas implementações internas exigem.

Línguas lidar com as especificidades deste material de diferentes maneiras, mas como você verá quando você começa pesquisando por aí, o padrão geralmente envolve haver um array, ou matriz-como estrutura, no evento "despachante" (neste caso, o pai - ou seja, o objeto todo mundo está em interessado), e os "assinantes" (por exemplo, a mãe, o gato, Rover, e Joe) todos "registrar" chamando um método exposto publicamente sobre o despachante e passando referências a si mesmos - referências que acabam, de alguma forma, na matriz de papai "assinantes". Então, quando o pai chega em casa, ele "despacha" um evento - o "Eu estou em casa" evento, digamos - que é essencialmente uma função que faz um loop sobre cada um de seus assinantes e invoca-los com algum método acessível publicamente de sua própria - só que é um método cujo nome Papai não sabe, não tem que saber, porque o ouvinte desde que quando ele / ela / ele passou-o em.

Desde que acontecer com código principalmente ActionScript estes dias, aqui está como ele pode olhar no meu mundo - digamos, conforme declarado dentro da minha classe Mom:

var dad:Dad = new Dad();
dad.addEventListener(DadEvent.ARRIVED_HOME, greetHusbandAtDoor);

private function greetHusbandAtDoor(event:DadEvent):void
{
   // Go greet my husband
}

Em Pai, então, tudo o que tenho que fazer, quando chego em casa, é:

dispatchEvent(new DadEvent(DadEvent.ARRIVED_HOME));

... e porque o Flash manipula o evento-despacho e notificação detalhes para mim (mais uma vez, todo mundo faz isso um pouco diferente, mas internamente, Flash segue o modelo conceitual que eu descrevi), meu pai chega em casa, e cada membro da família faz o que se inscreveram para fazer automaticam.

Esperamos que explica um pouco as coisas - o que parece-pensar evento como, o que perdem meios de acoplamento, porque é importante, e assim por diante. Melhor da sorte!

Outras dicas

Em um langauge compilado, você escreve o seu próprio ciclo de eventos. Em uma linguagem tempo de execução, ele é implementado por meio de acolhimento já, e o programador só fica uma interface abstrata para o sistema de eventos. Você nunca vê o ciclo de eventos.

Há duas facetas para a construção de funcionalidade com eventos. O primeiro é a definição das condições sob as quais um evento dispara. Em JavaScript em um navegador, não há um único "mousedown" do evento. Há, de facto, um para cada elemento na página. Neste caso, a condição para que qualquer um deles vai disparar baseia-se tanto sobre a localização do cursor do mouse, e se o botão do mouse tem apenas mudaram de estado até o estado para baixo. Esta condição pode causar vários eventos para fogo. (No navegador, há algo chamado de evento "borbulhante" que está relacionado a isso. Mas isso é fora do escopo aqui).

A outra faceta é o manipulador de eventos. Um evento acontece independentemente de se há um manipulador para ele ou não. Fornecendo o manipulador é até você. Em javascript, funções são valores de primeira classe. Eles são definidos em tempo de execução, não em tempo-compilação Portanto, não há necessidade de ponteiros ou tabelas de salto. Você cria uma nova função em tempo de execução, e você atribuí-la a uma propriedade especial que o ambiente de acolhimento olha para cima quando um determinado evento é acionado.

assim por diante estouro de pilha, haverá um manipulador de eventos em cada um dos "onclick" eventos da seta para baixo, o que torna a seta vermelha, diminui um número, verifica alguma outra variável e condicionalmente mostra uma notificação. Então, quando o manipulador returns- ele retorna o controle do fio para o navegador, e Aleluia o usuário pode interagir com o navegador novamente. (Todas as interações cessar enquanto um evento é tratado, por isso é melhor fazê-lo rápido). Aqui está um exemplo usando a biblioteca jQuery.

jQuery("a .downarrow")
.click(function(e){ e.target.style.color="red" /* ... do other things */ });

ou em JavaScript bruto (versão 1.6) pode ser

Array.prototype.slice.apply(document.getElementsByTagName("a"))
.filter(function(o){ return !!(/downarrow/).exec(o.className)})
.forEach(function(o){ 
    o.onclick= function(e){ 
        e.target.style.color="red" /* ...do other things * / 
    }
 });

É realmente muito simples. A principal razão você faria algo como isso é que permite a interação assíncrona. A aplicação gui não progride em uma linha reta, passo a passo. Tem que responder dinamicamente para a entrada do usuário. Os eventos são uma maneira de tipo de falso a aparência de um aplicativo com vários segmentos. Ele pode olhar para o usuário que muitas coisas estão acontecendo simultaneamente sem interromper o outro.

Você pode usar uma biblioteca para definir um evento personalizado. Isso talvez codificar algum evento específico de domínio. Por exemplo: você tem um jogo de xadrez que está pensando em seu próximo passo. o processo para procurar o movimento é executado fora do tempo. O jogo de xadrez poderia disparar um evento "onComputerMove". Você poderia lidar com esse evento com uma função que pega as especificações para o movimento, e atualiza a representação visual do tabuleiro de xadrez, e aparece uma mensagem para o usuário, e sai. Então, quando o jogador move você pode disparar um evento "onPlayerMove", que faz grande parte a mesma coisa.

A coisa mais maravilhosa sobre os eventos é que é reduzir o acoplamento explícita bidireccional entre dois módulos ou classes.

Então, vamos dizer que tenho duas classes: Bebê e mamãe


Sem eventos, vejo mais ou menos dois métodos para permitir que uma mamãe para alimentar um bebê:

  • mãe chama o método baby.pokeBelly() sobre o bebê a cada meia hora para saber se você tem que baby.fillWith(milk) chamada.
    O problema é que o fio de mamãe tem que esperar durante todo o dia depois que o bebê em um loop while
  • Baby sabe sua mamãe associados e chamar um método mommy.feed(me), que por sua vez chama baby.fillWith(milk).
    O problema é então que pedir um bebê simples para pedir a mãe certa para preencher sua barriga.
    Os bebês não fazer isso como eles devem permanecer simples.

Com eventos, você pode vincular um Mommy.OnBabyCries(baby) ao evento baby.Cry de seu babie:

void Mommy.OnBabyCries(baby) {
    baby.fillWith(milk)
}

Depois disso, se o bebê quer comer, tudo o que tem a fazer é levantar o evento Cry.

As estadias lógica na mamãe, ou mesmo mais tarde em qualquer Babá e estadias bebê feliz, sem ter que se preocupar.

Eu não sei se eu entendi totalmente sua pergunta, mas uma classe com um evento é apenas como um GUI com um botão. Basta pensar nisso como um homonculus ... Dentro de cada classe com um evento há um pouco pessoa com um botão virtual para imprensa. Ele não sabe o que o botão vai fazer, mas ele sabe quando pressioná-lo. Agora pense em uma classe relacionada com outra pessoa pouco nele. Essa pessoa sabe que quando ele ouve uma mensagem de que um botão foi pressionado, ele deveria fazer alguma coisa.

Quando você quer o segundo cara de saber sobre algo que o primeiro cara fez, você se conecta a central entre a primeira classe e segunda classe (Inscrever-se para o evento). Quando o primeiro cara aperta o botão (incêndios do evento), o segundo cara faz tudo o que ele sabe que é suposto fazer ...

Não sei se isso ajuda ou eu sou apenas em uma viagem de pensamento ácido de pouca gente minúscula em meus programas ...

No StackOverflow, quando você vota para baixo, sua reputação cai e sua seta para baixo fica vermelho.

Normalmente, você escrever uma única onclick, atualizar todos os elementos nele, e tente não se esqueça de mudá-lo cada vez que quando as mudanças de layout de página.

Em vez disso, você pode declarar evento onVoteDown, fogo-lo em onclick e subscrever este evento:

  • sua reputação div
  • sua flecha img
  • seu XmlHTTPRequest que envia seu voto para o servidor.

Eu não sou inteiramente certo que tipo de resposta que você está procurando, por isso peço desculpas se isso não é nada perto. ;)


Por costume , você quer dizer ações personalizadas , costume gatilhos , ou verdadeiramente eventos personalizados ?

Por exemplo: Um ação personalizada iria responder a um evento pré-definido (digamos, um clique do mouse), um gatilho personalizado seria simular um clique do mouse via script, e uma evento personalizado seria um ouvinte que não está definido pela linguagem ou não está prontamente disponível.

Se você está procurando eventos personalizados , eu realmente não posso ajudá-lo. Embora, eu não acho que há muito apoio para eles em JavaScript.


Para definir um Action ...

Os eventos são normalmente estabelecida através de propriedades pré-definidas de um objeto, digamos window.onload. Por padrão, eles são todos iguais a undefined ou null. Então, para colocá-los para uso, você tem que configurá-los para o valor de uma função.

Você pode usar uma função "anônimo":

window.onload = function (eventObject) {
    /* ... */
};

Ou configurá-los para uma referência de função (não é o mesmo, mas semelhante a um ponteiro):

function handleOnload(eventObject) {
    /* ... */
}

window.onload = handleOnload; /* note the lack of parenthesis */

Quando o evento é acionado, a função é chamada. Então, em qualquer configuração, quando o carregamento de página termina, o código que você colocar em vez de /* ... */ será executada.

Há também métodos mais formais disponíveis para a criação de eventos. W3C define addEventListener enquanto IE usa attachEvent. Mais informações .

Há uma abundância de referências disponíveis para a aprendizagem da lista de eventos disponíveis. Aqui é 2, que deve dar-lhe uma boa base:


O navegador normalmente lida com o desencadeamento de eventos - tanto para eventos do navegador (onload) ou eventos do usuário (onclick). A propriedade e função são destinadas a responder.

Triggering o seu próprio evento não é a coisa mais fácil de realizar. Para definir completamente um objeto Event leva algum trabalho - e varia entre os navegadores

No entanto, se você não precisa do objeto Event, você pode simplesmente chamar o evento:

window.onload();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top