Campus Online Javascript Comportamento Comportamento Agora vamos tratar de algo essencial: responder às ações do usuário. Como você deve saber, uma ação que o usuário execute em qualquer objeto de uma página é chamada de "evento". Há duas maneiras de associar código a um evento. A primeira, mais simples e muito comum, é feita diretamente no HTML, assim: <input type="button" value="Excluir" onclick="excluir()"> O código acima gera um botão que, quando recebe o evento click (ou seja, quando o botão é pressionado) executa a função javascript excluir(). Você provavelmente já viu código assim um milhão de vezes. É, em muitos aspectos, a maneira mais fácil de se capturar eventos em uma página simples. Há porém dois problemas básicos com o método que nos levam a querer aprender mais: Falta de flexibilidade: Você não pode criar de maneira transparente um script que mude o comportamente de um objeto. Acoplamento: Um dos objetivos dos Web Standards é que você possa manter separados conteúdo e estrutura (HTML), aparência (CSS) e comportamento (javascript). Além de ferir os modernos princípios do webdesign, ainda destrói qualquer encapsulamento, acoplando seu script ao seu HTML. Acoplamento é a criação de código não organizado, de modo que alterar uma parte simples do código pode exigir alterações em diversas outras partes que usam ou são usadas por aquela. <!--Chamamos, em orientação a objetos, de encapsulamento a propriedade que os objetos possuem de conter todo o código referente ao que eles devem fazer, tornando-os praticamente independentes do lugar onde serão usados e reduzindo drasticamente o acoplamento.-> EventListeners Há, é claro, uma maneira de se atribuir código a um evento em um objeto através de script, o que garante grande flexibilidade e evita o acoplamento. Não se iluda, simplesmente conhecer essa técnica não vai fazer automaticamente com que você desenvolva scripts com bom nível de encapsulamento. É preciso algum estudo e planejamento para isso. Por outro lado, não conhecer estes detalhes vai impedí-lo de realmente separar comportamento de conteúdo. Vamos então ao que interessa. A recomendação do W3C sugere um método, addEventListener, para se atribuir um handler a um evento qualquer. Isso funciona adequadamente em todos os navegadores atuais, exceto o Internet Explorer. Para este, a Microsoft inventou seu próprio jeitinho de fazer as coisas. Trata-se do método attachEvent, que faz exatamente a mesma coisa do método proposto pelo W3C. Felizmente, é muito fácil criar uma função compatível com todos os navegadores: function addEvent(obj, evType, fn){ if (obj.addEventListener) obj.addEventListener(evType, fn, true) if (obj.attachEvent) obj.attachEvent("on"+evType, fn) } Essa função é uma simplificação da usada por Simon Willison. Com ela você pode adicionar um handler de evento a um objeto de maneira simples, funcioando em qualquer navegador atual, como mostrado no exemplo 12. No exemplo 13 você pode ver como é simples separar conteúdo de comportamento. Se você remover a tag <script> no começo do documento vai ter HTML puro, sem vestígios de qualquer DHTML. Tratamento de Eventos Basta agora entendermos como, numa função que recebe um evento, podemos entender qual foi o evento capturado e em que objeto ocorreu. Chamamos a isso de tratar o evento. Novamente, temos aqui uma diferença entre o que o Internet Explorer inventa e o padrão que o resto do mundo segue. Para qualquer navegador basta colocar um argumento na declaração de função que será handler e esse argumento receberá o evento (um objeto da classe Event). No Internet Explorer o evento atualmente sendo tratado é armazenado em window.event. Assim, na função de tratamento de evento ficamos com: recebeClick(e){ if (typeof(e)=='undefined')var e=window.event ... } Basta isso para que em todos os navegadores a variável e contenha o objeto Event. Agora temos outro problema: a forma de capturar o alvo do evento (o objeto que recebeu o evento) também é diferento no Internet Explorer. Ficaremos com o seguinte: recebeClick(e){ if(typeof(e)=='undefined')var e=window.event source=e.target?e.target:e.srcElement ... } Agora está quase pronto. Temos ainda uma diferença na implementação, no Safari (olha só, não é o Internet Explorer quem está criando caso desta vez). Se o objeto que recebe o evento contiver texto, não sendo uma imagem ou campo de formulário, o source capturado será o texto dentro do objeto. Um HTMLNodeElement do tipo 3. Não sei quem foi o maluco que implementou isso, mas agora ficamos assim: recebeClick(e){ if(typeof(e)=='undefined')var e=window.event source=e.target?e.target:e.srcElement if(source.nodeType == 3)source = source.parentNode ... } Você pode ver esse código funcionando no exemplo 14 (função foi()). Pode também ver algo mais complexo feito com isso no exemplo 15 (função sortThisTable()). Está certo. Nesse capítulo o código começou a ficar mais complexo e tivemos que alterar um pouco o código para que funcionasse em todos os browsers. Mas faça as contas. Colocamos uma função a mais, addEvent, no começo de cada script, e três linhas a mais em cada handler de evento. Nada realmente complicado. Cancelando Eventos Conteúdo [email protected] Visie Padrões Web Todos os Direitos Resevados © 2008 Visie Padrões Web