<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tableless &#187; JQuery</title>
	<atom:link href="http://tableless.com.br/categoria/client-side/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://tableless.com.br</link>
	<description>Tableless - Desenvolvimento inteligente com padrões web</description>
	<lastBuildDate>Fri, 18 May 2012 12:22:56 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Estruturação de Client-side &#8211; Parte 1: Préprocessadores, Framewoks e Bibliotecas</title>
		<link>http://tableless.com.br/estruturacao-de-client-side-preprocessadores-framewoks-e-bibliotecas-parte-1/</link>
		<comments>http://tableless.com.br/estruturacao-de-client-side-preprocessadores-framewoks-e-bibliotecas-parte-1/#comments</comments>
		<pubDate>Wed, 09 May 2012 16:53:47 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Na Prática]]></category>
		<category><![CDATA[O Básico]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[tableless]]></category>
		<category><![CDATA[tecnicascss]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=6094</guid>
		<description><![CDATA[Entenda a diferença entre préprocessadores, frameworks e bibliotecas de client-side. Saiba o que usar em seus projetos e quais as suas particularidades.]]></description>
			<content:encoded><![CDATA[<p>Existem três categorias de &#8220;ferramentas&#8221; que nos ajudam a desenvolver um projeto client-side: Préprocessadores, Frameworks e Bibliotecas.</p>
<h3>Préprocessadores</h3>
<p>Préprocessadores são ferramentas onde você escreve CSS de uma determinada forma, modificando sua sintaxe, fazendo com que na hora de sua utilização o código CSS precise ser préprocessado para que o código escrito seja transformado em código CSS puro e assim então os browsers consigam entender.</p>
<p>Existem muitos préprocessadores no mercado como <a href="http://lesscss.org/">Less</a>, <a href="http://sass-lang.com/">Sass</a>, <a href="http://turbine.peterkroener.de/index.php">Turbine</a>, <a href="http://sourceforge.net/projects/switchcss/">Switch CSS</a> e outros. </p>
<p>Particularmente eu não gosto de usar préprocessadores. Para começar é necessário que você aprenda a linguagem de cada um e a ideia de que seu CSS precisa ser compilado para poder funcionar não me agrada muito. O CSS é simples demais para complicarmos desse jeito. Entretanto, há uma série de coisas interessantes que podemos fazer com os préprocessadores como variáveis, funções, operações e etc que demorarão um pouco (ou não) para fazerem parte do core definitivo da linguagem. Mesmo assim, pessoalmente, para a maioria dos projetos, não vale a pena.</p>
<h3>Frameworks</h3>
<p>Frameworks são diferentes de préprocessadores mas são muito parecidos com Bibliotecas. Um Framework disponibiliza para o dev um conjunto de estilos e estruturas prontas para a utilização em projetos de forma escalável e uniforme. Normalmente os frameworks te dão uma coleção de componentes para que sejam usadas por todo o projeto. Esses componentes na maioria das vezes já vem com estilos visuais aplicados, bem como a estrutura. Veja por exemplo o <a href="http://twitter.github.com/bootstrap">Bootstrap</a> ou o <a href="http://blueprintcss.org">Blueprint</a>.</p>
<p>Com o Bootstrap você consegue, rapidamente, fazer um protótipo simples ou uma estrutura básica de sistema. É o preferido dos programadores. Os elementos visuais já foram criados e desenhados. Talvez não seja uma boa ideia você utilizar um framework em um projeto cujo design já esteja aprovado. Você teria muito retrabalho para &#8220;zerar&#8221; o estilo visual de cada elemento para depois reconstruí-lo utilizando o seu design.</p>
<p>É muito importante que o uso de um framework CSS/Javascript seja aprovado no início de um grande projeto. Mesmo que você planeje criar um framework do zero, específico para seu projeto. O que na maioria das vezes não vale a pena.</p>
<h3>Bibliotecas</h3>
<p>Bibliotecas CSS geralmente não modificam o visual como os Frameworks fazem, mas eles disponibilizam uma coleção de classes, reutilizáveis e o melhor, combinatórias, para que se adeque a diversos cenários do seu projeto. Como essas classes não estão ligadas a nenhuma formatação visual, você consegue combinar sem grandes problemas com suas classes e IDs, modificando a hora que quiser a formatação visual dos elementos.</p>
<p>As bibliotecas são indicadas para projetos mais simples, sem grandes apetrechos técnicos, como um site ou algo parecido. Para fazer um sistema, as bibliotecas irão reforçar os Frameworks, facilitando a organização e formatação da estrutura do site. A biblioteca também ajuda na manipulação dos elementos via Javascript se baseando por estas classes prontas. </p>
<p>A verdade é que hoje é muito difícil diferenciar uma biblioteca de um framework.</p>
<h3>Como todos eles trabalham juntos?</h3>
<p>Você pode usar todos os três ao mesmo tempo em um projeto. Mas não é muito inteligente, já que se você estiver utilizando um framework, muito provavelmente ele terá uma &#8220;biblioteca&#8221; em sua base. Imagine que a biblioteca pode ser específica de estrutura ou formatação visual. O Framework, basicamente, junta os dois. Obviamente há mais coisas envolvidas. Mas para simplificarmos a explicação, imagine que um Framework é a mistura dessas duas bibliotecas.</p>
<p>O Preprocessador é independente do Framework e da Biblioteca. O seu ganho está ao escrever um código mais escalável, muitas vezes melhorando ou piorando a sintaxe do código. É pura sintaxe, não são classes prédefinidas. Mesmo assim você pode basear seu Framework/Biblioteca em um Préprocessador. O Bootstrap faz isso para facilitar features dinâmicas como grids, cores e etc.</p>
<p>Como eu disse, eu não gosto de misturar as coisas. Prefiro utilizar o Bootstrap puro, sem a interferência de nenhum préprocessador. Mas, há gosto para tudo. <img src='http://tableless.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Qual deles é melhor para o meu projeto</h3>
<p>Eu não sugiro que você utilize um framework para criar websites institucionais. Websites geralmente não usam os mesmos elementos, nem as mesmas estruturas, nem o mesmo design. Logo, se você utilizasse um framework como o Bootstrap, ou o JQuery UI, você acabaria gastando mais tempo reestilizando e brigando com o CSS já criado dos frameworks do que fazendo o que realmente importa: o seu trabalho.<br />
Logo, para projetos de pequeno porte eu sugiro que você utilize uma biblioteca simples. Sugiro ainda que essa biblioteca seja criada por você.</p>
<p>Não precisa de muito. Em uma biblioteca você só precisa ter algumas propriedades que fazem tarefas básicas, como fazer o elemento flutuar para a esquerda, para direita, clear, retirar margens e etc. Normalmente eu utilizo um reset chamado <a href="http://necolas.github.com/normalize.css/">Normalize</a>. Ele já reseta meu CSS inteiro e então eu me foco apenas nas propriedades que eu reutilizarei no resto do projeto.</p>
<p>Se seu projeto for médio ou grande, você já pode pensar em utilizar um Framework. Principalmente se seu projeto for um sistema. Você já vai ter à disposição estilos para formulários (que são um saco pra fazer), botões, grids, reset CSS e outras coisas. O trabalho fica mais fácil por que você tem menos arestas para acertar. Ainda mais se o designer aceitar utilizar alguns dos estilos já prontos do Framework, assim você não precisa reconfigurar formatações visuais e etc.</p>
<p>A utilização do Préprocessadores é totalmente opcional. Mas se você decidir utilizá-lo juntamente com algum Framework, procure saber se o Framework escolhido suporta algum tipo de préprocessador. O Bootstrap, por exemplo, tem uma versão para LESS.</p>
<p>No próximo artigo vou contar como estamos fazendo aqui na Locaweb. Estamos criando uma grande biblioteca visual e de front-end que será utilizado por todos os serviços. Os programadores conseguem subir um sistema sem precisar esperar um código HTML definitivo, utilizando os módulos dessa biblioteca. A galera de design faz todos os layouts padronizados visualmente, garantindo a uniformidade de todos os sistemas. E o pessoal de front? Bom o pessoal de front cuida para que tudo isso funcione. <img src='http://tableless.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/qualidade-de-imagens-e-densidade-de-pixels/" title="Qualidade de Imagens e densidade de pixels">Qualidade de Imagens e densidade de pixels</a></li><li><a href="http://tableless.com.br/gomo-teste-seu-site-mobile/" title="GoMo &#8211; Teste seu site mobile">GoMo &#8211; Teste seu site mobile</a></li><li><a href="http://tableless.com.br/agora-e-a-vez-dos-desenvolvedores/" title="Agora é a vez dos desenvolvedores">Agora é a vez dos desenvolvedores</a></li><li><a href="http://tableless.com.br/epub-aprenda-a-criar-um-livro-digital/" title="ePub: Aprenda a criar um livro digital">ePub: Aprenda a criar um livro digital</a></li><li><a href="http://tableless.com.br/introducao-a-padroes-de-codificacao/" title="Introdução aos padrões de codificação">Introdução aos padrões de codificação</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/estruturacao-de-client-side-preprocessadores-framewoks-e-bibliotecas-parte-1/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Tudo que você gostaria de saber sobre plugins jQuery e ninguém teve paciência de explicar</title>
		<link>http://tableless.com.br/tudo-que-voce-gostaria-de-saber-sobre-plugins-jquery-e-ninguem-teve-paciencia-de-explicar/</link>
		<comments>http://tableless.com.br/tudo-que-voce-gostaria-de-saber-sobre-plugins-jquery-e-ninguem-teve-paciencia-de-explicar/#comments</comments>
		<pubDate>Wed, 02 May 2012 12:10:14 +0000</pubDate>
		<dc:creator>Zeno Rocha</dc:creator>
				<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=5999</guid>
		<description><![CDATA[Pra você que cansou de ser um mero manipulador de plugins alheios]]></description>
			<content:encoded><![CDATA[<p>Então quer dizer que você anda brincando com jQuery. Volta e meia utiliza uns plugins que mais parecem mágica e se duvidar até se aventurou em criar o seu próprio, acertei?</p>
<p>Acontece que, caso você já saiba desenvolver os seus, talvez possam existir melhores formas de escrevê-lo. Será que você está seguindo as melhores práticas? Será que realmente entende o que está acontecendo por trás de cada linha?</p>
<p>Hoje vou tentar responder as dúvidas mais frequentes, explorando as melhores práticas para se construir um plugin. E no fim lhe mostrar um padrão interessante que você pode seguir agora que já entendeu os conceitos.</p>
<p>A ideia aqui não é simplesmente mostrar como criar um plugin, mas sim como criar direito, explorando tudo o que o jQuery tem de melhor para nos oferecer.</p>
<h2>Por que eu deveria construir um plugin?</h2>
<p>Encapsulamento e reaproveitamento de código, essas são as palavras-chave. Se você está codificando algo que talvez sirva para futuros projetos, pode ser uma boa encapsular tudo isso em um plugin.</p>
<h2>Entendi, quero criar um! Como faz?</h2>
<p>Existem diversas formas, mas vamos começar com essa:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$.<span style="color: #660066;">fn</span>.<span style="color: #660066;">meuPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// aqui vem a lógica</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Esse é o mínimo que você precisa para iniciar o desenvolvimento de um plugin, basta adicionar uma propriedade ao <strong>$.fn</strong>.</p>
<p>Por mais trivial que isso possa parecer, muita gente não entende o que está acontecendo por trás disso exatamente. Portanto, antes de evoluirmos esse padrão, vamos recorrer ao <a href="http://code.jquery.com/jquery-1.7.1.js">código fonte da biblioteca</a>, na sua versão mais recente, para entender de verdade esse pequeno trecho de código.</p>
<h2>O que significa o cifrão ($) ?</h2>
<p>O famoso <strong>$</strong> nada mais é do que um “apelido” para o objeto <strong>jQuery</strong>. Próximo ao fim do <a href="http://code.jquery.com/jquery-1.7.1.js">código fonte da biblioteca</a> encontramos a seguinte definição:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">window.<span style="color: #660066;">jQuery</span> <span style="color: #339933;">=</span> window.$ <span style="color: #339933;">=</span> jQuery<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Isso significa que o mesmo objeto em memória pode ser referenciado de diversas formas: <strong>window.jQuery</strong>, <strong>window.$</strong>, <strong>jQuery</strong> ou simplesmente <strong>$</strong>.</p>
<h2>Qual a diferença entre $.meuPlugin e $.fn.meuPlugin?</h2>
<p>Possivelmente você já se deparou com plugins que não utilizavam a propriedade <strong>.fn</strong>. Mas afinal, por que eu deveria utilizar o <strong>.fn</strong>? Por que não apenas <strong>$.meuPlugin</strong> ao invés de <strong>$.fn.meuPlugin</strong>?</p>
<p>Novamente, ao nos aventurarmos no <a href="http://code.jquery.com/jquery-1.7.1.js">código fonte</a> percebemos, logo nas primeiras linhas, como o objeto <strong>jQuery</strong> é definido.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> jQuery <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> selector<span style="color: #339933;">,</span> context <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">new</span> jQuery.<span style="color: #660066;">fn</span>.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span> selector<span style="color: #339933;">,</span> context<span style="color: #339933;">,</span> rootjQuery <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Note que <strong>jQuery</strong> é uma função e no Javascript uma função é também um objeto do tipo <strong>Function</strong>. Por isso <strong>jQuery.meuPlugin</strong> (ou <strong>$.meuPlugin</strong>) irá atribuir <strong>meuPlugin</strong> para o objeto jQuery do tipo <strong>Function</strong>.</p>
<p>Dito isso, voltamos ao <a href="http://code.jquery.com/jquery-latest.js">código fonte</a> e veremos que <strong>jQuery.fn</strong> é a mesma coisa que dizer <strong>jQuery.prototype</strong>.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">jQuery.<span style="color: #660066;">fn</span> <span style="color: #339933;">=</span> jQuery.<span style="color: #660066;">prototype</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Portanto, a cada vez que você atribuir uma função (ou propriedade) para <strong>jQuery.fn</strong>, como em <strong>$.fn.meuPlugin</strong>, a função estará disponível para todas as instâncias desse objeto.</p>
<p>Isso é importante, pois quando você invoca a função <strong>$()</strong>, como em <strong>$(&#8220;#algumID&#8221;)</strong>, uma nova instância é criada nessa linha:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">new</span> jQuery.<span style="color: #660066;">fn</span>.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span> selector<span style="color: #339933;">,</span> context <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>E essa instância terá todos os métodos que atribuirmos ao <strong>prototype</strong>, mas não todos os métodos que foram atribuídos direto ao objeto <strong>Function</strong>.</p>
<p>Logo, vá de <strong>.fn</strong>.</p>
<h2>Evite conflitos</h2>
<p>Sabia que existem outras bibliotecas Javascript que também utilizam o símbolo cifrão para referenciar seus objetos? Pois é, isso pode lhe causar uma baita dor de cabeça se utilizar apenas aquele primeiro padrão proposto.</p>
<p>Logo, uma boa prática seria encapsular a lógica do plugin em uma função anônima. Assim, garantimos que não irá haver conflito entre o <strong>$</strong> do jQuery com o <strong>$</strong> de outras bibliotecas.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> $ <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">meuPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// aqui vem a lógica</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span> jQuery <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Dessa forma mapeamos o <strong>$</strong> para que não seja afetado por nada fora desse escopo.</p>
<h2>Não quebre a corrente</h2>
<p>Então, você já entendeu como funcionam algumas coisas, vamos criar nosso primeiro plugin! Começaremos com o clássico exemplo de um Tooltip (aquelas caixinhas que aparecem no mouseover).</p>
<p>Criamos então a chamada para o plugin a partir de determinado seletor:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.BlaBlaBla&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">tooltip</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>E código do nosso plugin ficará definido assim:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> $ <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">tooltip</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> background<span style="color: #339933;">:</span> <span style="color: #3366CC;">'yellow'</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span> jQuery <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Aparentemente tudo certo, já que o plugin funciona direitinho, certo?</p>
<p>Na verdade não, pois dessa forma estamos ferindo um dos princípios importantes que diferem os plugins bons dos ruins, e esse princípio se chama encadeamento.</p>
<p>No jQuery é muito comum vermos declarações do tipo:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'BlaBlaBla'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeIn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Isso, porque é possível encadear diversas chamadas, a um mesmo seletor. E uma excelente prática por sinal, já que não criamos diversas instâncias como em:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'BlaBlaBla'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeIn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Para permitirmos comportamento similar com nosso plugin basta retornar o <strong>this</strong>.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> $ <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">tooltip</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">each</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> background<span style="color: #339933;">:</span> <span style="color: #3366CC;">'yellow'</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span> jQuery <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Assim, além de garantirmos o encadeamento, também manipulamos a coleção passada para o plugin através do método <strong>each</strong>, muito similar a um loop com <strong>for</strong> por exemplo.</p>
<h2>Como passar parâmetros e lidar com eles depois?</h2>
<p>E que tal se evoluíssemos nosso plugin e resolvessemos passar como parâmetro a cor de fundo do nosso elemento.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.BlaBlaBla&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">tooltip</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'corDeFundo'</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">'blue'</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Agora preparamos nosso plugin para receber os parâmetros através da variável <strong>options</strong> e aplicamos a propriedade <strong>corDeFundo</strong> no <strong>background</strong>.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> $ <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">tooltip</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>options<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">each</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> background<span style="color: #339933;">:</span> options.<span style="color: #660066;">corDeFundo</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span> jQuery <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Maravilha, funcionou! Mas o que acontece se você resolve mais tarde não passar como parâmetro a cor de fundo? Nosso plugin quebra.</p>
<p>Portanto, não podemos nos esquecer de que precisamos nos preparar para receber esse conjunto de opções e assegurar que, caso não seja passado nenhum valor como parâmetro, nós possamos lidar com valores padrão.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> $ <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">tooltip</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>options<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> defaults <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'corDeFundo'</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">'yellow'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> settings <span style="color: #339933;">=</span> $.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> defaults<span style="color: #339933;">,</span> options <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> background<span style="color: #339933;">:</span> settings.<span style="color: #660066;">corDeFundo</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span> jQuery <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Para isso recorremos a função <a href="http://api.jquery.com/jQuery.extend/">$.extend</a> que irá buscar os valores passados pela variável <strong>options</strong> e mesclar com os valores definidos na variável <strong>defaults</strong>, armazenando em outra variável chamada <strong>settings</strong>.</p>
<h2>A procura da batida perfeita</h2>
<p>Esse é só o começo para você que deseja se aprofundar um pouquinho mais nessa arte de criar plugins, para entender mais visite o <a href="http://docs.jquery.com/Plugins/Authoring">guia oficial</a>.</p>
<p>Mesmo que a ideia de se formar um padrão único para criar plugins seja utópico, sugiro fortemente que dê uma olhadinha no <a href="http://jqueryboilerplate.com/">jQuery Boilerplate</a>, lá você vai encontrar um padrão bem sólido para iniciar seus projetos, sem contar que a versão traduzida para português foi lançada hoje!</p>
<p>Mas se o buraco for mais em baixo e você for lidar com plugins <a href="http://en.wikipedia.org/wiki/State_(computer_science">stateful</a> que controlam o estado dos objetos, confira o <a href="http://wiki.jqueryui.com/w/page/12138135/Widget%20factory">jQuery UI Widget Factory</a>.</p>
<p>Lembre-se que o jQuery não é apenas uma caixa preta que faz mágicas pra você. Aventure-se no código fonte e verá que não é nada muito diferente do que você já faz com JavaScript puro.</p>
<p>E é isso, espero que depois desse artigo, você tenha evoluido de um simples “manipulador de plugins” para um criador de fato. Até a próxima!</p>
<h3  class="related_post_title">Mais comentados</h3><ul class="related_post"><li><a href="http://tableless.com.br/editores/" title="Editores">Editores</a></li><li><a href="http://tableless.com.br/quer-testar-o-google-analytics/" title="Quer testar o Google Analytics?">Quer testar o Google Analytics?</a></li><li><a href="http://tableless.com.br/chrome-nao-quer-dizer-muita-coisa/" title="O Chrome não quer dizer muita coisa">O Chrome não quer dizer muita coisa</a></li><li><a href="http://tableless.com.br/desenvolvedor-analfabeto/" title="Desenvolvedor analfabeto (sim, é sobre WYSIWYG)">Desenvolvedor analfabeto (sim, é sobre WYSIWYG)</a></li><li><a href="http://tableless.com.br/nao-otimize-seu-codigo/" title="Não &#8220;otimize&#8221; seu código">Não &#8220;otimize&#8221; seu código</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/tudo-que-voce-gostaria-de-saber-sobre-plugins-jquery-e-ninguem-teve-paciencia-de-explicar/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>jQuery: conheça os métodos on() e off()</title>
		<link>http://tableless.com.br/jquery-conheca-os-metodos-on-e-off/</link>
		<comments>http://tableless.com.br/jquery-conheca-os-metodos-on-e-off/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 12:35:42 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[JQuery]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=5521</guid>
		<description><![CDATA[A versão 1.7 do framework jQuery implementa dois novos métodos que pretendem acabar de vez com a confusão gerada em torno da associação de eventos.]]></description>
			<content:encoded><![CDATA[<p>Em outubro de 2010 escrevi um <a href="http://tableless.com.br/associando-eventos-dinamicamente/" title="jQuery: associando eventos dinamicamente">artigo</a> aqui mesmo no Tableless sobre a associação dinâmica de eventos. Na época, reinava uma confusão  sobre quais métodos utilizar e quando utilizá-los. Eram três as opções: bind(), live() e delegate().</p>
<p>Com o lançamento da versão 1.7 do jQuery, dois métodos definitivos (assim espero) devem acabar com a confusão em torno da associação de eventos: os métodos on() e off().</p>
<h2>Eventos diretos</h2>
<p>A associação direta de eventos ocorre quando o seletor (ou escopo) é omitido nos parâmetros do on(). Por exemplo:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> exibeMenu<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menu'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Effects/show"><span style="color: #000066;">show</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-menu'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> exibeMenu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>No código acima, o elemento com id #lnk-menu recebe uma associação no evento click para executar a função exibeMenu(). A associação ocorre de forma direta, ou seja, quando o on() é executado o evento passa a estar associado ao elemento, antes mesmo do clique ocorrer.</p>
<p>Essa opção equivale ao bind() e deve ser utilizada em casos de elementos únicos, ou com poucos elementos, para evitar problemas de performance.</p>
<h2>Múltiplos eventos</h2>
<p>Também é possível associar múltiplos eventos a um ou mais elementos. Para isso, basta passar um mapa onde cada chave representa um evento ao invés de um evento como string:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-menu'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <a href="http://docs.jquery.com/Events/click"><span style="color: #000066;">click</span></a><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menu'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Effects/show"><span style="color: #000066;">show</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; <a href="http://docs.jquery.com/Events/dblclick"><span style="color: #000066;">dblclick</span></a><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#submenu'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Effects/show"><span style="color: #000066;">show</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; <a href="http://docs.jquery.com/Events/mouseenter"><span style="color: #000066;">mouseenter</span></a><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Attributes/addClass"><span style="color: #000066;">addClass</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ativo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h2>Removendo associações de eventos diretos</h2>
<p>Remover associações de eventos diretos é simples:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-menu'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Para remover eventos específicos, mantendo qualquer outra associação, basta informar o nome do evento:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-menu'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">off</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h2>Eventos delegados</h2>
<p>A delegação de eventos (antigos live() e delegate()) ocorre quando passamos um ou mais seletores nos parâmetros do on. O evento não será<br />
associado diretamente quando o código for executado, tampouco será executado para o seletor que chama o on() e sim para os elementos descendentes que se encaixem no parâmetro passado.</p>
<p>A associação ocorre quando o evento é acionado. Esse tipo de associação funciona tanto para elementos já presentes no DOM como para elementos criados posteriormente.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> exibeConteudo<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Traversing/find"><span style="color: #000066;">find</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'conteudo'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Effects/fadeIn"><span style="color: #000066;">fadeIn</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'table'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">,</span> exibeConteudo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h2>Removendo a associação de eventos específicos</h2>
<p>Em alguns momentos será preciso associar eventos diretos e, ao mesmo tempo, delegar eventos. Nesses casos, é possível remover apenas os eventos delegados utilizando o parâmetro especial &#8220;**&#8221;.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'a'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">off</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'**'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Outra opção é remover a associação com base na função utilizada:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-menu'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">off</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">,</span> exibeConteudo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h2>Namespaces</h2>
<p>Uma importante implementação do on() é a possibilidade de utilizar namespaces nos eventos &#8211; uma grande novidade para desenvolvedores de plugins. Um evento pode, agora, ser associado a um namespace específico, facilitando o controle sobre associações específicas de um plugin ou uma funcionalidade.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-menu'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click.menu'</span><span style="color: #339933;">,</span> exibeMenu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.menu-item'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'mouseleave.menu'</span><span style="color: #339933;">,</span> escondeMenu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-menu, .menu-item'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">off</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.menu'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h2>Enviando dados para o evento</h2>
<p>O método on() também permite enviar dados específicos para um evento. O objeto de dados fica associado ao objeto do evento.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> exibeMenu<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <br />
&nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.ativo'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Attributes/text"><span style="color: #000066;">text</span></a><span style="color: #009900;">&#40;</span>e.<a href="http://docs.jquery.com/Core/data"><span style="color: #000066;">data</span></a>.<span style="color: #660066;">descricao</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-home'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> descricao<span style="color: #339933;">:</span> <span style="color: #3366CC;">'Página inicial'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> exibeMenu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-sobre'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> descricao<span style="color: #339933;">:</span> <span style="color: #3366CC;">'Sobre a empresa'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> exibeMenu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>No exemplo acima, cada link passa uma descrição diferente durante o evento. Essa descrição passa a ser o conteúdo dos elementos com a classe &#8220;.ativo&#8221;.</p>
<h2>Este evento se autodestruirá…</h2>
<p>O método .one() poderia ter entrado na lista dos <a href="http://tableless.com.br/jquery-metodos-desconhecidos/" title="jQuery: métodos desconhecidos">métodos desconhecidos do meu último artigo</a>, já que existe desde a versão 1.1 do jQuery. No entanto, junto com a implementação do .on() ele ganhou uma nova cara.</p>
<p>Sua implementação segue as mesmas regras do .on() com uma importante diferença: o evento associado é executado apenas uma vez. Após a execução a associação é automaticamente removida, seja ela uma associação direta ou delegada.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lnk-menu'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Events/one"><span style="color: #000066;">one</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Este evento não será mais executado.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Caso o seletor possua mais de um elemento, o evento será associado uma vez a cada um deles, ou seja, cada elemento possuirá uma execução do evento.</p>
<hr />
<p>Essas são as novidades com relação a eventos utilizando jQuery. Os métodos .on() e .off() devem &#8220;matar&#8221; seus antecessores (.live() e .delegate()) e padronizar de uma vez por todas a associação de eventos em aplicações.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/navegando-com-a-jquery/" title="Navegando com a jQuery">Navegando com a jQuery</a></li><li><a href="http://tableless.com.br/javascript-com-cafe/" title="JavaScript com café">JavaScript com café</a></li><li><a href="http://tableless.com.br/manipulacao-de-classes-com-jquery/" title="Manipulação de classes com JQuery">Manipulação de classes com JQuery</a></li><li><a href="http://tableless.com.br/jquery-metodos-desconhecidos/" title="jQuery: métodos desconhecidos">jQuery: métodos desconhecidos</a></li><li><a href="http://tableless.com.br/20-plugins-jquery-que-marcaram-2011/" title="20 plugins jQuery que marcaram 2011">20 plugins jQuery que marcaram 2011</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/jquery-conheca-os-metodos-on-e-off/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Manipulação de classes com JQuery</title>
		<link>http://tableless.com.br/manipulacao-de-classes-com-jquery/</link>
		<comments>http://tableless.com.br/manipulacao-de-classes-com-jquery/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 13:27:13 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[JQuery para designers]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[Na Prática]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=5640</guid>
		<description><![CDATA[Entenda como funciona as funções do JQuery para manipulação de classes nos elementos do HTML.]]></description>
			<content:encoded><![CDATA[<p>Você já deve saber que o <a href="http://jquery.com">JQuery</a> é coisa linda de Deus. Existe uma linha muito tênue entre as features que o CSS pode fazer e o que o JQuery pode nos ajudar. A manipulação de classes é uma das facilidades que o JQuery proporciona e facilita infinitamente nossa vida. Essas funções nos ajudam muito quando iremos definir um comportamento dinâmico para os elementos.</p>
<h2>Formas de manipulação de classes</h2>
<p>Você pode manipular as classes de elementos do HTML de quatro formas:</p>
<p><strong>.addClass()</strong><br />
Existem diversas situações onde precisamos adicionar uma ou mais classes em um elemento para executarmos uma ação ou formatarmos o elemento com estilos determinados.</p>
<p><strong>.removeClass()</strong><br />
Remove uma, várias ou todas as classes dos elementos escolhidos.</p>
<p><strong>.toggleClass()</strong><br />
Insere ou remove uma ou mais classes dos elementos determinados, alternando entre classes escolhidas.</p>
<p><strong>.hasClass()</strong><br />
Verifica se qualquer um dos elementos selecionados tem a classe determinada.</p>
<h3>.addClass()</h3>
<p>Imagine que você queira adicionar uma classe extra o último elemento LI da lista:</p>
<div class="codecolorer-container html4strict mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>Primeiro<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>Segundo<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>Terceiro<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span></div></td></tr></tbody></table></div>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li:last'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'selecionado'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><iframe style="width: 100%; height: 150px" src="http://jsfiddle.net/tableless/35DJy/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe><br />
<a href="http://jsfiddle.net/tableless/35DJy/">Link do exemplo de ADDCLASS do JQuery</a></p>
<p>Para adicionar mais de uma classe, basta fazer como fazemos no CSS: separe com espaços o nome das classes. E se você na sabia, sim, da para colocar mais de uma classe em um mesmo elemento HTML.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li:last'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'selecionado ultimo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Você pode adicionar uma classe no elemento ao clicar nele:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li:last'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'selecionado ultimo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><iframe style="width: 100%; height: 150px" src="http://jsfiddle.net/tableless/JakZ8/2/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe><br />
<a href="http://jsfiddle.net/tableless/JakZ8/">Link do exemplo de AddClass com click do JQuery</a></p>
<p>Você pode ver a <a href="http://api.jquery.com/addClass/">documentação completa dessa feature aqui</a>.</p>
<h3>.removeClass()</h3>
<p>O <strong>.removeClass()</strong> function da mesma maneira que o <strong>.addClass()</strong>, só que em vez de colocar uma classe, você a remove. Simples assim.</p>
<p>Ainda usando o exemplo acima, vamos retirar a classe <i>selecionado</i> dos elementos e adicionar apenas no elemento clicado. O JS fica assim:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'selecionado'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'selecionado'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><iframe style="width: 100%; height: 150px" src="http://jsfiddle.net/tableless/BfMjw/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>Muito simples. Você define qual a classe que vai ser removida e pronto, o JQuery faz isso para você.</p>
<h3>.toggleClass()</h3>
<p>O <strong>toggleClass</strong> nos ajudaria muito mais no exemplo aplicado acima. Ele alterna uma determinada classe, adicionando e removendo-a sem a necessidade de IFs ou coisas assim.<br />
Eles detectam se o elemento tem ou não a classe. Se houver a classe, ele a retira, se não, ele adiciona. A sintaxe é a que segue abaixo:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toggleClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'selecionado'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><iframe style="width: 100%; height: 150px" src="http://jsfiddle.net/tableless/s76Xc/2/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe><br />
<a href="http://jsfiddle.net/tableless/s76Xc/2/">Link do exemplo</a></p>
<h3>.hasClass()</h3>
<p>E por último, o <strong>.hasClass</strong>. Essa função detecta se o elemento tem ou não a classe, e então, sabendo disso, você pode manipulá-lo da maneira que bem entender. No nosso exemplo abaixo iremos apenas detectar qual dos elementos tem a nossa classe. HTML:</p>
<div class="codecolorer-container html4strict mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/p.html"><span style="color: #000000; font-weight: bold;">p</span></a>&gt;</span>Este é o primeiro parágrafo.<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/p.html"><span style="color: #000000; font-weight: bold;">p</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/p.html"><span style="color: #000000; font-weight: bold;">p</span></a> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;selected&quot;</span>&gt;</span>Este é o segundo parágrafo e tem a classe SELECTED<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/p.html"><span style="color: #000000; font-weight: bold;">p</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>E o JQuery:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;div#result1&quot;</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/append"><span style="color: #000066;">append</span></a><span style="color: #009900;">&#40;</span><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;p:first&quot;</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Attributes/hasClass"><span style="color: #000066;">hasClass</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;selected&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;div#result2&quot;</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/append"><span style="color: #000066;">append</span></a><span style="color: #009900;">&#40;</span><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;p:last&quot;</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Attributes/hasClass"><span style="color: #000066;">hasClass</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;selected&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><iframe style="width: 100%; height: 150px" src="http://jsfiddle.net/tableless/FcTm7/10/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe><br />
<a href="http://jsfiddle.net/tableless/FcTm7/10/">Link do exemplo</a></p>
<p>Para ler a documentação dessas funções, <a href="http://api.jquery.com/category/manipulation/class-attribute/">clique aqui</a>.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/cut-the-rope/" title="Cut the Rope">Cut the Rope</a></li><li><a href="http://tableless.com.br/jquery-metodos-desconhecidos/" title="jQuery: métodos desconhecidos">jQuery: métodos desconhecidos</a></li><li><a href="http://tableless.com.br/introducao-a-padroes-de-codificacao/" title="Introdução aos padrões de codificação">Introdução aos padrões de codificação</a></li><li><a href="http://tableless.com.br/vote-no-especialista-em-usabilidade-para-presidente/" title="Vote no Especialista em Usabilidade para Presidente">Vote no Especialista em Usabilidade para Presidente</a></li><li><a href="http://tableless.com.br/estruturacao-de-client-side-preprocessadores-framewoks-e-bibliotecas-parte-1/" title="Estruturação de Client-side &#8211; Parte 1: Préprocessadores, Framewoks e Bibliotecas">Estruturação de Client-side &#8211; Parte 1: Préprocessadores, Framewoks e Bibliotecas</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/manipulacao-de-classes-com-jquery/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>jQuery: métodos desconhecidos</title>
		<link>http://tableless.com.br/jquery-metodos-desconhecidos/</link>
		<comments>http://tableless.com.br/jquery-metodos-desconhecidos/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 15:30:24 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Na Prática]]></category>
		<category><![CDATA[2012]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=5315</guid>
		<description><![CDATA[Conheça alguns métodos pouco utilizados mas que podem ser grandes aliados dos desenvolvedores jQuery.]]></description>
			<content:encoded><![CDATA[<p>No meu <a href="http://tableless.com.br/jquery-dicas-de-otimizacao-e-performance/" title="">último artigo</a> falei sobre dicas de otimização e performance de códigos jQuery. Na versão inicial do texto eu havia planejado um tópico sobre os métodos não muito conhecidos, já que alguns, como o ajaxSetup, podem também atuar na performance da sua aplicação.</p>
<p>Acabei descobrindo que este tópico ficaria enorme e, por isso, preferi escrever sobre o assunto em um artigo próprio.</p>
<p>Com vocês, alguns dos métodos menos populares do jQuery!</p>
<h2>proxy()</h2>
<p>O método proxy() permite executar um outros método forçando um determinado contexto. Seu objetivo principal é evitar a confusão do &#8216;this&#8217; causada quando um objeto é utilizado dentro de um método de outro objeto.</p>
<p>Por exemplo:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.botao&quot;</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Events/click"><span style="color: #000066;">click</span></a><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//window</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.botao&quot;</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Events/click"><span style="color: #000066;">click</span></a><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; setTimeout<span style="color: #009900;">&#40;</span><span style="color: #000066;">$</span>.<span style="color: #660066;">proxy</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//.botao</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>É possível utilizar o proxy() através de duas assinaturas. A primeira recebe como parâmetros uma função e o escopo. A segunda funciona passando o escopo e o nome do método como uma string.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span>.<span style="color: #660066;">proxy</span><span style="color: #009900;">&#40;</span> funcao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'objeto'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span>.<span style="color: #660066;">proxy</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'objeto'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'metodo'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Quem sabe agora você para de usar o truque do &#8216;var that = this&#8217;, hein?</p>
<h2>isArray() e isFunction()</h2>
<p>Esses dois métodos fazem parte da família de utilitários do jQuery. Como seus nomes sugerem, o primeiro verifica se o objeto é um array JavaScript e o segundo se o objeto é uma função.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> jogadores <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'Obina'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Vagner Love'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Zico'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> chutar <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>jogador<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Gol de &quot;</span> <span style="color: #339933;">+</span> jogadores<span style="color: #009900;">&#91;</span>jogador<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">$</span>.<a href="http://docs.jquery.com/Utilities/isArray"><span style="color: #000066;">isArray</span></a><span style="color: #009900;">&#40;</span>jogadores<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span><br />
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">$</span>.<a href="http://docs.jquery.com/Utilities/isFunction"><span style="color: #000066;">isFunction</span></a><span style="color: #009900;">&#40;</span>chutar<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span></div></td></tr></tbody></table></div>
<p>Uma observação: a função isArray retorna <em>true</em> apenas para verdadeiros Arrays (e não objetos &#8220;tipo array&#8221;, como um objeto jQuery, por exemplo).</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> jogadores <span style="color: #339933;">=</span> <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.jogadores'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">$</span>.<a href="http://docs.jquery.com/Utilities/isArray"><span style="color: #000066;">isArray</span></a><span style="color: #009900;">&#40;</span>jogadores<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// false</span></div></td></tr></tbody></table></div>
<p>A <a href="http://api.jquery.com/category/utilities/" title="">lista de utilitários</a> possui outros métodos interessantes, tais como grep(), map(), merge() etc. </p>
<h2>queue() e dequeue()</h2>
<p>Apesar de terem sido desenvolvidos originalmente para o uso de animações, os métodos queue() e dequeue() podem ser utilizados para qualquer tipo de fila.</p>
<p>A fila padrão é chamada de &#8216;fx&#8217;: essa é a fila das animações. Ela será utilziada caso não seja passado nos parâmetros o nome de uma fila. No exemplo abaixo, estamos criando a fila &#8216;ajaxRequests&#8217;.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/queue"><span style="color: #000066;">queue</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ajaxRequests'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000066;">$</span>.<a href="http://docs.jquery.com/Ajax/ajax"><span style="color: #000066;">ajax</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'GET'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'/tableless'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; complete<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>jqXHR<span style="color: #339933;">,</span> textStatus<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/dequeue"><span style="color: #000066;">dequeue</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;ajaxRequests&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/queue"><span style="color: #000066;">queue</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ajaxRequests'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">$</span>.<a href="http://docs.jquery.com/Ajax/post"><span style="color: #000066;">post</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'/tableless'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>categoria<span style="color: #339933;">:</span> <span style="color: #3366CC;">'jquery'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Para dar sequência no andamento da fila, você precisa utilizar o método dequeue(). Ele deve ser chamado no final da execução de um processo da fila (e como essa é uma fila de processos AJAX, utilizamos o dequeue no evento <em>complete</em>).</p>
<p>Outro recurso interessante é a possibilidade de saber o tamanho da fila, ou seja, quantos eventos ainda serão executados. Para isso, basta utilizar a propriedade <em>length</em> após o método queue().</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/queue"><span style="color: #000066;">queue</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ajaxRequests'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/length"><span style="color: #000066;">length</span></a><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// 2</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/dequeue"><span style="color: #000066;">dequeue</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;ajaxRequests&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// executa fila</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/queue"><span style="color: #000066;">queue</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ajaxRequests'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/length"><span style="color: #000066;">length</span></a><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// 0</span></div></td></tr></tbody></table></div>
<h2>detach()</h2>
<p>Assim como o remove(), o detach() retira um elemento do DOM. No entanto, esse método guarda as referências, eventos e dados associados ao elemento retornando um objeto jQuery que pode ser re-inserido no DOM.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.link'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Events/click"><span style="color: #000066;">click</span></a><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<br />
&nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'clique'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.link'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Events/click"><span style="color: #000066;">click</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// 'clique'</span><br />
<span style="color: #003366; font-weight: bold;">var</span> link <span style="color: #339933;">=</span> <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.link'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">detach</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'body'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/append"><span style="color: #000066;">append</span></a><span style="color: #009900;">&#40;</span>link<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.link'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Events/click"><span style="color: #000066;">click</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// 'clique'</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.link'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/remove"><span style="color: #000066;">remove</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'body'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/append"><span style="color: #000066;">append</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;a href=&quot;#&quot; class=&quot;link&quot;&gt;link&lt;/a&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.link'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Events/click"><span style="color: #000066;">click</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// []</span></div></td></tr></tbody></table></div>
<h2>ajaxSetup() e afins</h2>
<p>Talvez esses sejam os métodos mais injustiçados do jQuery. É muito comum a repetição de chamadas AJAX, incluindo seus parâmetros. Esses métodos de configuração permitem definir valores padrão para qualquer evento AJAX em sua aplicação.</p>
<p>Com o ajaxSetup() é possível, por exemplo, habilitar ou desabilitar o <em>cache</em> e definir o tipo de requisição: POST ou GET.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span>.<a href="http://docs.jquery.com/Ajax/ajaxSetup"><span style="color: #000066;">ajaxSetup</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'POST'</span><span style="color: #339933;">,</span><br />
&nbsp; dataType<span style="color: #339933;">:</span> <span style="color: #3366CC;">'json'</span><span style="color: #339933;">,</span><br />
&nbsp; cache<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Você ainda pode configurar uma URL padrão e também parâmetros passados durante a chamada:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span>.<a href="http://docs.jquery.com/Ajax/ajaxSetup"><span style="color: #000066;">ajaxSetup</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> &nbsp;<br />
&nbsp; <a href="http://docs.jquery.com/Core/data"><span style="color: #000066;">data</span></a><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; origem<span style="color: #339933;">:</span> <span style="color: #3366CC;">'tableless'</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'/tableless'</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Para conferir uma lista completa das propriedades configuráveis, visite a <a href="http://api.jquery.com/jQuery.ajax/" title="">página do método AJAX na API do jQuery</a>.</p>
<p>Os <em>callbacks</em> e eventos relacionados à execução de métodos AJAX também podem ser configurados. No entanto, essa configuração deve ser feita através dos seguintes métodos específicos: ajaxStart(), ajaxStop(), ajaxComplete(), ajaxError(), ajaxSuccess() e ajaxSend(). </p>
<p>Por exemplo, você poderia utilizar a configuração abaixo para exibir um indicador de carregamento no início da execução de um método AJAX.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.carregando'</span><span style="color: #009900;">&#41;</span><br />
&nbsp; .<a href="http://docs.jquery.com/Ajax/ajaxStart"><span style="color: #000066;">ajaxStart</span></a><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Effects/show"><span style="color: #000066;">show</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; .<a href="http://docs.jquery.com/Ajax/ajaxStop"><span style="color: #000066;">ajaxStop</span></a><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Effects/hide"><span style="color: #000066;">hide</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Você pode associar os eventos a qualquer elemento e o jQuery se encarregará de encontrar e executar todos os métodos associados.</p>
<h2>delay()</h2>
<p>O método delay() serve para adiar a execução de uma função, método ou animação. Ele é especialmente útil para controlar o tempo de animações.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.alerta'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Effects/fadeIn"><span style="color: #000066;">fadeIn</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">delay</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Effects/slideUp"><span style="color: #000066;">slideUp</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>No exemplo acima, o elemento com a classe &#8220;alerta&#8221; é exibido através de uma transição <em>fade</em> e, um segundo depois, ocultado através do método slideUp().</p>
<h2>replaceWith() e replaceAll()</h2>
<p>Imagine que você queira substituir todos os elementos que tenham a classe &#8220;pontos&#8221;. Com o método replaceWith() fica fácil. O que ele faz é buscar todos os objetos que se encaixem no seletor indicado e substituir seu conteúdo.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.pontos'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/replaceWith"><span style="color: #000066;">replaceWith</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;h2&gt;1 milhão de pontos!&lt;/h2&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>O replaceWith() também funciona com elementos que não estejam presentes no DOM, ou seja, você pode criar um objeto jQuery e substituir/manipular seu conteúdo antes de inserí-lo no DOM.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;div class=&quot;carregando&quot; /&gt;'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/replaceWith"><span style="color: #000066;">replaceWith</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;p class=&quot;carregando&quot;&gt;Carregando...&lt;/p&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Da mesma forma, o método replaceAll() também substiui o conteúdo de elementos, mas a origem e o destino são invertidos. Você também pode passar seletores como conteúdo. Nesse caso o funcionamento é um pouco diferente já que o elemento não é clonado e sim movido no DOM. </p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;h2&gt;Carregamento completo!&lt;/h2&gt;'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/replaceAll"><span style="color: #000066;">replaceAll</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.carregando'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.titulo'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/replaceAll"><span style="color: #000066;">replaceAll</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.carregando'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Note que a diferença dos métodos acima para os métodos tradiconais html() e text() é que o próprio elemento também é substituído e não só o seu conteúdo.</p>
<hr />
<p>Estes foram alguns métodos que pouca gente conhece ou utiliza. Pode até ser que você nunca tenha sentido falta deles, mas é sempre bom ter umas cartas extras na manga.</p>
<p>E se você gostou, garanto que ao consultar a <a href="http://api.jquery.com/" title="">API do jQuery</a> você descobrirá vários outros métodos desconhecidos, mas que podem ser úteis em algum momento do desenvolvimento dos seus projetos.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/manipulacao-de-classes-com-jquery/" title="Manipulação de classes com JQuery">Manipulação de classes com JQuery</a></li><li><a href="http://tableless.com.br/javascript-com-cafe/" title="JavaScript com café">JavaScript com café</a></li><li><a href="http://tableless.com.br/cut-the-rope/" title="Cut the Rope">Cut the Rope</a></li><li><a href="http://tableless.com.br/jquery-conheca-os-metodos-on-e-off/" title="jQuery: conheça os métodos on() e off()">jQuery: conheça os métodos on() e off()</a></li><li><a href="http://tableless.com.br/introducao-a-padroes-de-codificacao/" title="Introdução aos padrões de codificação">Introdução aos padrões de codificação</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/jquery-metodos-desconhecidos/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>jQuery: dicas de otimização e performance</title>
		<link>http://tableless.com.br/jquery-dicas-de-otimizacao-e-performance/</link>
		<comments>http://tableless.com.br/jquery-dicas-de-otimizacao-e-performance/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 10:26:21 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[otimização]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4289</guid>
		<description><![CDATA[Performance é um aspecto muito importante em aplicações web. Confira algumas dicas simples de como otimizar seu código jQuery.]]></description>
			<content:encoded><![CDATA[<p>A grande maioria dos desenvolvedores jQuery não se preocupa muito com performance e otimização. Afinal, o mantra do framework, &#8220;write less, do more&#8221;, envolve esconder a parte feia do Javascript e, muitas vezes, acrescentar camadas desnecessárias.</p>
<p>Neste artigo apresento algumas dicas de como melhorar a performance de sua aplicação jQuery. No entanto, vale lembrar que não é necessário otimizar nenhum código escrito previamente, já que a otimização dificilmente compensará o trabalho.</p>
<h2>#1: Mantenha-se atualizado</h2>
<p>Procure utilizar sempre a última versão estável do jQuery. A cada nova versão lançada são introduzidas inúmeras melhorias de performance nos métodos do framework.</p>
<p>Da versão 1.3 para a 1.4, por exemplo, houve um ganho de 50% na performance da execução dos testes padrão do jQuery.</p>
<p>Fique ligado nas mudanças. O lançamento de uma nova versão vem sempre acompanhando de notas sobre as novas funcionalidades, um changelog, como <a href="http://blog.jquery.com/2011/11/21/jquery-1-7-1-released/" title="">este aqui</a>.</p>
<h2>#2: Não utilize jQuery!</h2>
<p>Em alguns momentos não é necessário utilizar jQuery. Apesar de ser fácil de utilizar e muito mais bonito de ler, o framework é apenas mais uma camada no desenvolvimento, uma &#8220;maquiagem&#8221; para o Javascript.</p>
<p>Em projetos pequenos você pode, se quiser, abolir totalmente o jQuery: é realmente necessário incluir os ~30kb do framework? Não dá pra resolver com Javascript puro?</p>
<p>Já em projetos maiores, mesmo incluindo o jQuery, em alguns casos é melhor não utilizá-lo. Por exemplo:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://docs.jquery.com/Core/size"><span style="color: #000066;">size</span></a><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<a href="http://docs.jquery.com/Core/length"><span style="color: #000066;">length</span></a><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span></div></td></tr></tbody></table></div>
<p>Acima está o código-fonte do método size, do jQuery. O que ele faz? Nada além de retornar o tamanho do objeto utilizando o método nativo length. Logo, é mais rápido utilizar diretamente o length!</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.menu'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/size"><span style="color: #000066;">size</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.menu'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Core/length"><span style="color: #000066;">length</span></a></div></td></tr></tbody></table></div>
<p>O mesmo vale para retornar o ID de um elemento:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Attributes/attr"><span style="color: #000066;">attr</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'id'</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span></div></td></tr></tbody></table></div>
<p>O seletor $(this), aliás, somente deve ser utilizado quando for necessário um método que só existe no jQuery. Nos outros casos, sempre dê preferência ao this nativo do Javascript.</p>
<p>Também é comum utilizar jQuery para alterar o CSS de um elemento, por exemplo:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menu'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/CSS/css"><span style="color: #000066;">css</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'display'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'block'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Olhando o <a href="https://github.com/jquery/jquery/blob/master/src/css.js#L121">código-fonte</a> do jQuery, o método .css() possui aproximadamente 20 linhas (sem contar outros métodos chamados). A atribuição acima poderia ser executada da seguinte forma, com uma única linha:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'menu'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'block'</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Os próprios métodos jQuery possuem camadas dentro do framework. Ao invés de utilizar o método $.getJSON, por exemplo, você pode chamar diretamente o método $.ajax com os parâmetros type: &#8216;GET&#8217; e dataType: &#8216;json&#8217;.</p>
<p>Vale a pena dar uma olhada no <a href="https://github.com/jquery/jquery" title="">código-fonte</a> do jQuery para entender o que o framework faz por baixo dos panos e até que ponto é válido utilizá-lo.</p>
<h2>#3: Seletores</h2>
<p>Procure sempre ser o mais específico possível em um seletor. Quanto mais específico, mais rápido. Opte sempre por utilizar o ID do elemento. Mesmo quando for preciso utilizar uma classe no seletor, utilize o ID do elemento pai.</p>
<p>Os seletores que utilizam o ID ou a tag de um elemento são mais rápidos por um simples motivo: ambos utilizam métodos nativos do Javascript document.getElementbyId() e document.getElementsByTagname().</p>
<p>Evite utilizar seletores com atributos e/ou pseudo-seletores, a menos que seja extremamente necessário.</p>
<p>Outra dica importante: dê preferência ao método .find() quando precisar achar elementos filhos de um elemento com ID. Por exemplo, ao invés de $(&#8216;#container p&#8217;) utilize $(&#8216;#container&#8217;).find(&#8216;p&#8217;), dessa forma o escopo da busca fica limitado ao primeiro objeto. O mesmo vale para seletores de classes e pseudo-seletores.</p>
<h2>#4: Cache de elementos</h2>
<p>Esta é uma dica simples, mas que pode adicionar ganhos de performance consideráveis. Procure sempre armazenar em uma variável o objeto jQuery retornado por um seletor, principalmente quando o seletor está dentro de um loop.</p>
<p>Por exemplo:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> menu <span style="color: #339933;">=</span> <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menu'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> itens <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'Home'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Contato'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Sobre'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>x <span style="color: #000066; font-weight: bold;">in</span> itens<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; menu.<a href="http://docs.jquery.com/Manipulation/append"><span style="color: #000066;">append</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;li&gt;'</span><span style="color: #339933;">+</span>itens<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&lt;/li&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Ao invés de:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> itens <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'Home'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Contato'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Sobre'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>x <span style="color: #000066; font-weight: bold;">in</span> itens<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menu'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Manipulation/append"><span style="color: #000066;">append</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;li&gt;'</span><span style="color: #339933;">+</span>itens<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&lt;/li&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>No exemplo acima, o seletor $(&#8216;#menu&#8217;) seria executado 3 vezes, ou seja, o elemento seria buscado no DOM três vezes seguidas, sem nenhuma alteração.</p>
<p>Conforme citei na abertura do artigo, cachear seletores é uma prática que vai contra o &#8220;write less, do more&#8221; do jQuery. Seu código pode ficar um pouco mais &#8220;sujo&#8221;, mas, em contrapartida, fica também mais rápido.</p>
<h2>#5: Encadeamento de métodos</h2>
<p>Encadear métodos sempre foi uma das funcionalidades mais legais do jQuery e, se você ainda não faz uso dessa técnica, é por aqui que você deve começar.</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#container'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Attributes/addClass"><span style="color: #000066;">addClass</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'corpo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#container'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/CSS/width"><span style="color: #000066;">width</span></a><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">940</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#container'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/CSS/height"><span style="color: #000066;">height</span></a><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">300</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Vira:</p>
<div class="codecolorer-container jquery mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="jquery codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">$</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#container'</span><span style="color: #009900;">&#41;</span>.<a href="http://docs.jquery.com/Attributes/addClass"><span style="color: #000066;">addClass</span></a><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'corpo'</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.<a href="http://docs.jquery.com/CSS/width"><span style="color: #000066;">width</span></a><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">940</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.<a href="http://docs.jquery.com/CSS/height"><span style="color: #000066;">height</span></a><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">300</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Quase todos os métodos e plugins retornam (ou deveriam retornar) um objeto jQuery. Além de melhorar a leitura, essa prática também afeta diretamente a performance do seu código já que o seletor só é executado uma única vez.</p>
<h2>#6: DOM</h2>
<p>Qualquer tipo de manipulação no DOM envolve um processo bem lento. No geral, você deve fugir desse tipo de implementação, principalmente se ela não possuir nenhum tipo de cache.</p>
<p>O ideal é manipular já com os dados finais e completos. Não manipule o DOM em um loop, por exemplo. </p>
<p>Utilizando o exemplo da dica de caching, poderíamos alterar para ficar ainda mais otimizado:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> menu <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menu'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> itens <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'Home'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Contato'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Sobre'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> html <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>x <span style="color: #000066; font-weight: bold;">in</span> itens<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; html <span style="color: #339933;">+=</span> <span style="color: #3366CC;">'&lt;li&gt;'</span><span style="color: #339933;">+</span>itens<span style="color: #009900;">&#91;</span>x<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&lt;/li&gt;'</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
menu.<span style="color: #660066;">append</span><span style="color: #009900;">&#40;</span>html<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
menu.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Repare que o método .append() foi chamado apenas uma vez, já recebendo o HTML completo concatenado.</p>
<h2>#7: DRY (Don&#8217;t Repeat Yourself)</h2>
<p>O jQuery disponibiliza um alto nível de personalização, permitindo que você <a href="http://tableless.com.br/jquery-seletores-personalizados/" title="">escreva seus seletores</a> e <a href="http://tableless.com.br/anatomia-de-um-plugin-jquery/" title="">seus plugins</a>.</p>
<p>Evite repetir blocos de código. Evite repetir seletores. Evite repetir manipulações no DOM (faça tudo o que precisa fazer uma única vez!). Esta é uma dica muito importante para performance, já que qualquer código repetido significa alguns bytes ou kbytes a mais na sua aplicação.</p>
<p>Mathias Bynens disponibilizou um <a href="http://speakerdeck.com/u/mathiasbynens/p/faster-javascript-execution-for-the-lazy-developer">uma apresentação genial</a> sobre DRY e Javascript, vale a pena conferir.</p>
<h2>Como medir a performance da sua aplicação?</h2>
<p>O site <a href="http://jsperf.com/">jsPerf</a> permite a criação de testes de performance para códigos javascript, utilizando jQuery ou não. É um bom lugar para você começar a comparar diferentes tipos de implementação. <a href="http://www.slideshare.net/mathiasbynens/using-jsperf-correctly">Esta apresentação</a> dá dicas e ensina a utilizar a ferramenta.</p>
<p>Você também pode (e deve) utilizar a aba profile do Firebug e/ou do Chrome Developer Tools. <a href="http://michaelsync.net/2007/09/10/firebug-tutorial-logging-profiling-and-commandline-part-ii">Aqui</a> tem um tutorial antigo, mas bacana, sobre o Firebug e <a href="http://www.youtube.com/watch?v=OxW1dCjOstE">aqui</a> você encontra um tutorial sobre o Chrome Developer Tools.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/entendendo-os-reflows-2/" title="Entendendo os Reflows">Entendendo os Reflows</a></li><li><a href="http://tableless.com.br/melhorando-performance-css/" title="Performance do seu CSS">Performance do seu CSS</a></li><li><a href="http://tableless.com.br/javascript-com-cafe/" title="JavaScript com café">JavaScript com café</a></li><li><a href="http://tableless.com.br/jquery-conheca-os-metodos-on-e-off/" title="jQuery: conheça os métodos on() e off()">jQuery: conheça os métodos on() e off()</a></li><li><a href="http://tableless.com.br/manipulacao-de-classes-com-jquery/" title="Manipulação de classes com JQuery">Manipulação de classes com JQuery</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/jquery-dicas-de-otimizacao-e-performance/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>20 plugins jQuery que marcaram 2011</title>
		<link>http://tableless.com.br/20-plugins-jquery-que-marcaram-2011/</link>
		<comments>http://tableless.com.br/20-plugins-jquery-que-marcaram-2011/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 06:29:07 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4734</guid>
		<description><![CDATA[Final de ano, época de listas. Confira 20 plugins jQuery que chamaram atenção em 2011, incluindo slideshows, utilitários para formulários e o framework jQuery Mobile.]]></description>
			<content:encoded><![CDATA[<h3>jQuery Mobile</h3>
<p><a href="http://jquerymobile.com">http://jquerymobile.com</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/jquery-mobile-e1323873805905.jpg" alt="jQuery Mobile" width="590" height="299" class="aligncenter size-full wp-image-4746" /></p>
<p>Apesar de não ser um plugin, o jQuery Mobile encabeça nossa lista por ter sido uma das ferramentas mais importantes do ano. O objetivo do framework é disponibilizar uma API simples e compatível com todos os dispositivos móveis. Seu código é quase todo baseado em HTML e sua interface oferece suporte total a operações com toque.</p>
<h3>Quicksand</h3>
<p><a href="http://razorjack.net/quicksand/">http://razorjack.net/quicksand/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/jQuery-Quicksand-plugin.jpg" alt="Quicksand" width="590" height="300" class="aligncenter size-full wp-image-4749" /></p>
<p>Quem utiliza sistemas e dispositivos da Apple conhece bem a interface simulada pelo plugin Quick Sand, que permite ordenar e filtrar ítens de uma lista, sejam eles ícones, texto ou imagens, utilizando animações e transições.</p>
<h3>Reveal</h3>
<p><a href="http://www.zurb.com/playground/reveal-modal-plugin">http://www.zurb.com/playground/reveal-modal-plugin</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/Reveal_-jQuery-Modal-Plugin-from-ZURB-ZURB-Playground-ZURB.com_.jpg" alt="Reveal" width="589" height="257" class="aligncenter size-full wp-image-4762" /></p>
<p>Reveal é mais um plugin para janelas de alerta/informação. Sua instalação é bem fácil, permitindo executar o plugin diretamente via jQuery ou simplesmente utilizando o atributo &#8216;data-reveal-id&#8217; em um elemento.</p>
<h3>jQuery File Upload</h3>
<p><a href="https://github.com/blueimp/jQuery-File-Upload">https://github.com/blueimp/jQuery-File-Upload</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/jQuery-File-Upload-Demo.jpg" alt="jQuery File Upload Demo" width="589" height="156" class="aligncenter size-full wp-image-4763" /></p>
<p>Plugin para upload de arquivos com suporte a múltiplos envios e drag and drop. O plugin oferece ainda uma barra de progressão, cancelamento e resumo de envios, restrições por tipo de arquivo e preview de imagens. Bem completo.</p>
<h3>QapTcha</h3>
<p><a href="http://www.myjqueryplugins.com/QapTcha/">http://www.myjqueryplugins.com/QapTcha/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/qaptcha.jpg" alt="qaptcha" width="590" height="211" class="aligncenter size-full wp-image-4764" /></p>
<p>Quem aí nunca teve dificuldade em reconhecer um captcha? O QapTcha chega para acabar com essa confusão de letras e números, trocando o captcha tradicional por um slider de liberação.</p>
<h3>DropKick</h3>
<p><a href="http://jamielottering.github.com/DropKick/">http://jamielottering.github.com/DropKick/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/DropKick-a-jQuery-plugin-for-beautiful-dropdowns.jpg" alt="DropKick - a jQuery plugin for beautiful dropdowns" width="589" height="376" class="alignnone size-full wp-image-4766" /></p>
<p>O DropKick bombou bastante no Twitter. É um plugin para a criação de menus dropdowns. Assim como plugins de modal, existem milhares de outros plugins para este tipo de menu. O diferencial do DropKick é a facilidade de criação e o ótimo resultado final em todos os navegadores do mercado.</p>
<h3>ParallaxSlider</h3>
<p><a href="http://tympanus.net/codrops/2011/01/03/parallax-slider/">http://tympanus.net/codrops/2011/01/03/parallax-slider/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/Parallax-Slider-with-jQuery.jpg" alt="Parallax Slider with jQuery" width="589" height="272" class="alignnone size-full wp-image-4767" /></p>
<p>O ParallaxSlider, na verdade, é um tutorial que acabou resultando em um plugin. No link acima você confere uma explicação completa de todo o desenvolvimento do plugin. Seu objetivo é oferecer uma galeria de fotos que adota o princípio de animação que se popularizou esse ano onde o background acompanha a navegação.</p>
<h3>Toast Message</h3>
<p><a href="http://akquinet.github.com/jquery-toastmessage-plugin/">http://akquinet.github.com/jquery-toastmessage-plugin/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/akquinet_jquery-toastmessage-plugin-@-GitHub.jpg" alt="ToastMessage" width="588" height="240" class="alignnone size-full wp-image-4771" /></p>
<p>Mais um plugin para os fãs de Mac. O Toast Message oferece mensagens informativas no formato que ficou popular com o utilitário Growl. Fácil de implementar e personalizar.</p>
<h3>FitText</h3>
<p><a href="http://fittextjs.com">http://fittextjs.com</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/FitText-A-plugin-for-inflating-web-type.jpg" alt="FitText - A plugin for inflating web type" width="589" height="280" class="alignnone size-full wp-image-4769" /></p>
<p><a href="http://tableless.com.br/?s=responsive+design">Responsive Design</a> está na moda. FitText é um plugin que adapta o tamanho de títulos e textos no geral de acordo com o elemento pai, tornando flexíveis as dimensões da fonte.</p>
<h3>jRumble</h3>
<p><a href="http://jackrugile.com/jrumble/">http://jackrugile.com/jrumble/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/jRumble-A-jQuery-Plugin-That-Rumbles-Elements.jpg" alt="jRumble | A jQuery Plugin That Rumbles Elements" width="590" height="313" class="alignnone size-full wp-image-4773" /></p>
<p>jRumble é um plugin para adicionar animações &mdash; tremer, vibrar, balançar ou girar qualquer elemento. Ideal para menus e efeitos hover em links. Possui, além das animações, configurações para opacidade e velocidade.</p>
<h3>Mosaic</h3>
<p><a href="http://buildinternet.com/project/mosaic/">http://buildinternet.com/project/mosaic/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/Mosaic-Sliding-Boxes-and-Captions-jQuery-Plugin-1.jpg" alt="Mosaic - Sliding Boxes and Captions jQuery Plugin-1" width="589" height="378" class="alignnone size-full wp-image-4774" /></p>
<p>Plugin que permite implementar &#8220;boxes deslizantes&#8221; de fotos e/ou conteúdo, com animações e tooltips. O plugin teve origem a partir de um <a href="http://buildinternet.com/2009/03/sliding-boxes-and-captions-with-jquery/">tutorial bastante popular</a>.</p>
<h3>Isotope</h3>
<p><a href="http://isotope.metafizzy.co">http://isotope.metafizzy.co</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/Isotope.jpg" alt="Isotope" width="589" height="263" class="alignnone size-full wp-image-4775" /></p>
<p>Mais um plugin que bombou no Twitter! O Isotope permite a criação de layouts fluidos automagicamente com animações e transições personalizadas.</p>
<h3>Zoomooz</h3>
<p><a href="http://janne.aukia.com/zoomooz/">http://janne.aukia.com/zoomooz/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/Zoomooz.js.jpg" alt="Zoomooz.js" width="589" height="267" class="alignnone size-full wp-image-4776" /></p>
<p>Semelhante ao Isotope, o Zoomooz (ê, nome!) permite a criação de boxes e layout fluido com a diferença de também habilitar um zoom fantástico.</p>
<h3>jQuery uCompare</h3>
<p><a href="http://www.userdot.net/files/jquery/jquery.ucompare/demo/">http://www.userdot.net/files/jquery/jquery.ucompare/demo/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/jQuery-uCompare-plugin.jpg" alt="jQuery uCompare plugin" width="711" height="369" class="alignnone size-full wp-image-4777" /></p>
<p>Já viram aquelas fotos com antes e depois? Este plugin habilita este recurso de forma dinâmica: o usuário pode visualizar a parte que desejar utilizando o mouse.</p>
<h3>ArborJS</h3>
<p><a href="http://arborjs.org">http://arborjs.org</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/arbor.js.jpg" alt="arbor.js" width="590" height="214" class="alignnone size-full wp-image-4784" /></p>
<p>Arbor é um plugin bacana para a visualização de grafos. Sua API é bem rica com diversos métodos para manipular ítens e o grafo como um todo.</p>
<h3>Slides</h3>
<p><a href="http://slidesjs.com">http://slidesjs.com</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/Slides-A-Slideshow-Plugin-for-jQuery.jpg" alt="Slides, A Slideshow Plugin for jQuery" width="590" height="307" class="alignnone size-full wp-image-4783" /></p>
<p>&#8220;Slides é um plugin de slideshow para jQuery desenvolvido com simplicidade em mente.&#8221; E, de fato, o grande diferencial do Slides para outros plugins de slideshow é a simplicidade e facilidade de implementação &mdash; isso sem limitar em nada a personalização.</p>
<h3>Zoomy</h3>
<p><a href="http://redeyeoperations.com/plugins/zoomy/">http://redeyeoperations.com/plugins/zoomy/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/Home-Zoomy-Jquery-Plugin-Image-Zoom-made-easy.jpg" alt="Zoomy Jquery Plugin | Image Zoom made easy" width="589" height="333" class="alignnone size-full wp-image-4782" /></p>
<p>Plugin que habilita uma ferramenta de zoom em imagens, simulando aquela lente famosa da Apple. Possui callbacks permitindo um alto nível de personalização nos eventos de zoom.</p>
<h3>jFormer</h3>
<p><a href="http://www.jformer.com">http://www.jformer.com</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/Demos-jFormer.jpg" alt="jFormer" width="589" height="379" class="alignnone size-full wp-image-4781" /></p>
<p>Forms geralmente são os elementos mais mal-tratados em um aplicativo web. O plugin jFormer visa facilitar o desenvolvimento de forms bonitos, paginados e com validações integradas.</p>
<h3>DynamicNews</h3>
<p><a href="http://www.egrappler.com/rss-driven-dynamic-jquery-news-slider-plugin-dynamic-news/">http://www.egrappler.com/rss-driven-dynamic-jquery-news-slider-plugin-dynamic-news/</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/RSS-Driven-Dynamic-jQuery-News-Slider-Plugin.jpg" alt="RSS Driven Dynamic jQuery News Slider Plugin" width="589" height="180" class="alignnone size-full wp-image-4779" /></p>
<p>O plugin DynamicNews permite a integração de um ticker de notícias com funções para anterior e próxima e tooltips.</p>
<h3>jRating</h3>
<p><a href="http://www.myjqueryplugins.com/jRating">http://www.myjqueryplugins.com/jRating</a></p>
<p><img src="http://tableless.com.br/wp-content/uploads/2011/12/jRating-demonstration-_-jquery-plugin-Ajaxed-star-rating-system-with-jQuery-_-MyjQueryPlugins.com_.jpg" alt="jRating" width="590" height="190" class="alignnone size-full wp-image-4780" /></p>
<p>jRating é um plugin altamente personalizável para a implementação de um sistema de votação com jQuery e AJAX. Permite configurar desde o número de estrelas até callbacks onSuccess e onError.</p>
<h3>Bônus: jQuery Boilerplate</h3>
<p><a href="http://jqueryboilerplate.com">http://jqueryboilerplate.com</a></p>
<p>Desenvolvido pelo brazuca <a href="http://www.zenorocha.com">Zeno Rocha</a> em parceria com Addy Osmani e Adam J. Sontag, o jQuery Boilerplate é um template inicial para a criação de plugins jQuery e deve estar presente nos bookmarks de qualquer desenvolvedor jQuery.</p>
<hr />
<h3>Para 2012&#8230;</h3>
<p>&nbsp;</p>
<h4>Create</h4>
<p><a href="http://createjs.org">http://createjs.org</a></p>
<p>O plugin Create ainda vai dar muito o que falar. Seu objetivo é oferecer uma interface de edição de conteúdo inline, recurso ainda pouco explorado por desenvolvedores.</p>
<h4>nanoScroller</h4>
<p><a href="http://jamesflorentino.com/jquery.nanoscroller/">http://jamesflorentino.com/jquery.nanoscroller/</a></p>
<p>A personalização da barra de scroll foi moda durante um tempo e (ainda bem?) ficou no passado. O plugin nanoScroller oferece um scroll simples, simulando o visual do Mac OS.</p>
<hr />
<p>Esqueci algum? Deixei de fora aquele plugin que você curtiu muito? Compartilhe com a gente nos comentários!</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/javascript-com-cafe/" title="JavaScript com café">JavaScript com café</a></li><li><a href="http://tableless.com.br/jquery-conheca-os-metodos-on-e-off/" title="jQuery: conheça os métodos on() e off()">jQuery: conheça os métodos on() e off()</a></li><li><a href="http://tableless.com.br/manipulacao-de-classes-com-jquery/" title="Manipulação de classes com JQuery">Manipulação de classes com JQuery</a></li><li><a href="http://tableless.com.br/jquery-metodos-desconhecidos/" title="jQuery: métodos desconhecidos">jQuery: métodos desconhecidos</a></li><li><a href="http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-1/" title="Testando seu código jQuery com Jasmine &#8211; Parte 1">Testando seu código jQuery com Jasmine &#8211; Parte 1</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/20-plugins-jquery-que-marcaram-2011/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Formulários e o Metawebdesign &#8211; Parte 1</title>
		<link>http://tableless.com.br/formularios-e-o-metawebdesign-parte-1/</link>
		<comments>http://tableless.com.br/formularios-e-o-metawebdesign-parte-1/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 11:06:00 +0000</pubDate>
		<dc:creator>Alysson Franklin</dc:creator>
				<category><![CDATA[Acessibilidade]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Tecnologia e Tendências]]></category>
		<category><![CDATA[design de interação]]></category>
		<category><![CDATA[design de interface]]></category>
		<category><![CDATA[metawebdesign]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4395</guid>
		<description><![CDATA[Como montar formulários quando você é o responsável pelo código e design.]]></description>
			<content:encoded><![CDATA[<p>O front-end é uma profissão de uma amplitude imensa. Temos profissionais montando mockups/PSDs, especialistas em acessibilidade, usabilidade, arquitetura da informação, integração com aplicações, designers de interface, application developers. Tem até SEO.</p>
<p>O background do profissional neste momento não importa muito, apenas a afirmação que ele está trabalhando na camada de <strong>front-end</strong>. Só isso basta para confirmar os papéis acima.</p>
<p>Em muitas empresas o front-end é trabalhado de maneira criteriosa, com <strong>separação de tarefas</strong> em maior ou menor intensidade, de modo que o <strong>processo</strong> esteja sempre azeitado e atento aos <strong>prazos</strong> dos outros times que dependem da interface. Em algumas outras, o responsável pelo código é o unico responsável por fazer tudo isso acima. E isso acontece com <strong>frequência</strong>.</p>
<p>É o famigerado exército-de-um-homem-só, que em um projeto normalmente é responsável por:</p>
<ul>
<li><strong>Pesquisa: </strong>Fornece dados e insights para o desenvolvimento de todo o projeto – sobre o usuário, suas características, hábitos e necessidades. Apesar de orientada a um projeto específico, essa pesquisa também deve ser constante, oferecendo atualização e embasamento para a criação de novas experiências.</li>
<li><strong>Arquitetura da informação:</strong> Organização de informação, entendendo o modelo mental do usuário, para que ele se reflita também no produto final.</li>
<li><strong>Design da interação: </strong>Desenhar a interação de forma que ela seja consistente, fácil e auto-explicativa. Entende ros requisitos de usabilidade criados na fase de <strong>pesquisa</strong> e dominar os padrões de interação que a aplicação deve ter, além de saber lidar com a multiplicidade de devices e plataformas onde a interação ocorre.</li>
<li><strong>Design Visual: </strong>Balanceando beleza e comunicação, domina tanto a direção de arte do produto que está sendo desenvolvido quanto o acabamento final dos pequenos detalhes da interface.</li>
<li><strong>Redação: </strong>Expressar as ideias, simples ou complexas que o cliente passou para o desenvolvedor em palavras simples e que sejam facilmente entendidas pelos usuários do produto. Este conteúdo vem do cliente, mas não é difícil acontecer  do desenvolvedor ser responsável por criar algum conteúdo, seja transformando a linguagem do cliente dentro de um contexto web, deixando-a mais dinâmica e convidativa a leitura, seja pequenos conteúdos que devem ditar padrões visuais para interações do usuário.</li>
<li><strong>Prototipagem:  </strong>Criação da UI. Isso serve tanto para o estágio inicial do projeto (com protótipos de papel, de baixa fidelidade) quanto para o estágio que precede o desenvolvimento, onde o produto já está mais amadurecido e mais próximo do final. Esta etapa pode ser a da criação das páginas em si, uma vez que os modelos de conceito e interação estão prontos e o design está criado ( sites tipicamente estáticos ou de menor porte ) ou pode ser a fase da criação dos protótipos que devem ir para a integração depois (back-end).<strong><br />
</strong></li>
<li><strong>Gerenciamento: </strong>Garantir o funcionamento de todas as áreas de entrega da melhor e mais produtiva maneira possivel. E ainda ser o ponto focal com cliente e usuário, quando necessário.</li>
</ul>
<p>Em um departamento multidisciplinar de UX, no melhor dos mundos, temos atribuições diferentes para diferentes profissionais. Muitas vezes, isso não acontece. Outros casos, não raros, a empresa não está interessada na matéria, ou apenas não tem profissionais que atuam nesta área que se preocupam com o código (e design) que entregam. Vai saber. Em empresas com atribuções de projeto mais estruturadas um departamento de UX conversa claramente com outros áreas, como Arquitetura, DBA, Requisitos, Integração, Testes e Gerência.</p>
<p>No <a href="http://frontinbh.com.br/blog/">FrontInBH</a>, conversando com os desenvolvedores no final do evento, e também em conversas com <em>devs</em> de todos os cantos, é fácil perceber que empresas com equipes de desenvolvimento reduzidas (SMB, agências, pequenos portais) mantém um ou dois especialistas que acabam fazendo todo o serviço. E estes profissionais acabam por andar entre duas profissões distintas: <strong>Designer de Interação e Interfaces </strong>ou o <strong>Desenvolvedor web</strong>.</p>
<p>Vale lembrar que estas duas profissões tem backgrounds muito diferentes. Enquanto os designers lidam com <strong>abstração</strong>, <em>devs</em> costumam lidar com a<strong>objetividade</strong> do código. Disciplinas que vão de <strong>Teoria de Cores</strong> à <strong>Orientação a objetos</strong> fazem parte do background destes profissionais, porém é com muito trabalho que são desenvolvidos as especialidades, devido a matérias tão antagônicas.</p>
<div id="attachment_4473" class="wp-caption alignnone" style="width: 610px"><a href="http://tableless.com.br/wp-content/uploads/2011/10/multidisciplinar.png"><img class="size-full wp-image-4473" src="http://tableless.com.br/wp-content/uploads/2011/10/multidisciplinar.png" alt="" width="600" height="308" /></a><p class="wp-caption-text">Algumas das disciplinas que um profissional de web hoje deve saber para atender demandas de projeto</p></div>
<p>Essa diferença de backgrounds acaba por oferecer barreiras que fazem com que o desenvolvimento e a integração das disciplinas seja muito difícil. E com isso temos profissionais que desenham interfaces e interações lindas, mas que não podem funcionar sob conceitos de acessibilidade, ou ainda websites perfeitamente acessíves e fluídos, mas que não tem um design tão impactante.</p>
<p>Diante deste cenário tenho trabalhado para desenvolver um conceito que chamo de <strong><a href="http://metawebdesign.org">Metawebdesign</a></strong>. A proposta é justamente encurtar estes espaços, sem incomodar profissões importantíssimas e já consolidadas, mas que por razões diversas em algumas vezes acabam por ser a mesma coisa no organograma de uma empresa.</p>
<p>Meu primeiro e segundo artigos sobre o assunto vão falar sobre <strong>formulários</strong>. Muito já foi falado, e não quero repetir o que já sabemos. Porém é importante mostrar como conceitos de <strong>design da interação</strong>,<strong> arquitetura da informação</strong> e <strong>código </strong>são usados para criar aplicações que oferecem uma experiência inesquecível para o usuário. Estes dois posts iniciais sobre o assunto se transformam em um toolkit muito útil aonde você poderá com a parte 1 e 2 escolher usando conceitos de design os melhores elementos de controle e depois entender como codificá-los de acordo com os padrões do W3C, mantendo usabilidade e acessibilidade.</p>
<h2><a name="h.ce7pzpue3djo"></a>Aplicando o Metawebdesign a formulários: o design da interface</h2>
<p>Cedo ou tarde, a aplicação que você esta criando vai precisar perguntar (ou pedir) ao usuário algum tipo de informação. E sob o ponto de vista do usuário, nesse momento a credibilidade de seu design de interação e código estarão em jogo, pois complexidade e simplicidade aqui separam o céu e o inferno.</p>
<p>Todos sabem como usar alguns <span class="c0">elementos de controle</span> como input texts, checkboxes, radio e dropdowns &#8211; e isso não somos nós desenvolvedores de aplicações web. Isso é consenso, domínio público: um <span class="c11">status quo </span>que todo usuário de computador aprendeu a identificar e saber operar. Mesmo novos usuários entendem estes elementos com uma rapidez impressionante. O problema é como agrupar todos eles em torno de um bem comum &#8211; o bem sucedido submit. Afinal de contas, fazer um formulário é simples, basta colocar um <span class="c11">bando </span>de informações ordenadas de maneira racional, colocá-las na página com alguma ordenação <span class="c8"><a href="http://en.wikipedia.org/wiki/Top%E2%80%93down_and_bottom%E2%80%93up_design">top-bottom</a></span> e é isso, correto?</p>
<p>Para começarmos a conversa, isso é o que os <span class="c0">usuários </span>esperam.</p>
<p>De acordo com o <span class="c8"><a href="http://www.w3.org/TR/html4/interact/forms.html#h-17.1">w3c</a></span>, um formulário HTML (form) é uma seção do documento HTML que pode conter <span class="c0">informação estática</span>, <span class="c0">elementos de controle</span> (os mesmos mecionados acima e alguns outros que vamos falar aqui) e <span class="c0">labels</span> que referenciam estes controles semanticamente. Tudo isso para permitir que o usuário possa responder (ou preencher) uma série de perguntas que a sua aplicação precisa para prosseguir com o fluxo. E o usuário interage com tudo isso <span class="c0">alterando</span> <span class="c0">elementos de controle</span>.</p>
<h3><a name="h.vz2ra8bmzqo4"></a>Bons e maus exemplos:</h3>
<p>Bons exemplos de formulário são fáceis: você mesmo deve conhecer vários; são aqueles que você usa diariamente sem gastar muito tempo ou que não entediam durante seu preenchimento. Maus exemplos são fáceis e estão por todos os cantos da internet, não é difícil encontrar um (na verdade não precisamos nem procurar). Só que não é ético questionar o trabalho de ninguém sem saber as variáveis que levaram aquela implementação. Sendo assim, olha que “bonito” esse <span class="c8"><a href="http://developer.apple.com/internet/webcontent/examples/bad_form.html">formulário que está no site da Apple como exemplo de um mau form</a></span>.</p>
<div id="attachment_4401" class="wp-caption alignnone" style="width: 789px"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image04.png"><img class="size-full wp-image-4401" src="http://tableless.com.br/wp-content/uploads/2011/10/image04.png" alt="" width="779" height="266" /></a><p class="wp-caption-text">Acredite: foi difícil até colocar tudo isso em um espaço visível. E ainda nao ficou bom.</p></div>
<p>&nbsp;</p>
<p>Antes de entrarmos de cabeça nos elementos e como formulários devem ser criados, precisamos entender alguns principios básicos de um design de form:</p>
<h2><a name="h.1a8j29a5szsl"></a>Form Design &#8211; O básico:</h2>
<ol start="1">
<li><strong>Tenha certeza que o usuário entende o que e o porque você está pedindo ou perguntando algo;</strong><br />
Escreva labels com palavras que seus usuários possam entender facilmente independente de serem usuários frequentes ou novos usuários, tenha cuidado com os jargões ou acrônimos utilizados. Se necessário, <span class="c11">desenhe </span>para o usuário.</li>
<ul>
<li><strong>exemplo 1 : </strong>antes de um grande formulário, tome algum espaço da tela para explicar como ele funciona e o porque você precisa de todas aquelas informações.</li>
<li><strong>exemplo 2: </strong>Se você precisa colocar um controle na tela que não é imediatamente óbvio dentro de um fluxo da tela, use uma tooltip ou outro tipo de ajuda que mostre ao usuário o que ele deve fazer em seguida.</li>
</ul>
<li><strong>Se puder, evite a redundância;<br />
</strong>Antes de colocar os campos em uma tela, analise a informação e o contexto de cada um deles e se possível, agrupe informações para minimizar o numero de campos a serem preenchidos. Mesmo no melhor dos cenários, gastar tempo preenchendo caixas de texto não é algo divertido.</li>
<ul>
<li><strong>exemplo 1: </strong>se o usuário já preencheu o endereço de entrega no formulário de checkout, você pode reutilizar esta informação para o endereço de cobrança. Basta adicionar um checkbox perguntando se o endereço de entrega e cobrança são os mesmos que em caso de positivo, você já atendeu aos requisitos.</li>
<li><strong>exemplo 2:</strong> Se 80% dos seus usuários estão no Brasil, 15% estão na Argentina e 3% nos Estados Unidos, você pode usar um &lt;select&gt; ao invés de uma &lt;input type=”text”&gt; para atender os requisitos de país. As opções seriam Brasil, Argentina, USA e logo após teríamos lista com a ordenação alfabética.</li>
<li><strong>exemplo 3:</strong> Para endereços no Brasil, no &lt;fieldset&gt; de localização, perguntando apenas o CEP podemos recuperar endereço, bairro, cidade e estado. Com isso faz sentido perguntar primeiramente o CEP, recuperar o valor via webservice e após o sucesso automaticamente preencher estes campos para o usuário.</li>
<li><strong>Existem também exceções:</strong> A <span class="c0">segurança</span> deve ser levada em conta ao ponderar sobre recursos de auto-completion. Não seria ético tampouco legal recuperar os dados do cartão de crédito do usuário para onerá-lo da tarefa de inputar seus dados bancários, uma das partes mais tediosas e passíveis de erro durante a transação de um checkout.</li>
<li><strong><br />
</strong></li>
</ul>
<li><strong>Informações de conhecimento público normalmente são mais acuradas que informações de conhecimento pessoal;</strong> Quando perguntamos algo ao usuário, temos que ter em mente que eles podem mentir (<span class="c8 c11"><a href="http://www.youtube.com/watch?v=nNOExDrsdbg">everybody lies</a></span>) ou mesmo errar. Podemos minimizar isso reduzindo problemas. O sistema de <span class="c11">auto-completion</span> com o CEP mencionado acima é um exemplo claro. Um erro simples de digitação pode causar um problemão na hora da entrega: a rua <span class="c0">Roda dos Ventos</span> pode virar rua <span class="c0">Rosa dos Ventos</span> em um clique. Probabilidade altíssima de problemas futuros que <span class="c0">você </span>pode evitar usando este tipo de abordagem.</li>
<li><strong>Tenha cuidado ao transformar os requisitos de design em forms;</strong><br />
A maioria dos forms é criada para manipular transações feitas com o banco de dados ou alterar objetos de uma tela. Explore as dependências entre os elementos, procure por similaridades que possam ser agrupadas graficamente, como <span class="c0">campos de endereço</span> ou i<span class="c0">nformações pessoais</span>. O exemplo do endereço de entrega versus o endereço de cobrança mencionado na regra #2 pode ser repetido aqui. Porque não habilitar em um form de inserir produto um drag-n-drop para definir a ordenação das imagens de descrição deste produto ao invés de subir as imagens em uma ordem pré definida ou ainda primeiro subir as imagens para só depois ordenar?<br />
<strong><br />
</strong></li>
<li><strong>Teste, teste novamente e quando achar que está tudo ok, teste de novo;</strong> Por alguma razão que nunca vamos descobrir, é incrivelmente fácil desenvolvedores e usuários terem idéias completamente diferentes quando o assunto é preencher um formulário. O <span class="c0">mesmo</span> form! Isso pode acontecer pelos mais variados modos:</li>
<ul>
<li>conhecimento prévio com interações passadas,</li>
<li>respostas possíveis,</li>
<li>fluxo de página que depende de um contexto que o usuário pode entender de maneira diferente dependo de variáveis externas.</li>
</ul>
</ol>
<p>Por isso é importante montar o formulário e se certificar que <span class="c0">todas </span>as possibilidades de interação do usuário com os elementos da tela estão garantidas:</p>
<ul>
<ul>
<li>preenchimento de campos;</li>
<li>clique/toque em botões e objetos de tela;</li>
<li>entrada de dados validados para atender requisitos de design da aplicação;</li>
<li>condições especiais de uso e interação do form.</li>
</ul>
</ul>
<p>Isso nos dá <strong>evidência empírica</strong> do que funciona e o que nao funciona em sua aplicação, além de claramente indicar o caminho a seguir no caso de identificar um problema.</p>
<ol class="c12" start="1">
<li><strong>Escolha sabiamente os elementos de controle:</strong> eles impactam a expectativa do usuário sobre o que ele está sendo perguntado e como deve responder a isso:</li>
</ol>
<ul>
<ul>
<li>Os usuários tendem a associar o tamanho e forma física dos campos a o que eles <span class="c0">imaginam </span>que seja o que estamos perguntando. Só depois desta associação é que os usuários lêem o que o label de um campo está pedindo.</li>
<li>Uma única radio button vai ser algo <span class="c11">ditatorial</span> pois sugere a existência de pelo menos <span class="c0">duas </span>opções na tela.</li>
<li>Após você estar acostumado com o processo de compra de sua loja online e seu formulário, automaticamente você irá suavizar sua atenção por não ser uma tarefa nova e sim uma repetição (e daí entendemos o porque a estrada para para erramos um formulário que preenchemos “todo dia” é tão curta)</li>
</ul>
</ul>
<h3><a name="h.bxu0ugomhbvf"></a>Escolhendo elementos de controle</h3>
<p>Quando estamos montando o design do nosso form temos que nos ater a algumas situações que impactam diretamente todo o formulário:</p>
<ol class="c13" start="1">
<li><strong>Espaço disponível na tela: </strong>não precisamos falar nada sobre isso. Cada pixel conta e sabemos disso muito bem, então escolha sabiamente como usar os elementos para tirar total proveito da sua área de exibição.</li>
<li><strong>Sofisticação no formulário deve respeitar uso geral dos forms: </strong>&lt;input type=”text”&gt; é algo que todos os usuários estão familiarizados a usar e vão fazê-lo bem, mas nem todo mundo estará confortável em usar um slider de range, com acionamento duplo.</li>
<li><strong>O form deve respeitar o conhecimento público nos domínios da sua app:</strong> É aceitável você usar um &lt;input type=”text”&gt; para um campo que aceita valores entre 0 e 1000. Mas isso iria requerer uma validação para certificar que numeros maiores ou negativos fossem inputados. Se a maior base dos seus usuários está confortável com esta regra, não existe o motivo de usarmos o mesmo slider de range mencionado acima, por todos os problemas de implementação, tempo, acessibilidade e principalmente, dificuldade de uso.</li>
<li><strong>Elementos externos criam expectativas que podem ser erradas:</strong> Temos o conhecimento que <span class="c0">negrito</span>, <span class="c11">itálico</span><span class="c11 c0"> </span>e <span class="c10">sublinhado</span><span class="c0"> </span>são iconografias que foram criadas para dar um destaque a alguma palavra. Fica fora de contexto utilizarmos estas formas para exibir labels por exemplo.<br />
<a href="http://tableless.com.br/wp-content/uploads/2011/10/image05.png"><img class="alignnone size-full wp-image-4402" src="http://tableless.com.br/wp-content/uploads/2011/10/image05.png" alt="" width="196" height="28" /></a><br />
<span class="c6 c0">Olha o fast-food “encostando uma arma na sua cabeça” ao perguntar o que é mais saudável.</span></li>
<li><span class="c0">Tecnologia disponível: </span>o HTML e suas APIs oferecem suporte a muitos elementos de controle, e para os que não são suportados nativamente, existe uma grande gama de toolkits e frameworks que vai te ajudar a implementar aparência e controle em situações específicas.</li>
</ol>
<h3><a name="h.2g3v8mmslxxw"></a>Elementos de controle de Formulários</h3>
<p>Para fazer o design de uma tela de formulário, precisamos de elementos de controle. No jargão do HTML, seriam elementos HTML, que nada mais é que o conteúdo que está dentro de uma tag, podendo inclusive ter outros elementos filho caso seja do interesse. Dito isso, fica muito mais fácil entender como o design trabalha com elementos de controle. Após escolher seus elementos na tabela abaixo, tudo que você precisa é codificá-los seguindo os padrões que já conhecemos.</p>
<p>Montar uma tela de formulário não é complicado. Estamos acostumados a fazer isso todos os dias. Porém existem mais coisas entre o céu e a terra do que pode imaginar a nossa vã filosofia. O tópico acima mostra algumas variáveis que as vezes podem passar desapercebido e podem ajudar &#8211; e muito na hora de montar o design da sua tela. Você consegue se imaginar trabalhando orientado ao <span class="c8"><a href="http://tableless.com.br/introducao-ao-responsive-web-design/">Responsive Webdesign</a></span> sem utilizar os conceitos básicos mostrados acima? Pode parecer óbvio, mas é importante manter isso em mente ao utilizar a tabela abaixo:</p>
<p>Elementos de controle em um formulário são divididos em:</p>
<table id="tblMain" class="tblGenFixed" style="font-size: 10px !important;font-family: verdana !important" border="0" cellspacing="2" cellpadding="2">
<tbody>
<tr>
<td class="s0">
<h3>Causa</h3>
</td>
<td class="s1">
<h3>Tipo de interação</h3>
</td>
<td class="s2">
<h3>Elementos aceitáveis</h3>
</td>
<td class="s1">
<h3>Prós</h3>
</td>
<td class="s1">
<h3>Contras</h3>
</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Checkbox</td>
<td class="s6">Simples e pouco espaço utilizado na tela</td>
<td class="s6">Checkbox podem ser usadas para múltiplas escolhas, coisa que usuários já estão acostumados ao visualizá-las. Isso pode levar ao erro, uma vez que é necessário entender que este checkbox único compreende uma escolha sim/não</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Radio button</td>
<td class="s6">Duas opções visíveis. Fácil entendimento do usuário</td>
<td class="s6">Espaço de tela usado maior que checkboxes únicas</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Dropdown</td>
<td class="s6">Duas opções visíveis. Pouco espaço utilizado na tela. Permite expansão para múltiplas opções facilmente utilizando pouco espaço da tela</td>
<td class="s6">Apenas uma opção é visualizada por vez. Requer alguma destreza no uso de formulários. Pode oferecer desafios de acessibilidade a pessoas com deficiência ou que preferem navegação pelo teclado.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Toggle Buttons Iconográficos</td>
<td class="s6">Mesmos prós do checkbox, desde que a opção seja mostrada como ícone visual</td>
<td class="s6">Mesmos contras o checkbox, além do fato que não é uma opção padrão para seleção de texto como checkboxes.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolhas binárias</td>
<td class="s5">Menu com Radio button</td>
<td class="s6">Espaço mínimo utilizado na tela uma vez que o menu é encontrado em barras ocultas de menu ou lightboxes.</td>
<td class="s6">Requer muita destreza para encontrá-los e utilizá-los. Necessitam de indicações para que sejam fáceis de ser encontrados em uma tela.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Radio button</td>
<td class="s6">Todas as opções estão sempre disponíveis na tela.</td>
<td class="s6">Utiliza um espaço considerável na tela.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Dropdown</td>
<td class="s6">Pouco espaço utilizado na tela.</td>
<td class="s6">Enquanto o menu nao está expandido, mostra apenas uma das opções. Novamente requer alguma destreza para operá-lo e pode tambem oferecer desafios de acessibilidade.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Toggle Buttons Iconográficos</td>
<td class="s6">Pouco espaço utilizado na tela. Todas as opções estão visíveis na tela.</td>
<td class="s6">Os ícones podem precisar de tooltips para descrição, uma vez que a imagem pode não ser de fácil entendimento para todos os usuários.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Menu com Radio button</td>
<td class="s6">Espaço mínimo utilizado na tela uma vez que o menu é encontrado em barras ocultas de menu ou lightboxes.</td>
<td class="s6">Requer muita destreza para encontrá-los e utilizá-los. Necessitam de indicações para que sejam fáceis de ser encontrados em uma tela.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Listbox</td>
<td class="s6">Muitas opções podem ser visíveis. O frame de seleção pode ser reduzido para até 3 items, permitindo scroll</td>
<td class="s6">Espaço de tela usado maior que dropdowns ou spinners. Necessita aplicação de padrões de seleção, permitindo seleção única apenas.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Escolha 1 de N para poucas opções</td>
<td class="s5">Spinner</td>
<td class="s6">Pouco espaço utilizado na tela.</td>
<td class="s6">Apenas uma opção é visualizada por vez. Requer muita destreza no uso de formulários e conhecimento deste elemento, pouco utilizado até o lançamento dos novos input types no HTML5. Pode oferecer desafios de acessibilidade a pessoas com deficiência, que preferem navegação pelo teclado ou ainda usuários com ponteiros (mouse) já que a área de clique é mínima.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha 1 de N para muitas opções</td>
<td class="s5">Dropdown</td>
<td class="s6">Pouco espaço utilizado na tela.</td>
<td class="s6">Apenas uma opção é visualizada por vez. Requer muita destreza no uso de formulários. Pode oferecer desafios de acessibilidade a pessoas com deficiência, que preferem navegação pelo teclado ou ainda usuários com ponteiros (mouse) já que a área de scroll é mínima.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha 1 de N para muitas opções</td>
<td class="s5">Listbox</td>
<td class="s6">Muitas opções podem ser visíveis. O frame de seleção pode ser reduzido para alguns items de modo a ganhar espaço (permitindo scroll)</td>
<td class="s6">Espaço de tela usado maior que dropdowns. Necessita aplicação de padrões de seleção, permitindo seleção única apenas.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha 1 de N para muitas opções</td>
<td class="s5">Treeview</td>
<td class="s6">Muitas opções visíveis inicialmente, pode oferecer facilidades na cognição já que seus items estarão categorizados por níveis ou tipos (pastas)</td>
<td class="s6">Grande espaço utilizado na tela. Requer muita destreza no uso de formulários.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Array de checkboxes</td>
<td class="s6">Todas as opções estão sempre disponíveis na tela.</td>
<td class="s6">Grande espaço utilizado na tela.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Array de Toggle Buttons Iconográficos</td>
<td class="s6">Pouco espaço utilizado na tela. Todas as opções estão visíveis na tela.</td>
<td class="s6">Os ícones podem precisar de tooltips para descrição, uma vez que a imagem pode não ser de fácil entendimento para todos os usuários.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Menus com Checkboxes</td>
<td class="s6">Espaço mínimo utilizado na tela uma vez que o menu é encontrado em barras ocultas de menu ou lightboxes.</td>
<td class="s6">Requer muita destreza para encontrá-los e utilizá-los. Necessitam de indicações para que sejam fáceis de ser encontrados em uma tela.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Listbox</td>
<td class="s6">Muitas opções podem ser visíveis. O frame de seleção pode ser reduzido para alguns items de modo a ganhar espaço (permitindo scroll)</td>
<td class="s6">Todas as opções não estão disponíveis na tela, requerendo scroll. Usuário precisa de indicações de que a caixa permite múltiplas seleções. Requer muita destreza no uso de formulários. Pode oferecer desafios de acessibilidade.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Treeview</td>
<td class="s6">Muitas opções visíveis inicialmente, pode oferecer facilidades na cognição já que seus items estarão categorizados por níveis ou tipos (pastas)</td>
<td class="s6">Grande espaço utilizado na tela. Requer muita destreza no uso de formulários.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Escolha N de N para muitas opções</td>
<td class="s5">Listbuilder</td>
<td class="s6">Items selecionados são de fácil visualização. Pode permitir fácil expansão para escolha e ordenação de items. Lida facilmente com grandes listas.</td>
<td class="s6">Grande espaço utilizado na tela. Funciona bem para grandes listas com poucas seleções. Muitas seleções oferecem dificuldades na visualização.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Criando listas não ordenadas</td>
<td class="s5">Caixa com botão de adição/novo</td>
<td class="s6">Ação de adicionar registro é visível e óbvia para o usuário</td>
<td class="s6">Grande espaço utilizado na tela. Visualmente bagunçado quando usuário insere muitos items.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Criando listas não ordenadas</td>
<td class="s5">Caixa com edição in-place</td>
<td class="s6">Menor uso de tela. A adição é feita in-place, dentro da caixa</td>
<td class="s6">Ação de adição não é tão óbvia quanto a caixa com botão de adição</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s7" bgcolor="#fef2f3">Criando listas não ordenadas</td>
<td class="s5">Caixa com edição drag-n-drop</td>
<td class="s6">Visualmente elegante e de fácil entendimento, uma vez que arrastar é uma ação intuitiva</td>
<td class="s6">Necessita de indicações que mostram que na caixa existe uma área de arrastar.</td>
</tr>
<tr>
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Criando listas ordenadas</td>
<td class="s5">Caixa com botões acima/abaixo para ordenação</td>
<td class="s6">Ações de rearranjo sempre visíveis na página.</td>
<td class="s6">Grande espaço utilizado na tela.</td>
</tr>
<tr bgcolor="#eee">
<td class="s3" bgcolor="#ff0000">Seleções e listas</td>
<td class="s4" bgcolor="#facacb">Criando listas ordenadas</td>
<td class="s5">Caixa com drag-n-drop de items</td>
<td class="s6">Visualmente elegante e de fácil entendimento, uma vez que arrastar é uma ação intuitiva</td>
<td class="s6">Necessita de indicações que mostram que na caixa existe uma área de arrastar.</td>
</tr>
<tr>
<td class="s8" bgcolor="#3c78d8">Texto</td>
<td class="s9" bgcolor="#a4c2f4">Inputs para uma linha de texto</td>
<td class="s6">Textbox</td>
<td class="s6">&#8211;</td>
<td class="s6">&#8211;</td>
</tr>
<tr bgcolor="#eee">
<td class="s8" bgcolor="#3c78d8">Texto</td>
<td class="s10" bgcolor="#dfecf8">Múltiplas linhas de texto não formatado</td>
<td class="s6">Textarea</td>
<td class="s6">&#8211;</td>
<td class="s6">&#8211;</td>
</tr>
<tr>
<td class="s8" bgcolor="#3c78d8">Texto</td>
<td class="s9" bgcolor="#a4c2f4">Múltiplas linhas de texto formatado</td>
<td class="s6">Textarea que permite tags inline</td>
<td class="s6">Usuários avançados podem evitar o uso da toolbar inputando as tags diretamente</td>
<td class="s6">Não é realmente um editor WYSIWYG</td>
</tr>
<tr bgcolor="#eee">
<td class="s8" bgcolor="#3c78d8">Texto</td>
<td class="s9" bgcolor="#a4c2f4">Múltiplas linhas de texto formatado</td>
<td class="s6">Editor Rich text</td>
<td class="s6">Texto inputado já serve de preview.</td>
<td class="s6">Nao permite edição apenas pelo teclado. É necessário o uso da toolbar para adicionar as tags necessárias.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Números com qualquer tipo de formato</td>
<td class="s6">Textbox com máscaras</td>
<td class="s6">Visualmente elegante e permite qualquer tipo/formato de tipos de dado</td>
<td class="s6">Requer validação no back-end.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Números com qualquer tipo de formato</td>
<td class="s6">Textbox estruturado e com máscaras</td>
<td class="s6">Formato dos dados é explícito, facilitando preenchimento e entendimento do usuário</td>
<td class="s6">Pode requerer grande espaço na tela. Também não permite inputs diferentes dos previstos, mesmo que o usuário deseje isso.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Números com qualquer tipo de formato</td>
<td class="s6">Spinner</td>
<td class="s6">Permite input sem o uso de teclado caso deseje o usuário</td>
<td class="s6">Apenas uma opção é visualizada por vez. Requer muita destreza no uso de formulários e conhecimento deste elemento, pouco utilizado até o lançamento dos novos input types no HTML5. Pode oferecer desafios de acessibilidade a pessoas com deficiência, que preferem navegação pelo teclado ou ainda usuários com ponteiros (mouse) já que a área de clique é mínima.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s13" bgcolor="#ffd966">Números dentro de um limite pre-definido</td>
<td class="s6">Slider</td>
<td class="s6">Metáfora óbvia, valor é mostrado de acordo com a posição do marcador. Usuário não pode inputar números fora deste range</td>
<td class="s6">Pode requerer grande espaço na tela. Labels muito grandes podem se transformar em um problema também</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s13" bgcolor="#ffd966">Números dentro de um limite pre-definido</td>
<td class="s6">Spinner</td>
<td class="s6">Pouco espaço utilizado na tela, permite inputs direto pelo teclado e tambem via clique</td>
<td class="s6">Não é familiar para todos os usuários. Pode oferecer desafios de acessibilidade a pessoas com deficiência, que preferem navegação pelo teclado ou ainda usuários com ponteiros (mouse) já que a área de clique é mínima. Requer validação no back-end.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s13" bgcolor="#ffd966">Números dentro de um limite pre-definido</td>
<td class="s6">Textbox com validação pós-input</td>
<td class="s6">Familiar ao usuário, pouco espaço utilizado na tela, acesso via teclado.</td>
<td class="s6">Requer validação no back-end. Range não é visível para o usuário, requer indicações dos limites para input.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s13" bgcolor="#ffd966">Números dentro de um limite pre-definido</td>
<td class="s6">Slider com textbox</td>
<td class="s6">Permite inputs visuais(slide) e numéricos(input manual)</td>
<td class="s6">Complexo, requer validação dos inputs no textbox.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Criando um subrange dentro de um range maior</td>
<td class="s6">Slider duplo</td>
<td class="s6">Menor uso de tela quando comparado com 2 sliders.</td>
<td class="s6">Não é familiar para a maioria dos usuários. Problemas graves de acessibilidade porque não permite inputs via teclado.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Criando um subrange dentro de um range maior</td>
<td class="s6">2 Sliders</td>
<td class="s6">Utilização mais fácil que um slider duplo.</td>
<td class="s6">Grande espaço utilizado na tela. Problemas graves de acessibilidade porque não permite acesso via teclado.</td>
</tr>
<tr bgcolor="#eee">
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Criando um subrange dentro de um range maior</td>
<td class="s6">2 Spinners</td>
<td class="s6">Pouco espaço utilizado na tela, permite inputs direto pelo teclado e tambem via clique</td>
<td class="s6">Não é familiar para todos os usuários. Requer validação no back-end. Não permite visualização do range maior.</td>
</tr>
<tr>
<td class="s11" bgcolor="#ff9900">Números</td>
<td class="s12" bgcolor="#fff2cc">Criando um subrange dentro de um range maior</td>
<td class="s6">Textbox com validação pós-input</td>
<td class="s6">Familiar para o usuário, ocupa menos espaço que sliders</td>
<td class="s6">Requer validação e é necessário informar o range de alguma maneira para o usuário.</td>
</tr>
<tr bgcolor="#eee">
<td class="s14" bgcolor="#6aa84f">Data / Horário</td>
<td class="s6">&#8211;</td>
<td class="s6">Textbox com máscaras</td>
<td class="s6">Visualmente simples, permite amplo range de formatos. Permite acesso via teclado</td>
<td class="s6">Requer validação back-end. Pode causar confusão no formato data/hora por não haver indicações explicitas.</td>
</tr>
<tr>
<td class="s14" bgcolor="#6aa84f">Data / Horário</td>
<td class="s6">&#8211;</td>
<td class="s6">Textbox estruturado e com máscaras</td>
<td class="s6">Formato dos dados é explícito, facilitando preenchimento e entendimento do usuário</td>
<td class="s6">Pode requerer grande espaço na tela. Também não permite inputs diferentes dos previstos, mesmo que o usuário deseje isso.</td>
</tr>
<tr bgcolor="#eee">
<td class="s14" bgcolor="#6aa84f">Data / Horário</td>
<td class="s6">&#8211;</td>
<td class="s6">Datepicker</td>
<td class="s6">Metáfora óbvia, calendário é exibido e a seleção do valor faz o input</td>
<td class="s6">Grande espaço utilizado na tela. Pode oferecer problemas de acessibilidade caso não se permita acesso via teclado.</td>
</tr>
</tbody>
</table>
<ol start="1">
<li>Seleções e listas:</li>
</ol>
<ul>
<li>Seleções binárias: sim/não, ativo/inativo, etc;</li>
<li>Escolha de <span class="c0">UM</span> item para <span class="c0">N</span> com poucas e muitas opções;</li>
<li>Escolha de <span class="c0">N </span>items para <span class="c0">N </span>com poucas e muitas opções;</li>
<li>Listas não-ordenadas;</li>
<li>Listas ordenadas.</li>
</ul>
<ol start="2">
<li>Texto:</li>
</ol>
<ul>
<li>uma linha de texto;</li>
<li>múltiplas linhas de texto não formatados e formatados</li>
</ul>
<ol start="3">
<li>Números:</li>
</ol>
<ul>
<li>com qualquer formato;</li>
<li>dentro de um range (limite);</li>
<li>subrange (sublimite);</li>
</ul>
<ol start="4">
<li>Data e hora.</li>
</ol>
<p>Use a tabela acima para escolher os melhores elementos de tela de acordo com sua necessidade. Você perceberá que as opções cobrem todas as necessidades atuais, alinhadas ao HTML5.</p>
<h3><a name="h.n0zdn6aco879"></a>Padrões para Elementos de Controle</h3>
<p>Os elementos de controle acima necessitam de padrões de funcionamento. Estes padrões mostram:</p>
<ol class="c13" start="1">
<li>Como combinar elementos;</li>
<li>definir relações estruturais entre elementos;</li>
<li>controlar mudanças de valores e como estes valores são alterados</li>
</ol>
<p>Alguns elementos de controle possuem requisitos de funcionamento que já estão aplicados ao elemento em si (spinners ou datepickers já possuem seu comportamento nativo no elemento graças ao HTML5). Outros necessitam de programação no back-end, seja para validação, seja para a criação de ranges, seja para outras necessidades específicas. Quanto mais versátil o elemento, maior a possibilidade de usá-los. Um bom exemplo seriam input type=”text” que com frequência possuem funcionalidades específicas, alem de aceitar <span class="c11">qualquer coisa textual.</span></p>
<ul>
<li><strong>Máscaras:</strong></li>
</ul>
<p>Máscaras permitem texto em qualquer formato ou sintaxe, fazendo com que o input do usuário seja interpretado de maneira inteligente, a medida que é digitado no campo.</p>
<p>Máscaras são usadas quando sua interface necessita de dados que usuários podem inputar usando qualquer tipo específico de conteúdo, porém não possuem a obrigação de conhecer estes formatos automaticamente:</p>
<ol class="c9" start="1">
<li>remover espaços,</li>
<li>inserir apenas números (ou texto),</li>
<li>texto sempre em caixa alta (ou caixa baixa),</li>
<li>abreviações, etc.</li>
</ol>
<p class="c4 c5">Usuários querem que a ação (submeter o formulário) aconteça, não querem (nem devem) se preocupar com formatos corretos e interfaces complexas. Jacob Nielsen já dizia que “Usabilidade na web passa pelo fato de que como desenvolvedores de interface, não podemos deixar o usuário pensar demais para fazer uma ação. Ele simplesmente tem que fazê-la de maneira cognitiva”. Máscaras podem inclusive remover a necessidade de <span class="c0">dicas no input</span> ou <span class="c0">dicas no prompt</span>.</p>
<ul>
<li><strong>Formato estruturado:</strong></li>
</ul>
<p>Estruturar um campo de input significa quebrar um campo em vários outros, de modo a facilitar o entendimento do que é esperado que o usuário faça. Um bom exemplo seria quebrar um campo <span class="c0">único</span> de CEP por exemplo em dois campos, um para os primeiros 5 números, e outro campo para os 3 restantes. Outros exemplos podem ser mencionados: <span class="c0">números de telefone</span>, <span class="c0">numeros de cartão de crédito</span> (cartões AMEX tem um numero de caracteres diferente de cartões VISA por exemplo).</p>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/image10.png"><img class="alignnone size-full wp-image-4407" src="http://tableless.com.br/wp-content/uploads/2011/10/image10.png" alt="" width="180" height="42" /></a></p>
<ul>
<li><strong>Fill-in-the-blanks:</strong> Combine um ou mais campos de modo a permitir que o usuário possa categorizar o que está inputando, facilitando a ação do usuário. Um bom exemplo seria um formulário de pesquisa em uma loja virtual:</li>
</ul>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/image07.png"><img class="alignnone size-full wp-image-4404" src="http://tableless.com.br/wp-content/uploads/2011/10/image07.png" alt="" width="534" height="169" /></a></p>
<p>Usar esta abordagem faz com que a interface seja auto-explicável. Ajuda ao usuário entender o que está acontecendo e o que foi pedido para ele.</p>
<ul>
<li><strong>Dicas no input:</strong> As dicas no input são importantes para fornecer um guideline ao usuário de como ele deve inputar valores dentro de um campo. O exemplo abaixo, retirado de um form do site dos correios para rastreamento de objetos ilustra bem isso.<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image08.png"><img class="alignnone size-full wp-image-4405" src="http://tableless.com.br/wp-content/uploads/2011/10/image08.png" alt="" width="315" height="98" /></a><br />
</span></li>
<li><strong>Placeholder no input:</strong> O placeholder é um texto adicionado <span class="c0">dentro</span> do input e que automaticamente desaparece quando o usuário posiciona o cursor da tela dentro do campo. Um bom exemplo pode ser visto no form de busca das páginas do portal globo.com.<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image01.png"><img class="alignnone size-full wp-image-4398" src="http://tableless.com.br/wp-content/uploads/2011/10/image01.png" alt="" width="464" height="93" /></a><br />
</span></li>
<li><strong>Auto complete:</strong> O nome é auto-explicativo. A medida que o usuário vai digitando caracteres, os termos são auto-completados, fazendo com que o input seja mais rápido caso o resultado esteja disponível no índice usado. Veja o form de search no site do google.com.br<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image01.png"><img class="alignnone size-full wp-image-4398" src="http://tableless.com.br/wp-content/uploads/2011/10/image01.png" alt="" width="464" height="93" /></a><br />
</span></li>
<li><strong>Dropdown chooser:</strong> Dropdowns podem ser usadas para acomodar seleções que podem utilizar um grande espaço na tela quando expandidas, porém não tem a necessidade direta de deixar todas as opções disponíveis (que usualmente são muitas). Um bom exemplo é a dropdown de seleção de cores no Google Docs.<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image09.png"><img class="alignnone size-full wp-image-4406" src="http://tableless.com.br/wp-content/uploads/2011/10/image09.png" alt="" width="214" height="291" /></a><br />
</span></li>
<li><strong>Seleção ilustrada:</strong> Em alguns casos descrever a opção não é suficiente. É necessário ilustrá-la com uma imagem para facilitar a seleção do usuário. Um bom exemplo é esta dropdown de seleção de papel de parede disponível no site do livro Designing with Progressive Enhancement.<span class="c0"><a href="http://tableless.com.br/wp-content/uploads/2011/10/image03.png"><img class="alignnone size-full wp-image-4400" src="http://tableless.com.br/wp-content/uploads/2011/10/image03.png" alt="" width="199" height="210" /></a><br />
</span></li>
<li><strong>List Builder:</strong> Quando você precisa criar uma lista de items oriundos de uma outra lista, o listbuilder é o padrão ideal a ser usado. Duas textareas e programação fazem com que valores possam ser adicionados ou removidos, além de também poderem ser ordenados facilmente. Veja este exemplo de listbuilder para a configuração de uma toolbar:</li>
</ul>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/image02.png"><img class="alignnone size-full wp-image-4399" src="http://tableless.com.br/wp-content/uploads/2011/10/image02.png" alt="" width="541" height="209" /></a></p>
<ul>
<li><strong>Mensagens de erro:</strong><br />
Quando o usuário faz algo correto ele recebe um feedback de sucesso, informando que o formulario foi submetido sem problemas. Mas também é necessário informar de maneira clara quando algo dá errado. Mensagens de erro podem ser customizadas de modo a evitar deixar o usuário “no escuro” quando algum erro acontece. Campos obrigatórios precisam de validação (agora mais simples com o atributo <span class="c0">required </span>presente no HTML5), mas podem acontecer outros erros que necessitam de feedback claro para indicar quais os próximos passos a seguir.</li>
</ul>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/image06.png"><img class="alignnone size-full wp-image-4403" src="http://tableless.com.br/wp-content/uploads/2011/10/image06.png" alt="" width="262" height="174" /></a></p>
<p>Você pode usar o poster abaixo como referência para criar suas interfaces. Clique na imagem para vê-la em uma maior resolução.</p>
<p><a href="http://tableless.com.br/wp-content/uploads/2011/10/elementos-de-controleBIG.png"><img class="alignnone size-full wp-image-4411" src="http://tableless.com.br/wp-content/uploads/2011/10/elementos-de-controleSMALL.png" alt="" width="600" height="447" /></a></p>
<p><strong>Na próxima semana, com a Parte 2, a abstração dá o lugar ao código para saber como montar os items que você selecionou para montar seus formulários, transformando os dois posts em um toolkit para o dia-a-dia. Namastê!</strong></p>
<h3><span class="c0 c17">Referências</span></h3>
<ol class="c13" start="1">
<li>Metawebdesign &#8211; Quando o Front-end se encontra com a experiência do usuário: <a href="http://www.slideshare.net/AlyssonFranklin/metawebdesign-frontend">http://www.slideshare.net/AlyssonFranklin/metawebdesign-frontend</a></li>
<li>O Metawebdesign &#8211; <a href="http://metawebdesign.org">http://metawebdesign.org</a></li>
<li>Designing Interfaces &#8211; Second Edition (Jenifer Tidwell- O&#8217;Reilly books) <a href="http://designinginterfaces.com/">http://designinginterfaces.com/</a></li>
<li>Top-down e bottom-up design:  <span class="c8"><a href="http://en.wikipedia.org/wiki/Top%E2%80%93down_and_bottom%E2%80%93up_design">http://en.wikipedia.org/wiki/Top%E2%80%93down_and_bottom%E2%80%93up_design</a></span></li>
<li>Everybody lies, uma frase do House: <span class="c8"><a href="http://www.youtube.com/watch?v=nNOExDrsdbg">http://www.youtube.com/watch?v=nNOExDrsdbg</a></span></li>
<li>W3C sobre formulários: <span class="c8"><a href="http://www.w3.org/TR/html4/interact/forms.html#h-17.1">http://www.w3.org/TR/html4/interact/forms.html#h-17.1</a></span></li>
<li><span class="c8"><a href="http://www.mhavila.com.br/topicos/web/controles.html">http://www.mhavila.com.br/topicos/web/controles.html</a></span></li>
<li>Spinner: <span class="c8"><a href="http://www.jgeppert.com/jquery-spinner/">http://www.jgeppert.com/jquery-spinner/</a></span></li>
<li>A Form of madness: <span class="c8"><a href="http://diveintohtml5.org/forms.html">http://diveintohtml5.org/forms.html</a></span></li>
<li>Responsive webdesign: <span class="c8"><a href="http://www.alistapart.com/articles/responsive-web-design/">http://www.alistapart.com/articles/responsive-web-design/</a></span></li>
<li>Composição de um time multidisciplinar de UX - <a href="http://itweb.com.br/blogs/a-composicao-de-um-time-multidisciplinar-de-ux/">http://itweb.com.br/blogs/a-composicao-de-um-time-multidisciplinar-de-ux/</a></li>
<li>UX Team of One - <a href="http://www.slideshare.net/ugleah/how-to-be-a-ux-team-of-one">http://www.slideshare.net/ugleah/how-to-be-a-ux-team-of-one</a></li>
</ol>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/o-que-e-nova-usabilidade-parte2/" title="Você sabe o que é a “nova usabilidade”? – parte II">Você sabe o que é a “nova usabilidade”? – parte II</a></li><li><a href="http://tableless.com.br/usabilidade-interfaces-dispositivos-moveis-parte2/" title="Usabilidade de interfaces para dispositivos móveis – parte II">Usabilidade de interfaces para dispositivos móveis – parte II</a></li><li><a href="http://tableless.com.br/estabelecendo-uma-metodologia-agil-para-avaliacao-de-usabilidade/" title="Estabelecendo uma metodologia ágil para avaliação de usabilidade">Estabelecendo uma metodologia ágil para avaliação de usabilidade</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/formularios-e-o-metawebdesign-parte-1/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Testando seu código jQuery com Jasmine &#8211; Parte 2</title>
		<link>http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-2/</link>
		<comments>http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-2/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 14:12:30 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[jasmine]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4189</guid>
		<description><![CDATA[Nesta segunda parte você conhece um pouco mais sobre o framework de testes Jasmine. Aprenda a criar matchers personalizados e testar AJAX e métodos em objetos.]]></description>
			<content:encoded><![CDATA[<p>Jasmine é um framework para testes focado em BDD (<em>Behavior Driven Development</em>). Na <a href="http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-1/">primeira parte</a> deste artigo aprendemos seus métodos básicos e realizamos alguns testes simples. Agora chegou a hora de ir um pouco além e conhecer técnicas mais avançadas.</p>
<p>Vale lembrar que, em nossos exemplos, utilizamos uma versão modificada da biblioteca, adaptada para jQuery: <a href="https://github.com/velesin/jasmine-jquery">jasmine-jquery</a>.</p>
<p>Utilizaremos os dados de um outro artigo, <a href="http://tableless.com.br/conteudo-sob-demanda-com-jquery/">Conteúdo sob demanda com jQuery</a>. O objetivo é testar as solicitações AJAX do carregamento da lista de tweets do Tableless.</p>
<h3>Fixtures</h3>
<p>Antes dos testes propriamente ditos vamos conhecer uma forma prática de carregar nosso conteúdo HTM. Fixtures são arquivos carregados através do método <strong>loadFixtures</strong>. Esta funcionalidade, aliás, está disponível apenas no jasmine-jquery.</p>
<p>Vamos salvar o código HTML abaixo no arquivo <strong>tweets.html</strong>, dentro do diretório de fixtures.</p>
<div class="codecolorer-container xml mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;container&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Tweets do Tableless<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ul</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;lista-tweets&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/ul<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;carrega-tweets&quot;</span> <span style="color: #000066;">data-pagina</span>=<span style="color: #ff0000;">&quot;1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Mais!<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>Por padrão, o jasmine-jquery procura as fixtures no diretório <strong>spec/javascripts/fixtures</strong>. Como na primeira parte do artigo indicamos uma estrutura diferente, utilizando o diretório <strong>spec/fixtures</strong>, precisamos atualizar a propriedade fixturesPath nas configurações do Jasmine.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">jasmine.<span style="color: #660066;">getFixtures</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fixturesPath</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'spec/fixtures/'</span><span style="color: #339933;">;</span> <br />
<br />
describe<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Exibição dos últimos tweets do Tableless'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; beforeEach<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; loadFixtures<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tweets.html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Deve carregar na primeira página'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; expect<span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#carrega-tweets'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'pagina'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toEqual</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Outra forma de utilizarmos fixtures é carregando diretamente no código, sem a necessidade de um arquivo HTML. Esse caso é mais indicado para templates mais simples, com poucos elementos.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">setFixtures<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;ul id=&quot;lista-tweets&quot; /&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h3>Testando código assíncrono</h3>
<p>Testar código AJAX pode ser um pouco mais complicado. No nosso exemplo, como acessamos uma URL externa à nossa aplicação, o tempo de resposta vai depender de vários fatores, como velocidade da conexão, estabilidade do Twitter etc.</p>
<p>Os métodos <strong>runs</strong> e <strong>waits</strong> são úteis para tentar simular esse tempo de carregamento. O <strong>runs</strong> executa os testes e funções um escopo próprio e, além disso, são executados em sequência (quando um termina, o outro começa). Já o método <strong>waits</strong> funciona como uma espécie de pausa/sleep e recebe como parâmetro o tempo em milissegundos.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Deve carregar os últimos 20 tweets'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; runs<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; Tableless.<span style="color: #660066;">retorna_tweets</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; waits<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; runs<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; expect<span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lista-tweets li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toEqual</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h3>Espionando métodos</h3>
<p>Às vezes precisamos testar se um método de um objeto é chamado (e com que parâmetros) &mdash; e não testar apenas seu resultado. O Jasmine oferece a função <strong>spyOn</strong> para capturar e validar essas chamadas. O <strong>spyOn</strong> recebe dois parâmetros: o objeto e o nome do método.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Deve executar função para retornar tweets'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; spyOn<span style="color: #009900;">&#40;</span>Tableless<span style="color: #339933;">,</span> <span style="color: #3366CC;">'retorna_tweets'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; Tableless.<span style="color: #660066;">retorna_tweets</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; expect<span style="color: #009900;">&#40;</span>Tableless.<span style="color: #660066;">retorna_tweets</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toHaveBeenCalledWith</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Acima testamos se o método foi chamado com o parâmetro 1 (página). Poderíamos ter utilizado também <strong>toHaveBeenCalled</strong>, testando apenas a chamada. As funções de spy podem ainda ser combinadas com o not, por exemplo:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">expect<span style="color: #009900;">&#40;</span>Tableless.<span style="color: #660066;">retorna_tweets</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">not</span>.<span style="color: #660066;">toHaveBeenCalled</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h3>Matchers personalizados</h3>
<p>Outra funcionalidade poderosa do Jasmine é a possibilidade de criação de matchers personalizados. Os matchers são asserts para seus tests. No exemplo abaixo, criamos o matcher <strong>toBeATweet</strong> para validar se um elemento possui a classe &#8220;tweet&#8221;.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">beforeEach<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">addMatchers</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; toBeATweet<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">actual</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tweet'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">expect<span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lista-tweets li:first'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toBeATweet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>O método addMatchers deve ser executado dentro do beforeEach, utilizando o Jasmine como contexto. Notem que ele recebe um objeto que pode conter um ou mais matchers personalizados. No código, <strong>this.actual</strong> representa a variável, elemento, ou objeto que estará sendo passado ao <strong>expect</strong>.</p>
<h3>Outros projetos utilizando Jasmine</h3>
<p>Nesses dois artigos vocês conheceram o jasmine-jquery, mas existem diversos outros projetos baseados no framework Jasmine, incluindo adaptações para NodeJS, Rails e iPhone e snippets para Vim e TextMate. A lista completa você confere no <a href="https://github.com/pivotal/jasmine/wiki/Related-projects">wiki do projeto no Github</a>.</p>
<h3>Referências</h3>
<ul>
<li><a href="https://github.com/tableless/exemplos/tree/gh-pages/jasmine-parte-2">Código fonte dos exemplos deste artigo</a></li>
<li><a href="http://tableless.github.com/exemplos/jasmine-parte-2/tests/SpecRunner.html">SpecRunner dos exemplos rodando no browser</a></li>
<li><a href="http://f.souza.cc/2011/05/testing-jquery-plugins-with-jasmine/">Testing jQuery plugins with Jasmine</a></li>
<li><a href="http://testdrivenwebsites.com/2010/07/29/html-fixtures-in-jasmine-using-jasmine-jquery/">HTML fixtures in Jasmine (using jasmine-jquery)</a></li>
</ul>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-1/" title="Testando seu código jQuery com Jasmine &#8211; Parte 1">Testando seu código jQuery com Jasmine &#8211; Parte 1</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Testando seu código jQuery com Jasmine &#8211; Parte 1</title>
		<link>http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-1/</link>
		<comments>http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-1/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 14:08:39 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[jasmine]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4187</guid>
		<description><![CDATA[Com a evolução do desenvolvimento em JavaScript, testes automatizados começam a ganhar cada vez mais força. Neste artigo você conhece um pouco mais sobre a biblioteca Jasmine, focada em BDD &#8212;  Behavior Driven Development.]]></description>
			<content:encoded><![CDATA[<p>Durante muito tempo testar/debugar JavaScript era uma tarefa árdua (infelizmente, em alguns navegadores, ainda é). Quem aí se lembra do tempo em que não existia Firebug, por exemplo? E o tamanho dos scripts? Um simples menu drop-drown possuía umas 1.500 linhas de código. Não existia jQuery ou qualquer outro tipo de framework. Tempos difíceis.</p>
<p>Hoje a tarefa do desenvolvedor é muito mais fácil. Para debug temos o já citado Firebug e o Developer Tools do Chrome, entre outros. Nos testes, além do <a href="http://pivotal.github.com/jasmine/" target="_blank">Jasmine</a>, outro framework bem legal é o <a href="http://docs.jquery.com/Qunit">QUnit</a>. O Jasmine, por focar em BDD, possui uma sintaxe mais fluida. Quem programa em Ruby/Rails vai notar a enorme semelhança com a ferramenta RSpec.</p>
<p>Nos exemplos vou utilizar uma versão modificada do Jasmine, jasmine-jquery. Ela possui alguns métodos próprios para o framework além de funções para carregar fixtures (templates).</p>
<h3>Baby steps</h3>
<p>Começar a trabalhar com uma cultura de testar sempre antes de desenvolver é bem difícil, principalmente para quem já está acostumado a programar antes e testar depois (manualmente). Comece devagar, sem medo. No início as coisas serão um pouco confusas, mas depois de adotar essa prática, você vai se perguntar como era possível programar sem testes.</p>
<p>O que testar e que testes escrever? Isso também vem com o tempo. Comece testando uma ou outra funcionalidade principal de um aplicativo já existente. Entenda como funciona a sua ferramenta de testes. Depois de um tempo comece a acreditar e confiar na sua intuição.</p>
<p>Procure sempre utilizar um conjunto variado de possibilidades, desde as mais óbvias até as mais inusitadas. Pense nos diferentes contextos, em tudo que interage com seu aplicativo: navegadores, sistemas operacionais, usuários, dados de entrada, scripts de terceiros etc.</p>
<p>Testes não evitam que seu software, uma vez finalizado, tenha bugs; não são a solução para todos os seus problemas de <em>deploy</em>, mas facilitam bastante essas etapas.</p>
<h3>Red &rarr; Green &rarr; Refactor</h3>
<p>O padrão básico a ser seguido é o seguinte:</p>
<ol>
<li>Escreva o teste &mdash; naturalmente, ele vai falhar;</li>
<li>Escreva, sem se preocupar muito com qualidade, o código mais simples, que faça o teste passar;</li>
<li>Reescreva seu código, implementando melhorias de performance, escalabilidade e removendo duplicidades.</li>
</ol>
<h3>Configurando o jasmine-jquery</h3>
<p>Baixe a última versão do <a href="https://github.com/velesin/jasmine-jquery" target="_blank">jasmine-jquery</a> e vamos começar com nossos primeiros testes. A estrutura de pastas do nosso aplicativo deve ficar da seguinte maneira:</p>
<div class="codecolorer-container xml mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">- /<br />
&nbsp; - /tests<br />
&nbsp; &nbsp; - /lib<br />
&nbsp; &nbsp; - /spec<br />
&nbsp; &nbsp; &nbsp; - /fixtures<br />
&nbsp; &nbsp; &nbsp; - /suites<br />
&nbsp; &nbsp; &nbsp; &nbsp; - saudacao-spec.js<br />
&nbsp; &nbsp; - /vendor<br />
&nbsp; &nbsp; - SpecRunner.html<br />
&nbsp; - tableless.js</div></td></tr></tbody></table></div>
<p>Note que criamos um diretório &#8220;tests&#8221; onde ficarão todos os arquivos dos nossos testes, incluindo a biblioteca Jasmine. O arquivo SpecRunner.html é o responsável por executar e exibir os resultados dos testes, basta abri-lo no navegador. Dentro do diretório “tests/spec” ficarão nossos conjuntos de testes (suites) e nossos templates HTML (fixtures).</p>
<p>No início do SpecRunner ficam as chamadas para os testes:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;spec/suites/saudacao-spec.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></div></td></tr></tbody></table></div>
<p>Você também pode incluir aqui qualquer javascript personalizado necessário para os testes. No nosso caso vamos incluir o arquivo tableless.js, que fica na raiz do nosso aplicativo.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;../tableless.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></div></td></tr></tbody></table></div>
<h3>Nosso primeiro teste</h3>
<p>Vamos supor o seguinte: uma página deve exibir uma mensagem de boas-vindas para o usuário que varia de acordo com o horário. De 5 da manhã ao meio-dia, exibe &#8220;Bom dia!&#8221;; de meio-dia até 6 da tarde, exibe &#8220;Boa tarde!&#8221;; de 6 à meia-noite, exibe &#8220;Boa noite!&#8221;; e, por fim, de meia-noite até 6 da manhã exibe &#8220;Dormir é para os fracos!&#8221;. A mensagem fica sempre dentro de um elemento div com id &#8220;mensagem&#8221;. Os horários vão desde a hora inicial (incluída) até a hora final. A função pode receber como parâmetro uma hora no formato hh:mm ou, caso não receba nada, exibe a mensagem de acordo com a hora do usuário.</p>
<p>Esse é um bom começo para seus testes, tente escrever, em um parágrafo, o que deve ser executado e o que é esperado. Trabalhe sempre com um pedaço de papel por perto, para rascunhos.</p>
<p>Vejamos como ficaria o desenho inicial dos nossos testes. Crie o arquivo /tests/spec/suites/saudacao-spec.js e digite o seguinte código:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">describe<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Exibição da mensagem de boas-vindas'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; beforeEach<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; setFixtures<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;div id=&quot;mensagem&quot; /&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">mensagem</span> <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#mensagem'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; afterEach<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">horas</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Deve exibir 'Bom-dia!' entre 5:00 e 11:59&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Deve exibir 'Boa-tarde!' entre 12:00 e 17:59&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Deve exibir 'Boa-noite!' entre 18:00 e 23:59&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Deve exibir 'Dormir é para os fracos!' de 00:00 a 04:59&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Deve exibir, por padrão, a mensagem de acordo com a hora do cliente&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Na raiz do aplicativo, crie um arquivo chamado &#8220;tableless.js&#8221;. Nele nós escreveremos nossa função para exibir a mensagem de acordo com a hora. Sua estrutura inicial é a seguinte:</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> saudacao<span style="color: #009900;">&#40;</span>hora_atual<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> hora<span style="color: #339933;">;</span> &nbsp; &nbsp;<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Os conceitos básicos dos nossos testes giram em torno de três funções: <strong>describe</strong>, <strong>it</strong> e <strong>expect</strong>. Outras funções úteis, mas que nem sempre estarão presentes, são as funções <strong>beforeEach</strong> e <strong>afterEach</strong>. Também trabalhamos com uma função do jasmine-jquery, a <strong>setFixtures</strong> &mdash; falarei mais sobre ela na parte 2, por enquanto você só precisa saber que ela define templates/elementos no DOM.</p>
<ul>
<li><strong>describe</strong> &mdash; representa um conjunto de testes/comportamentos. Podem existir situações dentro de situações, por exemplo:
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">describe<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Login'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; describe<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Sucesso'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; describe<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Falha'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
</li>
<li><strong>it</strong> &mdash; define um teste, uma ação. Por exemplo, &#8220;It should validate the username&#8221;, ou, &#8220;Deve validar o nome do usuário&#8221;, seria uma boa situação para nosso teste de login.</li>
<li><strong>expect</strong> &mdash; espera que alguma variável ou retorno de função seja igual a alguma coisa, ou verdadeiro, ou falso etc. Nos testes acima utilizamos apenas um tipo de validação, o matcher &#8220;toEqual&#8221;. Todo o teste deve ser chamado com a função expect, utilizando um dos matchers disponíveis (mais sobre eles na parte 2). Os principais são: toEqual, toContains, toBeTruthy e toBeFalsy.</li>
<li><strong>beforeEach</strong> &mdash; executada antes de cada teste dentro de um conjunto, muito útil para configurar elementos.</li>
<li><strong>afterEach</strong> &mdash; executada depois de cada teste dentro de um conjunto, ideal para reiniciar variáveis.</li>
</ul>
<h3>Escrevendo os testes</h3>
<p>Agora chegou a hora de preencher os nossos testes. Os testes que verificam a mensagem entre uma hora e outra seguirão um mesmo padrão. Dado um conjunto de horas válidas, a função saudacao deve retornar a mensagem correta.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Deve exibir 'Bom-dia!' entre 5:00 e 11:59&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">horas</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'05:00'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'09:33'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'10:22'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'11:59'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #000066; font-weight: bold;">in</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">horas</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; saudacao<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">horas</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; expect<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">mensagem</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toEqual</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Bom-dia!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>O teste que valida o retorno da função saudacao sem passagem de parâmetro busca a hora do cliente e exibe a mensagem de acordo com ela.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Deve exibir, por padrão, a mensagem de acordo com a hora do cliente&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #339933;">;</span><br />
&nbsp; data.<span style="color: #660066;">setTime</span><span style="color: #009900;">&#40;</span>data.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> hora <span style="color: #339933;">=</span> data.<span style="color: #660066;">getHours</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; saudacao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> texto <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">mensagem</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hora <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span> <br />
&nbsp; &nbsp; expect<span style="color: #009900;">&#40;</span>texto<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toEqual</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Dormir é para os fracos!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hora <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">12</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; expect<span style="color: #009900;">&#40;</span>texto<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toEqual</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Bom-dia!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hora <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">18</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; expect<span style="color: #009900;">&#40;</span>texto<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toEqual</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Boa-tarde!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">else</span><br />
&nbsp; &nbsp; expect<span style="color: #009900;">&#40;</span>texto<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toEqual</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Boa-noite!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Nesse momento, abrindo o SpecRunner no navegador, todos os nossos testes estarão falhando. Lembra da nossa regra? Red (falhou), Green (passou) e Refactor.</p>
<h3>A função saudacao()</h3>
<p>Abaixo segue a minha implementação da função saudacao(). Não me preocupei muito com repetições e performance. Meu objetivo principal era fazer o teste passar.</p>
<div class="codecolorer-container javascript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> saudacao<span style="color: #009900;">&#40;</span>hora_atual<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> hora<span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> hora_atual <span style="color: #339933;">==</span> <span style="color: #3366CC;">'undefined'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; data.<span style="color: #660066;">setTime</span><span style="color: #009900;">&#40;</span>data.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; hora <span style="color: #339933;">=</span> data.<span style="color: #660066;">getHours</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; hora <span style="color: #339933;">=</span> hora_atual.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">':'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; hora <span style="color: #339933;">=</span> parseInt<span style="color: #009900;">&#40;</span>hora<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^0/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hora <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#mensagem'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Dormir é para os fracos!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hora <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">12</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#mensagem'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Bom-dia!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hora <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">18</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#mensagem'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Boa-tarde!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">else</span><br />
&nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#mensagem'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Boa-noite!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Atualizando nossa SpecRunner veremos agora que todos os testes estão passando. Você pode (e deve) desenvolver aos poucos. Valide um teste de cada vez. Desenvolva com calma.</p>
<h3>Melhorando nosso código</h3>
<p>Como de praxe, vou deixar um dever de casa para vocês: a etapa de refactoring. O que podemos melhorar na nossa função saudacao()? E se o usuário passar uma hora atualmente inválida para nossa função, como &#8220;meio-dia&#8221;, &#8220;nove horas&#8221; etc. E se quisermos mudar o id do elemento #mensagem? E se quisermos exibir a saudação em mais de um elemento? Podemos melhorar algum nome de variável? Podemos reduzir o tamanho da nossa função? Nossa função está cumprindo seu objetivo? Tem algum código/texto repetido? E nossos testes? Estão cobrindo tudo? Prevendo todos os cenários?</p>
<p>O que não falta é opção para um bom refactoring.</p>
<p>Na segunda parte veremos a função spy, além de mais sobre fixtures, matchers personalizados e outros recursos avançados.</p>
<h3>Referências</h3>
<ul>
<li><a href="https://github.com/tableless/exemplos/tree/gh-pages/jasmine-parte-1">Código fonte dos exemplos deste artigo</a></li>
<li><a href="http://tableless.github.com/exemplos/jasmine-parte-1/tests/SpecRunner.html">SpecRunner do exemplo rodando no github</a></li>
<li><a href="http://pivotal.github.com/jasmine/" target="_blank">Jasmine BDD</a></li>
<li><a href="https://github.com/velesin/jasmine-jquery" target="_blank">jasmine-jquery</a></li>
<li><a href="http://pt.wikipedia.org/wiki/Behavior_Driven_Development" target="_blank">BDD segundo a Wikipedia</a></li>
</ul>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-2/" title="Testando seu código jQuery com Jasmine &#8211; Parte 2">Testando seu código jQuery com Jasmine &#8211; Parte 2</a></li><li><a href="http://tableless.com.br/javascript-com-cafe/" title="JavaScript com café">JavaScript com café</a></li><li><a href="http://tableless.com.br/jquery-conheca-os-metodos-on-e-off/" title="jQuery: conheça os métodos on() e off()">jQuery: conheça os métodos on() e off()</a></li><li><a href="http://tableless.com.br/manipulacao-de-classes-com-jquery/" title="Manipulação de classes com JQuery">Manipulação de classes com JQuery</a></li><li><a href="http://tableless.com.br/jquery-metodos-desconhecidos/" title="jQuery: métodos desconhecidos">jQuery: métodos desconhecidos</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/testando-seu-codigo-jquery-com-jasmine-parte-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

