<?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; AJAX</title>
	<atom:link href="http://tableless.com.br/categoria/client-side/ajax/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>Lendo um arquivo de texto com AJAX</title>
		<link>http://tableless.com.br/lendo-um-arquivo-de-texto-com-ajax/</link>
		<comments>http://tableless.com.br/lendo-um-arquivo-de-texto-com-ajax/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 14:05:44 +0000</pubDate>
		<dc:creator>Moacyr Minéro</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Na Prática]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=4131</guid>
		<description><![CDATA[Inicio mostrando como realizar uma requisição de arquivos de texto com AJAX. Em tempos de Web 2.0, não podemos pensar mais em sites que usem requisições síncronas para rotinas de interação com o usuário. Uma das técnicas mais utilizadas para &#8230;]]></description>
			<content:encoded><![CDATA[<p>Inicio mostrando como realizar uma requisição de arquivos de texto com AJAX.<br />
Em tempos de Web 2.0, não podemos pensar mais em sites que usem requisições síncronas para rotinas de interação com o usuário.<br />
Uma das técnicas mais utilizadas para esse fim é o AJAX &#8211; Assynchronous Javascript and XML.<br />
De uma forma resumida e sem muito &#8220;tecniquês&#8221;, AJAX é a captura de informações sem a necessidade de recarregamento da estrutura do documento HTML a cada requisição ao servidor web.</p>
<p>E para poder fazer conexão assíncrona com o servidor web temos que criar um objeto com as propriedades e métodos AJAX .<br />
Porém, como a web não é um ambiente perfeito, temos que criar um objeto AJAX para os browsers Firefox, Chrome, Opera, Safari, chamado de XMLHttpRequest. E para o IE um objeto ActiveX que faça referencia ao objeto XMLHTTP.</p>
<p>Como padrão de desenvolvimento, vamos criar um arquivo que faça essa identificação e criação chamado de xhr.js.<br />
Para a criação desse arquivo, abra o editor de código de sua preferência e digite o seguinte código:</p>
<p><strong>Arquivo xhr.js</strong>&#8230;</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 />26<br />27<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: #006600; font-style: italic;">//Declarando variaveis globais</span><br />
<span style="color: #003366; font-weight: bold;">var</span> xhr<span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> txt <span style="color: #339933;">;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> ajax<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #006600; font-style: italic;">//Verificando se os browsers aceitam o objeto XMLHttpRequest</span><br />
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">XMLHttpRequest</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
xhr  <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> XMLHttpRequest<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: #006600; font-style: italic;">//Verificando se o browser IE versão &amp;gt; 6</span><br />
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">ActiveXObject</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #000066; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span><br />
xhr <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> ActiveXObject<span style="color: #009900;">&#40;</span>Msxml2.<span style="color: #660066;">XMLHTTP</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #000066; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span><br />
xhr <span style="color: #339933;">=</span>  <span style="color: #003366; font-weight: bold;">new</span> ActiveXObject<span style="color: #009900;">&#40;</span>Microsoft.<span style="color: #660066;">XMLHTTP</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>er<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
txt <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Seu browser não aceita AJAX!&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>txt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000066; font-weight: bold;">return</span> xhr<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
...</div></td></tr></tbody></table></div>
<p>Em seguida, vamos criar o arquivo HTML e fazer referência ao objeto AJAX criado pelo arquivo <strong>xhr.js</strong>.<br />
Para isso use a  tag script no head da página html. Exemplo: <strong>&lt;script type=&#8221;text/javascript&#8221; src=&#8221;caminho/xhr.js&#8221;&gt;&lt;/script&gt;</strong></p>
<p><strong>Arquivo ajax_txt.html</strong></p>
<p><em>Código javascript<br />
&#8230;<br />
</em></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 />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<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: #006600; font-style: italic;">//Declarando variáveis globais</span><br />
<span style="color: #003366; font-weight: bold;">var</span> xhr<span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> valor<span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//Função para pegar os arquivos de texto</span><br />
<span style="color: #003366; font-weight: bold;">function</span> pegaTextos<span style="color: #009900;">&#123;</span><br />
<span style="color: #006600; font-style: italic;">//Instancia o objeto ajax e guarda na var xhr</span><br />
xhr <span style="color: #339933;">=</span> ajax<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Captura o elemento select  via DOM</span><br />
<span style="color: #003366; font-weight: bold;">var</span> txt <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;textos&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Pega o valor da opção escolhida na lista do campo select</span><br />
valor <span style="color: #339933;">=</span> txt.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>txt.<span style="color: #660066;">selectedIndex</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Monta a url da chamada AJAX</span><br />
<span style="color: #003366; font-weight: bold;">var</span> url <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;texto&quot;</span><span style="color: #339933;">+</span>valor<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;.txt&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Abre a conexão com o servidor web via AJAX</span><br />
xhr.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;GET&quot;</span><span style="color: #339933;">,</span>url<span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Confirma o envio dos dados</span><br />
xhr.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Verifica a mudança de estado do servidor web e dispara a função para mostrar os textos</span><br />
xhr.<span style="color: #660066;">onreadystatechange</span> <span style="color: #339933;">=</span> mostraTextos<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #339933;">&lt;</span>em<span style="color: #339933;">&gt;</span><br />
<span style="color: #339933;">&lt;/</span>em<span style="color: #339933;">&gt;</span> <span style="color: #006600; font-style: italic;">//Função para mostras os textos</span><br />
<span style="color: #003366; font-weight: bold;">function</span> mostraTextos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #006600; font-style: italic;">//Verifica o status do retorno do servidor web</span><br />
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>xhr.<span style="color: #660066;">readyState</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">4</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> xhr.<span style="color: #000066;">status</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #006600; font-style: italic;">//Pega a resposta do servidor web</span><br />
<span style="color: #003366; font-weight: bold;">var</span> resposta <span style="color: #339933;">=</span> xhr.<span style="color: #660066;">responseText</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Captura a div Box para mostrar os textos</span><br />
<span style="color: #003366; font-weight: bold;">var</span> box  <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;box&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Escreve os textos na div Box</span><br />
box.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> resposta<span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//Aplica um estilo de borda na div Box</span><br />
box.<span style="color: #660066;">style</span>.<span style="color: #660066;">border</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;1px dotted #333&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Aplicando um estilo CSS na div Box</p>
<div class="codecolorer-container css 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="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #cc00cc;">#box</span><span style="color: #00AA00;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">450px</span><span style="color: #00AA00;">;</span><br />
<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">auto</span><span style="color: #00AA00;">;</span><br />
<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span><br />
<span style="color: #000000; font-weight: bold;">margin-top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">25px</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>Montamos agora o HTML com o combo dos textos.</p>
<p>&#8230;</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 />6<br />7<br />8<br />9<br />10<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/body.html"><span style="color: #000000; font-weight: bold;">body</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>&gt;</span>Selecionando textos com AJAX<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;&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a><span style="color: #66cc66;">/</span>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/select.html"><span style="color: #000000; font-weight: bold;">select</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;textos&quot;</span> <span style="color: #000066;">onchange</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;pegaTextos()&quot;</span>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">selected</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;selected&quot;</span>&gt;</span>selecione<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span>&gt;</span>Texto 1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;2&quot;</span>&gt;</span>Texto 2<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;3&quot;</span>&gt;</span>Texto 3<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/select.html"><span style="color: #000000; font-weight: bold;">select</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;box&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/body.html"><span style="color: #000000; font-weight: bold;">body</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>&#8230;</p>
<p>Para que a chamada AJAX funcione, temos que criar os arquivos de textos com os respectivos nomes: texto1.txt,texto2.txt e texto3.txt.<br />
Em seguida salve os arquivos na mesma pasta onde se encontram os <strong>arquivos xhr.js</strong> e <strong>ajax_txt.html</strong>.</p>
<p>Agora é so testar!</p>
<p>Lembrando que para uma requisição AJAX funcionar, ela tem que passar por um servidor. No nosso caso o <strong>localhost</strong>.</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/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/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/introducao-ao-css-3d-flip-card/" title="Introdução ao CSS 3D &#8211; Flip Card">Introdução ao CSS 3D &#8211; Flip Card</a></li><li><a href="http://tableless.com.br/commander-conquer-tiberium-alliances/" title="Command &#038; Conquer: Tiberium Alliances">Command &#038; Conquer: Tiberium Alliances</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/lendo-um-arquivo-de-texto-com-ajax/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Entendendo os Reflows</title>
		<link>http://tableless.com.br/entendendo-os-reflows-2/</link>
		<comments>http://tableless.com.br/entendendo-os-reflows-2/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 13:00:02 +0000</pubDate>
		<dc:creator>Alysson Franklin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Tecnologia e Tendências]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[navegadores]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[reflow]]></category>
		<category><![CDATA[render tree]]></category>
		<category><![CDATA[repaint]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=3940</guid>
		<description><![CDATA[O que são e como os Reflows podem ser otimizados para aplicações ficarem ainda mais rápidas.]]></description>
			<content:encoded><![CDATA[<p>Reflow é um assunto extenso e necessário. Ele sempre vai existir nos navegadores, então temos que entendê-lo para saber como utilizá-lo de maneira racional. O mais legal é entender todo o contexto sobre o que são e como funcionam, para a partir daí repensar o código que renderizamos no navegador para obtermos maior performance.</p>
<p><strong>Reflow é o resultado de um evento que desencadeia mudanças no jeito que a pagina deve ser renderizada, tomando tempo para cálculo e reposicionamento de elementos.</strong></p>
<p>Para explicar como isso acontece, o importante é entender como um navegador renderiza uma página web.</p>
<h2>DOM</h2>
<p>Document Object Model (DOM) é uma interface independente de linguagem e plataforma para representar e interagir com objetos em HTML, XHTML e XML. Mas o DOM é mais que isso; toda linguagem estruturada tem uma arvore DOM.</p>
<div id="attachment_3941" class="wp-caption alignleft" style="width: 490px"><a href="http://tableless.com.br/wp-content/uploads/2011/07/DOMTree.gif"><img class="size-full wp-image-3941 " src="http://tableless.com.br/wp-content/uploads/2011/07/DOMTree.gif" alt="Exemplo de arvore DOM para documento HTML" width="480" height="212" /></a><p class="wp-caption-text">Exemplo de arvore DOM para documento HTML</p></div>
<p>Mas sobre o DOM podemos dizer que programas ou scripts podem dinamicamente acessar elementos na árvore DOM e alterar seu conteúdo, estrutura e estilo. Adicional ao estado inicial da pagina, estas alterações são agregadas a árvore DOM. O resultado é a renderização - o que nós vemos em um navegador. Mas a nossa <em>Render Tree </em>tem mais que isso:</p>
<h2>Render Tree e como realmente entender display X visibility</h2>
<div id="attachment_3942" class="wp-caption alignnone" style="width: 514px"><a href="http://tableless.com.br/wp-content/uploads/2011/07/render.png"><img class="size-full wp-image-3942 " src="http://tableless.com.br/wp-content/uploads/2011/07/render.png" alt="Como a render tree e montada" width="504" height="234" /></a><p class="wp-caption-text">Como a render tree é montada</p></div>
<p>O DOM é resultado do parse do markup HTML que você montou dentro de um navegador. Só que dentro de um HTML você não tem apenas a estrutura do documento, estilos em CSS e funcionalidades em javascript também estarão no seu markup. E a Render tree é a soma de DOM mais estilos, que depois podem ser manipulados (seus scripts).</p>
<p>Pode parecer estranho, mas para mim a melhor maneira de entender as diferencas entre DOM e Render Tree é encarar esta última como um <span class="c17">individuo narcisista</span>. Isso mesmo: A Render Tree gosta de aparecer, é o que vemos no browser. O DOM acontece por trás das cortinas. <em>À Render tree, o palco</em>. (<a href="http://tableless.com.br/tenha-o-dom" title="Tenha o DOM">Para saber mais sobre o DOM, veja este outro artigo</a>)</p>
<p>Uma página que tem controles de show/hide mostra isso muito bem. Enquanto todo o conteúdo da página está presente na árvore DOM, apenas alguns itens estarão disponíveis na Render Tree &#8211; os visíveis na página (display:block). Alterar os elementos display:none vão disparar mudanças na render tree, e não na árvore DOM.</p>
<p>Já tentou entender as diferenças entre display:none e visibility:hidden? A maioria das explicações que vemos é que um “deixa de mostrar o elemento totalmente, incluindo seu espaço em tela” e o outro “deixa de mostrar o elemento visual, mas sua área de exibição continua sendo utilizada”. Esta explicação não está incorreta, mas seria melhor dizer que a propriedade display altera a estrutura da render tree, adicionando algo que antes não estava ali, enquanto visibility não faz alterações, apenas o câmbio de mostrar ou não um elemento que já esta na render tree.</p>
<h2>Repaint</h2>
<p>Entendido as diferenças entre display e visibility, além do contexto de área do elemento, conseguimos explicar o Repaint. Uma ação que faça alteração de propriedades de background <strong>sem alterar dimensões ou outras propriedades do elemento</strong> não causam o reflow, apenas o repaint, que seria a atualização da propriedade de cor ou da imagem &#8211; literalmente pintar novamente o elemento. Repaints gastam menos CPU que reflows.</p>
<h2>Como um navegador monta seu documento HTML</h2>
<p>Esses vídeos são sensacionais. Eles explicam o que são os reflows e dai como minimizá-los durante a fase de desenvolvimento do documento (sempre usando <span class="c9"><a class="c7" href="http://tableless.com.br/bem-vindo-a-xangrila-parte-1">Progressive Enhancement</a></span> quando possível) é mais fácil..</p>
<span style="text-align:center; display: block;"><a href="http://tableless.com.br/entendendo-os-reflows-2/"><img src="http://img.youtube.com/vi/ZTnIxIA5KGw/2.jpg" alt="" /></a></span>
<p class="c6 anotacao">Esta é uma representação de como a página da Mozilla é montada. Quer mais? Veja também como a <span class="c9"><a class="c7" href="http://video.google.com/videoplay?docid=-5863446593724321515">Wikipedia</a></span> e a página do <span class="c9"><a class="c7" href="http://video.google.com/videoplay?docid=-1471976166301235697">Google</a></span> no Japão são renderizadas.</p>
<p>Analisando o primeiro vídeo, perceba que ao finalizar a montagem do rodapé, “algo mais” acontece (a partir de 12seg). São os Reflows. A maioria dos elementos são recalculados e reposicionados. Se ponderarmos que o rodapé acaba de ser montado aos 14 segundos e a renderização termina aos 26 segundos da pagina, estamos falando quase de 50% do tempo de renderização sendo gasto com Reflows, o que é muito, dependendo do que a sua página deve fazer.</p>
<h3>O que causam exatamente os reflows?</h3>
<h5>
<div class="codecolorer-container text 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="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var bstyle = document.body.style; // cache<br />
bstyle.padding = &quot;20px&quot;; // reflow, repaint<br />
bstyle.border = &quot;10px solid red&quot;; // outro reflow e repaint<br />
bstyle.color = &quot;blue&quot;; // repaint<br />
bstyle.backgroundColor = &quot;#fad&quot;; // repaint<br />
bstyle.fontSize = &quot;2em&quot;; // reflow, repaint<br />
// novo elemento DOM - reflow, repaint<br />
document.body.appendChild(document.createTextNode('Leeento'));</div></td></tr></tbody></table></div>
</h5>
<p>Reflows são excessivamente pesados e para reduzir efeitos uma das táticas que navegadores usam é processar nossos scripts em lote. Uma fila é criada para todos os comandos que causam reflow sejam processados de uma única vez. Porém o foco é entender o que causa um reflow e tentar minimizar o seu uso para ganhar performance na aplicação.</p>
<p>Este assunto é novo, e com certeza, A lista que mostro abaixo deve crescer. É importante mantermos a atenção a este assunto porque pequenos cuidados podem significar muito. Em um site web visualizado em desktops a diferença é óbvia sobre o tempo de renderização. Mas isso implica em outras coisas, que podem fazer a diferença não apenas em montar uma página mais rápido, mas também para menor gasto de processamento, o que garante também mais tempo de bateria em mobiles e tablets por exemplo.</p>
<ol start="1">
<li>Adicionar, remover ou atualizar o DOM;</li>
<li>Esconder nós do DOM usando display:none;</li>
<li>Mover e animar o DOM na página;</li>
<li>Adicionar folhas de estilo on-the-fly que mudem o comportamento dos elementos;</li>
<li>Redimensionar janelas;</li>
<li>Alterar tamanho de fontes;</li>
<li class="c6 c15">Scroll de página;</li>
</ol>
<p>Em um dos posts sobre o assunto, Tony G mapeou pesquisas prévias e montou a seguinte tabela, que também está sendo constantemente atualizada.</p>
<table class="c16" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<h4><strong>Element</strong></h4>
</td>
<td>
<h4><strong>Frame, Image</strong></h4>
</td>
<td>
<h4><strong>Range</strong></h4>
</td>
<td>
<h4><strong>SVGLocatable</strong></h4>
</td>
<td>
<h4><strong>SVGTextContent</strong></h4>
</td>
<td>
<h4><strong>SVGUse</strong></h4>
</td>
<td>
<h4><strong>window</strong></h4>
</td>
</tr>
<tr>
<td><span class="c0">clientHeight,<br />
</span><span class="c0">clientLeft,<br />
</span><span class="c0">clientTop,<br />
</span><span class="c0">clientWidth,<br />
focus(), getBoundingClientRect(), getClientRects(), innerText,<br />
offsetHeight,<br />
offsetLeft,<br />
offsetParent,<br />
offsetTop,<br />
offsetWidth,<br />
outerText,<br />
scrollByLines(), scrollByPages(), scrollHeight, scrollIntoView(), scrollIntoViewIfNeeded(), scrollLeft,<br />
scrollTop,<br />
</span>scrollWidth</td>
<td><span class="c0">height, width</span></td>
<td><span class="c0">getBoundingClientRect(), getClientRects()</span></td>
<td><span class="c0">computeCTM(), getBBox()</span></p>
<p class="c5">
</td>
<td><span class="c0">getCharNumAtPosition(), getComputedTextLength(), getEndPositionOfChar(), getExtentOfChar(), getNumberOfChars(), getRotationOfChar(), getStartPositionOfChar(), getSubStringLength(), selectSubString()</span></td>
<td><span class="c0">instanceRoot</span></td>
<td><span class="c0">getComputedStyle(),<br />
scrollBy(),<br />
scrollTo(),<br />
scrollX,<br />
scrollY, webkitConvertPointFromNodeToPage(), webkitConvertPointFromPageToNode()</span></td>
</tr>
</tbody>
</table>
<h2>Como melhorar o meu código para minimizar os reflows?</h2>
<p>É simples. Basta minimizar o uso de requisições de estilo, que façam o navegador executar reflows ou repaints.</p>
<ol start="1">
<li><span class="c11">Planejar a sua aplicação e entender como plugins e scripts criados vão se comportar em relação a reflow e repaints. Arquitetar o uso de plugins de acordo com a personalização que deve ser feita. Minimize o uso de alteração de estilos on-the-fly.</span></li>
<li><span class="c11">Quando precisar alterar a propriedade de um estilo, troque o nome da classe, planeje a existência deste estado e adicione-o ao CSS previamente. Se o valor desta nova classe for dinâmica, use cssText. Evite alterar a propriedade diretamente para qualquer mudança.</span></li>
<li><span class="c0">Pense como suas mudanças afetam a render tree e o quanto precisará ser revalidado depois desta mudanca. Se você usa position:absolute em um elemento, ele deixa de pertencer ao nó que está, e passa a ser filho do BODY. Alterá-lo então, não será tão custoso em termos de performance. Mesmo que alterações neste nó sobreponha outras areas, o reflow acontecerá apenas neste nó, e não em toda a render tree. </span></li>
<li><span class="c11">Limpe seu CSS. Classes não utilizadas devem ser removidas.</span></li>
<li><span class="c11">Reduza o número de mudanças no DOM. Ele vai causar mudanças estruturais em todas as outras etapas. E mais tempo de reflow. </span></li>
<li><span class="c11">Animações na página, transições? Pondere sobre posicioná-la de maneira absoluta e trabalhar com ela a partir do BODY.</span></li>
<li><span class="c11">Vá com calma nos seletores CSS &#8211; os descendentes em particular &#8211; pois usam maior poder de CPU para executar a tarefa (CPU = Bateria).</span></li>
</ol>
<h2>Referências</h2>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a> pela wikipedia</li>
<li><a href="http://video.google.com/videoplay?docid=-1471976166301235697#docid=1020647662203348823">Gecko Reflow</a></li>
<li><a href="http://paulirish.com/2011/dom-html5-css3-performance/">DOM, HTML5, CSS3 e Performance</a> &#8211; <a href="http://dl.dropbox.com/u/39519/talks/gperf/index.html">Slides</a> por Paul Irish</li>
<li><a href="http://www.mozilla.org/newlayout/doc/reflow.html">Reflow</a> pelo Mozilla Labs</li>
<li><a href="http://ajaxian.com/archives/browser-reflows-how-do-they-affect-performance">Reflow e Repaint</a> na Ajaxian</li>
<li><a href="http://code.google.com/speed/articles/reflow.html">Reflow</a> pelo Google Code</li>
<li><a href="http://www.w3.org/DOM/">W3C Overview do DOM</a></li>
<li><a href="http://www.dayofjs.com/videos/22158462/web-browsers_alex-russel">1 dia de javascript com Alex Russel: Como Navegadores Veem as suas Apps</a></li>
<li><a href="http://gent.ilcore.com/2011/03/how-not-to-trigger-layout-in-webkit.html">Como (não) criar um layout no webkit por Tony G</a></li>
<li><a href="http://www.webkit.org/blog/1091/more-web-inspector-updates/#timeline_panel">Usando a timeline panel em navegadores webkit</a></li>
<li><a href="http://www.bookofspeed.com/">The book of Speed</a></li>
<li><a href="http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/">Reflow/Repaint</a> por Stoyan Stefanov</li>
<li><a href="http://calendar.perfplanet.com/2009/the-new-game-show-will-it-reflow/">Inconsistências dos navegadores em Reflows</a> por Stoyan Stefanov</li>
<li><a href="http://www.browserscope.org/?category=reflow">BrowserScope tests para reflows</a></li>
<li><a href="http://www.youtube.com/watch?v=a2_6bGNZ7bA">Browsers para Web Developers</a> David Baron da Mozilla labs</li>
<li><a href="http://www.webkit.org/blog/114/webcore-rendering-i-the-basics/">Renderização no webkit, o básico</a></li>
</ul>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/tenha-o-dom/" title="Tenha o DOM">Tenha o DOM</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/dicas-de-sobrevivencia-ie6/" title="Dicas de sobrevivência em uma era pós o IE6">Dicas de sobrevivência em uma era pós o IE6</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></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/entendendo-os-reflows-2/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Templates e jQuery – parte 2</title>
		<link>http://tableless.com.br/templates-jquery-parte2/</link>
		<comments>http://tableless.com.br/templates-jquery-parte2/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 10:37:27 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[tmpl]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=2399</guid>
		<description><![CDATA[Agora que você já sabe como implementar templates em suas aplicações javascript, chegou a hora de conhecer técnicas avançadas de como combinar modelos HTML e scripts jQuery.]]></description>
			<content:encoded><![CDATA[<p><a href="http://tableless.com.br/templates-e-jquery-parte-1">Na primeira parte</a> deste artigo você conferiu uma introdução ao novo plugin .tmpl() que possibilita a utilização de templates para retornos e saídas de suas aplicações jQuery. O plugin certamente é um avanço considerável na organização de código &#8211; é o JavaScript ficando cada vez mais profissional e robusto, abandonando a fama de ser uma simples linguagem de script, sem padrões.</p>
<p>A forma mais básica de utilização do plugin .tmpl() é declarar seu template em uma variável e chamá-lo da seguinte forma:</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 /></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> noticias <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; titulo <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Notícia 1'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; data_publicacao <span style="color: #339933;">:</span> <span style="color: #3366CC;">'28/10/2010 20h31'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; chamada <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Chamada da notícia 1'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; link <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/noticia-1/'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; titulo <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Notícia 2'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; data_publicacao <span style="color: #339933;">:</span> <span style="color: #3366CC;">'28/10/2010 20h32'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; chamada <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Chamada da notícia 2'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; link <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/noticia-2/'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; titulo <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Notícia 3'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; data_publicacao <span style="color: #339933;">:</span> <span style="color: #3366CC;">'28/10/2010 20h33'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; chamada <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Chamada da notícia 3'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; link <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/noticia-3/'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> tpl_noticia <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;li&gt;&lt;h3&gt;${titulo}&lt;/h3&gt;&lt;span class=&quot;data&quot;&gt;${data_publicacao}&lt;/span&gt;&lt;span&gt;${chamada}&lt;/span&gt;&lt;span&gt;&lt;a href=&quot;${link}&quot;&gt;Veja mais&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;'</span><span style="color: #339933;">;</span><br />
<br />
$.<span style="color: #660066;">tmpl</span><span style="color: #009900;">&#40;</span> tpl_noticia<span style="color: #339933;">,</span> noticias <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">appendTo</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'ul#noticias'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Um problema do exemplo acima é que o template acaba ficando confuso dentro de uma variável. Uma outra forma de declarar um modelo seria utilizando a própria tag script, mas com um tipo diferente (text/x-jquery-tmpl):</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 /></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;script</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;tpl-noticia&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/x-jquery-tmpl&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h3<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${titulo}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h3<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;span</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;data&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>${data}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/span<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;chamada&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>${chamada}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;${link}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Leia 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><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>Dessa forma é possível indentar o template HTML obtendo uma melhor organização/visualização do código.</p>
<h2>Caching</h2>
<p>Antes de um template ser retornado através do método .tmpl(), ele é tranformado em uma função e depois executado. Uma forma de evitar esta execução toda vez que for retornado o plugin é utilizar o método .template() para criar uma versão em cache, otimizando a performance do script.</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: #006600; font-style: italic;">// renderizando como plugin diretamente no objeto jQuery</span><br />
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#tpl-noticia'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">template</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tplNoticia'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// associando diretamente a uma variável</span><br />
<span style="color: #003366; font-weight: bold;">var</span> tplNoticia <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#tpl-noticia'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">template</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// renderizando passando html/texto como parâmetro</span><br />
$.<span style="color: #660066;">template</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tplNoticia'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'&lt;li&gt;${titulo}&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, a variável <strong>tplNoticia</strong> armazena a função responsável por nosso template. O método .template() é chamado de duas formas distintas: a primeira cria a função do template baseada no script com o id tpl-noticia. A segunda chamada funciona da mesma forma, só que dessa vez passamos o conteúdo do template diretamente como parâmetro. <a href="http://tableless.com.br/anatomia-de-um-plugin-jquery">Lembram do artigo sobre plugins?</a> Então, uma é um método público e a outra um utilitário jQuery.</p>
<h2>{{wrap}} e {{tmpl}}</h2>
<p>As tags especiais {{wrap}} e {{tmpl}} possuem objetivos bem parecidos. A primeira permite a iteração e inclusão de trechos HTML dentro de um objeto de template. Já a tag {{tmpl}} utiliza, ao invés de trechos HTML, um outro objeto template.</p>
<div class="codecolorer-container xml 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 />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<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;script</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;tplNoticia&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/x-jquery-tmpl&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; {{wrap &quot;#tableNoticia&quot;}}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h2<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Notícia 1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h2<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &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;noticia-1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Chamada da notícia 1<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 />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h2<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Notícia 2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h2<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &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;noticia-2&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Chamada da notícia 2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; {{/wrap}}<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;tableNoticia&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/x-jquery-tmpl&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;table<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tbody<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{each $item.html(&quot;h2&quot;, true)}}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ${$value}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{/each}}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{each $item.html(&quot;p&quot;)}}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{html $value}}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{/each}}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tbody<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/table<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<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;noticias&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
$(function(){<br />
&nbsp; $(&quot;#tplNoticia&quot;).tmpl().appendTo(&quot;#noticias&quot;);<br />
});<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>No código acima utilizamos a tag {{wrap}} para popular dados em uma tabela. A primeira linha (&lt;tr&gt;) da tabela recebe os títulos do nosso template de notícias &#8211; tudo o que estiver entre a tag &lt;h2&gt;. A iteração é feita através da tag {{each}}, explicada no <a href="http://tableless.com.br/templates-e-jquery-parte-1">artigo anterior</a>. O que o exemplo acima faz é buscar todos os elementos H2 no item de template e adicionar o seu conteúdo, sem a tag, na célula da tabela. (Lembrando que você pode utilizar qualquer método jQuery no item de um loop dentro do template.)</p>
<p>Já a segunda linha da tabela recebe a chamada da notícia, preservando suas tags HTML &#8211; por isso a utilização da tag {{html}} no valor de cada notícia.</p>
<p>A tag {{tmpl}} é muito útil quando precisamos encadear ou utilizar uma espécie de include dentro de um outro template. No exemplo abaixo, o template para o título e o template da chamada da notícia estão separados. O método .tmpl() recebe apenas o template da chamada.</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 />11<br />12<br />13<br />14<br />15<br />16<br />17<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;script</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;tplNoticia&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/x-jquery-tmpl&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; {{tmpl &quot;#tplTitulo&quot;}}<br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;chamada&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>${chamada} &nbsp;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;${link}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Leia 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;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;tplTitulo&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text/x-jquery-tmpl&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h2<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>${titulo}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h2<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;span</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;data&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>${data_publicacao}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/span<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<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;noticias&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
$(function(){<br />
&nbsp; $( &quot;#tplNoticia&quot; ).tmpl( noticias ).appendTo( &quot;#noticias&quot; ); &nbsp;<br />
});<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<h2>Como e quando utilizar templates?</h2>
<p>Templating é um conceito relativamente novo no jQuery, portanto, algumas funcionalidades ainda podem parecer confusas. Cabe a você decidir qual a melhor forma de definir e converter seus modelos. Por exemplo, se o seu template só vai ser utilizado uma única vez não é necessário utilizar caching (de repente não é necessário nem mesmo utilizar um template!).</p>
<p>Procure organizar bem seu código e pensar sempre em uma possível evolução do projeto &#8211; nesse caso, templates vão ser uma mão na roda.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/templates-e-jquery-parte-1/" title="Templates e jQuery &#8211; parte 1">Templates e jQuery &#8211; parte 1</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/templates-jquery-parte2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Javascript e acessibilidade</title>
		<link>http://tableless.com.br/javascript-e-acessibilidade/</link>
		<comments>http://tableless.com.br/javascript-e-acessibilidade/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 12:30:55 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
				<category><![CDATA[Acessibilidade]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[acessibilidade]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=2211</guid>
		<description><![CDATA[Dando continuidade a nossa série sobre acessibilidade, confira algumas dicas para desenvolver sites dinâmicos tendo um mínimo de cuidado com screen readers e navegadores com JavaScript desabilitado.]]></description>
			<content:encoded><![CDATA[<p>É muito comum o desenvolvedor ficar empolgado ao descobrir recursos, plugins, animações e efeitos JavaScript e acabar exagerando no produto final. Também é muito comum, <a href="/como-tornar-seu-website-acessivel">como disse a Thaiana</a>, que acessiblidade esteja ligado exclusivamente a sites governamentais. Aos poucos este cenário está mudando.</p>
<p>Além de tornar o seu site acessível à pessoas com necessidades especiais, as técnicas abaixo serão úteis também quando o navegador do usuário estiver com JavaScript desabilitado. E se mesmo assim você ainda não estiver convencido, pense que, quanto menos JavaScript, mais otimizado e estável será o seu site/sistema.</p>
<h2>O problema</h2>
<p>Acessibilidade, basicamente, significa tornar o seu site/sistema compatível com dispositivos leitores de tela. O que este dispositivo faz é tentar converter todo o conteúdo presente em uma página para uma saída especial, seja ela voz (text-to-speech) ou braille. Por isso a importância da semântica no HTML e, por isso também, a importância do JavaScript não acabar atrapalhando o funcionamento do seu site.</p>
<p>Dependendo da forma como você utilizou JavaScript, parte do conteúdo pode passar batida no screen reader. Isso acontece muito com animações (conteúdos escondidos) e eventos que não são nativos do elemento, como tentar utilizar onClick em um parágrafo.</p>
<h2>&lt;noscript&gt;</h2>
<p>A prioridade número 1 nas regras para acessibilidade é tornar todo o conteúdo disponível quando o navegador não estiver com JavaScript habilitado. Procure implementar alternativas HTML parecidas com o conteúdo estabelecido por seus scripts.</p>
<p>No entanto, é importante ressaltar que o noscript só vai funcionar quando o javascript estiver dasabilitado no navegador (ele não vai funcionar se o JavaScript estiver com erro, por exemplo). Alguns screen readers tentam interpretar JS, portanto, utilizar JavaScript NÃO significa tornar seu site pouco acessível. Depende da forma como você implementa seus scripts.</p>
<p>Muita gente é a favor da extinção da tag &lt;noscript&gt;. O que eles defendem é que basta você desenvolver seus scripts de forma não-obstrutiva. Seu script pode ser executado ou não &#8211; independente disso ele não afetará a funcionalidade básica da página.</p>
<h2>Preciso mesmo usar JavaScript?</h2>
<p>Sempre que for utilizar algum efeito ou interação em JavaScript você deve se perguntar se ele é mesmo necessário. Ou ainda, não daria pra fazer a mesma coisa utilizando apenas HTML e CSS? </p>
<p>Pense duas vezes antes de implementar qualquer tipo de script. Analise não só a questão da acessibilidade, mas também performance e manutenção.</p>
<h2>Não invente eventos e não fique preso ao mouse</h2>
<p>Procure utilizar eventos JavaScript apenas em elementos que estão aptos a recebê-los. Por exemplo, não utilize onClick em um &lt;li&gt;. Geralmente, os eventos de interação devem estar associados a links e botões.</p>
<p>Lembre-se também que nem sempre vai ser utilizado o mouse, logo, eventos como onMouseOver e onMouseOut seriam inválidos. Ofereça alternativas globais, como onFocus, onBlur, onClick (que, no teclado, seria executado com a tecla Enter) &#8211; visando usuários que utilizam outros dispositivos.</p>
<p>Um problema grave são menus ativados no mouseover. Nesse caso o usuário não teria como acessar todas as páginas &#8211; ele não poderia navegar por toda a estrutura do site.</p>
<p>Essas regras estão também diretamente ligadas a conteúdos carregados via AJAX. Dependendo da forma como você ativa o evento, o screenreader vai ler ou não o conteúdo recém adicionado.</p>
<h2>WAI-ARIA</h2>
<p>Procurando estabelecer um padrão para acessibilidade e conteúdos dinâmicos foi criada a especificação WAI-ARIA (Accessible Rich Internet Applications). O que ela faz é adicionar novas formas de identificar e habilitar funcionalidades dinâmicas através de propriedades nas tags HTML. Recentemente o jQuery UI adicionou suporte total ao framework ARIA tornando assim seus widgets e elementos de interface acessíveis a usuários com alguma necessidade especial.</p>
<p>O ARIA, por exemplo, pode definir regiões em um site e habilitar o movimento via tab entre essas regiões, ao invés de elemento por elemento. O WAI-ARIA também possibilita definir papéis (roles) para elementos como menu, menuitem, banner, application etc.</p>
<p>Este é um assunto muito rico e ainda pouco explorado. Para mais informações visite a <a href="http://www.w3.org/WAI/PF/aria/" rel="external">especificação do WAI-ARIA no site do W3C</a> e também <a href="http://www.paciellogroup.com/blog/?p=106" rel="external">este tutorial sobre os papéis disponíveis no ARIA</a>.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/utilizando-a-biblioteca-modernizr/" title="Utilizando a Biblioteca Modernizr">Utilizando a Biblioteca Modernizr</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/google-apps-nao-suportara-mais-ie6/" title="Google Apps não suportará mais IE6">Google Apps não suportará mais IE6</a></li><li><a href="http://tableless.com.br/entendendo-quais-apis-realmente-fazem-parte-do-html5/" title="Entendendo quais APIs (realmente) fazem parte do HTML5">Entendendo quais APIs (realmente) fazem parte do HTML5</a></li><li><a href="http://tableless.com.br/javascript-com-cafe/" title="JavaScript com café">JavaScript com café</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/javascript-e-acessibilidade/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Vote no Especialista em Usabilidade para Presidente</title>
		<link>http://tableless.com.br/vote-no-especialista-em-usabilidade-para-presidente/</link>
		<comments>http://tableless.com.br/vote-no-especialista-em-usabilidade-para-presidente/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 12:20:25 +0000</pubDate>
		<dc:creator>Alysson Franklin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Browsers]]></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[acessibilidade]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Na Prática]]></category>
		<category><![CDATA[UCD]]></category>
		<category><![CDATA[usabilidade]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=2136</guid>
		<description><![CDATA[A usabilidade é algo muito abrangente e você, profissional front-end, tem muito a ver com isso.]]></description>
			<content:encoded><![CDATA[<h6>﻿(A discussão deste post vale para aplicações de grande porte, o que não significa que a mesma abordagem possa ser aplicada com sucesso em ambientes menores como blogs, por exemplo)</h6>
<p><strong>Usabilidade</strong> é um termo usado para definir a facilidade com que as pessoas podem empregar uma ferramenta ou objeto a fim de realizar uma tarefa específica e importante. Podemos dizer que a Usabilidade é empregada também para oferecer uma experiência de aprendizado fácil e intuitiva, fazendo com que o usuário tenha maior produtividade, navegando / utilizando sua aplicação rapidamente, memorizando operações e comentendo menos erros.</p>
<p>Usabilidade é um assunto muitas vezes subestimado em toda a cadeia de produção de um aplicativo. Veja bem, estou me referindo a <strong>aplicativos</strong> porque este assunto vai além do escopo de desenvolvimento web. A Usabilidade é um assunto pertinente a <strong>todo </strong>o ciclo de vida do projeto, e sua aplicabilidade envolve o nível executivo, o tático e o operacional.</p>
<p>E apesar de envolver vários níveis em uma organização, um dos roles mais importantes na <em>hierarquia de poder</em> do projeto (ainda mais agora com o HTML5) é o do desenvolvedor web responsável pela prototipação dos templates que recebem as funcionalidades de uma aplicação. Componentes e objetos desenvolvidos em outras camadas devem obedecer formatos de saída definidos para a camada web, o que transforma a responsabilidade (o poder&#8230;) do Especialista de Usabilidade em diferencial na otimização de processos de desenvolvimento de outras frentes, fornecendo as informações necessárias sobre o comportamento do browser com os componentes criados (e como ele deveria se comportar) &#8211; como a informação entra e sai das telas, como ela é embalada para consumo, o que pode ser feito no front-end X o que vai para o middleware, economizando horas de desenvolvimento&#8230; obviamente a lista de vantagens é maior e fica visível a medida que o projeto caminha. Uma camada web bem escrita é um mar aberto, tranquilo. Navegar com <em>navios e jangadas</em> em um cenário desses é mais rápido, mais tranquilo e o melhor de tudo, mais barato.</p>
<p>As aplicações web de grande porte hoje em dia são monstruosas quando analisadas do ponto de vista da arquitetura. Não é raro você encontrar projetos que façam uso de várias tecnologias para atingir determinado objetivo. Um exemplo pertinente é o <a title="Veja o Google Instant em ação" href="http://www.google.com/instant/" target="_blank">Google Instant</a>: Lançado em setembro, o Instant é uma colcha-de-retalhos de 16 diferentes tecnologias feito para otimizar suas pesquisas. O ganho com esse upgrade no engine de busca fica entre 2-5 segundos por busca. Aonde entra a Usabilidade aqui? Facilitando o usuário a fazer uma pesquisa de maneira mais rápida.  &#8211; “Mas a rapidez do search do Google já é incrível. Pra que melhorar um tempo de busca que já é absurdamente rápido? Vale o custo-benefício?”</p>
<p>Sim. Vale e muito. Perguntar isso é pensar apenas em um ambiente restrito. É manter a cabeça no ambiente desktop. A web é maior que isso. Temos uma infinidade de dispositivos que hoje a acessam para compartilhar e usar informação. Quando aplicamos a solução nas pesquisas dos browsers dos smartphones, o Instant se transforma em uma das melhores soluções deste ano em termos de Usabilidade.</p>
<div id="attachment_2138" class="wp-caption alignright" style="width: 207px"><a href="../wp-content/uploads/2010/10/usability-as-a-top1.png"><img class="size-medium wp-image-2138" src="../wp-content/uploads/2010/10/usability-as-a-top1-296x300.png" alt="Do planejamento a execucao de testes, a Usabilidade deve ser uma discussão constante" width="197" height="199" /></a><br />
<p class="wp-caption-text">Usabilidade deve ser tratada em todas as competências do projeto</p></div>
<p>E se isso é feito em um browser, a responsabilidade de encapsular todas essas 16 tecnologias em uma sopa de letrinhas que o navegador vai ler bonitinho, sem erros, e com coesão visual é do desenvolvedor web, mas com certeza podemos considerar que em um futuro próximo o seu estoque de leite estará acabando e além da sua geladeira informar o fato, ela vai te dar uma lista dos locais mais baratos para garantir que você não fique sem o produto.</p>
<p>Quem vai garantir que a ferramenta de busca da geladeira vai conseguir ler o catálogo de produtos que sua empresa tem que criar com o mais novo contrato assinado (Aquele do portal de laticínios)? Fica visível o impacto da atuação do Especialista nas vendas da empresa.</p>
<p>Um bom Plano de Usabilidade tem que passar por todas as competências envolvidas em um projeto: <strong>Planejamento, Análise, Design e Testes / Upgrades.</strong></p>
<p>Como falamos, uma aplicação web é exibida na maioria das vezes em um browser. E os Especialistas em navegadores somos nós. Se os navegadores fossem balanças, teríamos em um prato a <strong>aplicação, </strong>e no<strong> </strong>outro teríamos a <strong>necessidade do usuário. </strong>Os dois são muito pesados e seus valores aumentam e diminuem ao longo do projeto. Para atingir o <strong>equilíbrio</strong> em uma balança desse tipo precisamos de <strong>lastros</strong> para balanceá-la, e nosso lastro é a <strong>Usabilidade.</strong></p>
<div class="wp-caption alignleft" style="width: 386px"><img src="http://upload.wikimedia.org/wikipedia/commons/9/96/Basmati_Johns_%28peas_and_basmati_rice%29.jpg" alt="Um mexidão preparado em um prato altamente decorado." width="376" height="249" /><p class="wp-caption-text">Em uma boa embalagem, até um mexidão fica mais apetitoso</p></div>
<p>Defendo fortemente o uso de desenvolvedores web com fluência no front-end (nossa amada trinca HTML/CSS/JS) como os Especialistas de Usabilidade. A culinária francesa é um grande exemplo: famosa pelo sabor mas também pela &#8220;embalagem&#8221; na qual oferece seus alimentos, ela mostra que o design é algo fundamental na experiência de quem consome o produto. Organizar o prato em &#8220;fases&#8221; para que os sabores possam combinar harmoniosamente tambem é uma abordagem usada nessa fase de design &#8211; indicando ao cliente a sequência de ações para que o sabor de ingredientes mais fortes não faça desaparecer a mais suave especiaria. Em outras palavras, o chef está ensinando o cliente a comer o seu prato. Nós também precisamos fazer isso quando trabalhamos o design de nossas aplicações &#8211; mesmo com os features e plugins do jQuery mais bem desenhados da internet, nós ainda temos que nos preocupar em como a informação trafega por este design para garantir que a experiencia do usuário, independente da plataforma ou navegador seja a mais rica possível (e a mais próxima da pedida pelo seu cliente).</p>
<p>Por sermos em nossa maioria multidisciplinares, normalmente o perfil do desenvolvedor de front-end não o restringe apenas as tecnologias mencionadas acima (e um Especialista não pode se escorar apenas nestes skills para atuar, o roadmap para esta carreira é maior, porém de aprendizado fácil e lógico para nós) mas a um combinado de tecnologias para garantir que se necessário, ele possa gerar uma solução de front-end do zero, embalando diferentes camadas de aplicação em um produto que o usuário não pense para operar, mas seja levado pela intuição, agregando valor a experiência vivida no produto que você criou. Isso garante que ele poderá, em conjunto com o Arquiteto e líderes de outras frentes (Java, Banco de dados, Negócio) discutir abordagens mais eficazes para os componentes que a aplicação terá, uma vez que elas terão que ser embarcadas, inevitavelmente, em HTML para renderização em browsers. O papel do Especialista é evitar que problemas no desenvolvimento explodam na ponta do usuário, <em>domando</em> tudo que foi desenvolvido por todos os times para a aplicação em um documento com significado, heurística, taxonomia e funcionalidade reconhecíveis por browsers, web services, motores de busca, dispositivos e o que mais pintar por ai. E dos 5 maiores problemas em Usabilidade, 4 sao de responsabilidade direta do HTML:</p>
<dl>
<dt>Conteudo</dt>
<dd>Quando você abre a página em um navegador, o que você vê? Se você criou um site aplicando regras de Usabilidade, você deve ver 80-90% o que seu cliente está procurando. No entanto, com a maioria dos sites, geralmente o que seu cliente está procurando constitui apenas entre 50-60% (ou menos), a parte principal da página. O resto está nas intrusivas propagandas, navegação confusa e gráficos e cores estranhos.</dd>
<dt>Layout</dt>
<dd>Intimamente relacionado ao conteúdo é a forma como esse conteúdo é exibido na página. Embora os estudos têm mostrado que usuários estão dispostos a dar scroll para ler páginas web, se eles não encontram conteúdo relevante rapidamente eles são saem do seu website. Mantenha sua páginas limpas e simples. Teste remoção de elementos, faça análises e pondere se sua aplicação precisa realmente deles.</dd>
<dt>Cores</dt>
<dd>As cores afetam a usabilidade do seu website. Elas podem ser uma importante ferramenta cognitiva – como também podem confundir. Cor em elementos de páginas podem afetar leitores de tela por exemplo. Informações codificadas em imagens ou cores podem não ser reconhecidas por leitores de tela e Progressive Enhancement pode ser usado para resolver o problema. Um estudo de cores é também necessário para que pessoas com daltonismo não sejam impactadas em sua experiência.</dd>
<dt>Velocidade de renderização</dt>
<dd>O acesso à Internet pode estar ficando mais e mais rápido, mas isso não significa que o HTML deve ficar maior. Estudos de Usabilidade para Web continuam a mostrar que a velocidade de renderização da página/componentes é muito importante. Em um portal de conteúdo a demora pode fazer o usuário perder o interesse, não importa o quanto eles estavam interessados no tema. Você não pode controlar todos os aspectos da renderização (download) &#8211; por isso é importante fazer o que puder para que o HTML &#8211; o documento que carrega o significado da página &#8211; seja renderizado (e compreendido) rapidamente pelo browser.</dd>
</dl>
<p>Um HTML bem escrito, limpo e escalonado garante uma melhora sensível no desenvolvimento de um projeto. Ter um desenvolvedor HTML como Especialista de Usabilidade garante que o cóodigo gerado pelo time de integração vai ser o mais enxuto possível, afinal de contas um desenvolvedor HTML precisa saber que para resolver situações como a de velocidade de renderização de página por exemplo, precisamos*:</p>
<ul>
<li>Fazer o menor número possível de requisições HTTP em uma página;</li>
<li>Garantir o uso de CDNs para otimizar o tempo de resposta de uma requisição HTTP;</li>
<li>Garantir um uso eficiente da memória cache do navegador, adicionando cabecalhos Expires para otimizar as requisições HTTP, fazendo AJAX ou outra tecnologia se aproveitar de tudo que pode ser deixado no cliente;</li>
<li>Utilizar gzip para compactar HTML, scripts e estilos;</li>
<li>Chamar o estilo no topo das páginas, evitando declarações inline e se possivel chamando pela tag &lt;link&gt;, ou seja, sempre em arquivos externos;</li>
<li>Rodar os scripts no final da página (ou garantir que uma função apenas rode após o document.ready) e sempre que possível em arquivos externos</li>
<li>Usar o Keep-alive e poucos dominios para reduzir as pesquisas de DNS (isso pode mudar agora no HTML com o localStorage em alguns casos específicos);</li>
<li>Sempre compactar o javascript e remover chamadas duplicadas, garantindo uma biblioteca leve e centralizada para suas funções;</li>
<li>Evitar redirecionamentos.</li>
</ul>
<p>Algumas coisas podem soar como óbvias mas é comum o já <em>marginalizado </em>HTML (assunto para outro post) ser entregue a responsabilidade de desenvolvedores de outras frentes (como java por exemplo) para garantir um prazo de entrega mais rápido e menor custo, uma vez que desenvolvimento e integração acontecem no mesmo momento. HTML é sim uma linguagem realmente simples. Porém ela também é muito criteriosa e domina-lá é a garantia entre os milhões de page-views e um mirror do seu-site-que-fechou-ano-passado no web archive. Estamos falando de milhares/milhões de visitas e transações simultâneas, alta performance, alta colaboração, interoperabilidade de dispositivos, garantia cross-browser, garantia de baixo impacto e custo para mudanças estruturais futuras da aplicação (design), redução de gastos na implementação do projeto devido a rapidez da integração dos componentes ao front-end, de um responsável em entender as requisições do cliente e discutí-las com linguagem simples, para garantir que as expectativas criadas possam ser atingidas na camada web da aplicação e devidamente repassadas para as outras frentes do projeto. A lista é maior. Não é pouca coisa e o mais indicado para preencher esta demanda somos nós. Se a satisfação do usuário é medida diretamente pela sua experiência no front-end, somos nós os presidentes. Detalhando um passo-a-passo de Usabilidade, isso fica mais claro ainda:</p>
<p><a href="http://tableless.com.br/wp-content/uploads/2010/10/visual_map.png"><img class="aligncenter size-full wp-image-2139" src="http://tableless.com.br/wp-content/uploads/2010/10/visual_map.png" alt="Um mapa mostrando todas as etapas de um Plano de Usabilidade" width="681" height="454" /></a></p>
<p>Voltaremos a esse Plano de Usabilidade no próximo post, discutindo a criticidade de cada uma das etapas, e aplicabilidade de acordo com tamanho e prazo de entrega do projeto, porém posso adiantar que das 26 etapas, em pelo menos 17 um profissional sênior de HTML/CSS/JS deve ter grande desenvoltura, com atuação moderada/leve ou massiva:</p>
<dl>
<dt>Colaboração leve e moderada</dt>
<dd>Criação do SOW (Statement of Work), Condução de Análise de Tarefas, Desenvolvimento de Atores, Cenários de Teste, Definição de métricas, objetivos, Análise de cartas, Casos de uso, Preparação do Plano de Testes, Análise e geração de relatórios.</dd>
<dt>Colaboração massiva</dt>
<dd>Especificação do site, Inventório de conteúdo, Arquitetura da Informação, Reconhecimento de padrões visuais para textos, Design paralelo, Release da aplicação, Testes de Usabilidade, Testes de Heurística.</dd>
</dl>
<p>Com certeza o Plano de Usabilidade acima é utópico. É como o socialismo &#8211; se pudéssemos aplicar 100% da sua teoria, o mundo seria lindo. Porém o custo para a manutenção de uma estrutura aonde o diagrama acima possa ser 100% executado não é proibitivo, porém considerável. E quanto maior o projeto, mais necessária a sua aplicação, e maior o ROI de Usabilidade.</p>
<p>Mas lidar com a Usabilidade requer as etapas descritas, isso é fato. O negócio é <strong>flexibilizar</strong>, entendendo as necessidades do cliente e aplicando seus conhecimentos nas etapas que forem aplicadas no seu projeto. E sempre pensar em Usabilidade e Escalabilidade e Acessibilidade enquanto escreve seus templates. Acabou de criar um portal de venda de lingerie? Sera que suas listviews estao preparadas para o inevitável sucesso da aplicação (afinal você é um grande desenvolvedor) e futura integração via webservices com seus mais novos contratos, um portal de produtos de beleza e um portal de cabeleireiros?</p>
<p>Como eu disse no inicio do post, este fluxo de trabalho é muito mais real para portais e aplicações web de médio/grande porte. Se seu site tem um stickiness alto, independente do porte, você também pode ponderar sobre a adoção dos métodos acima, afinal se você otimiza a experiência do usuário e ele feliz, recomenda seu produto, é o seu nome que está na vitrine. E este tipo de profissional está em falta no mercado, sendo disputado a <em>tapa</em> por empresas.</p>
<p>No próximo post detalho o passo-a-passo do Plano de Usabilidade, e tambem alguns métodos de Usabilidade para serem aplicados no desenvolvimento web, alem de Design Centrado no Usuário (UCD).</p>
<p>*Se estes bullets soam como Javanês nos seus ouvidos, recomendo fortemente a leitura de um livro sensacional do <strong>Steve Souders</strong> chamado <strong>High Performance Web Sites.</strong></p>
<p><strong>**</strong><a title="Aprendendo o estado-da-arte em Usabilidade" href="http://www.nngroup.com/events/tutorials/usability.html" target="_blank">Tá com grana no bolso para o investimento de uma carreira?</a></p>
<p>Referências:</p>
<ul>
<li><a href="http://webdesign.about.com/od/usability/tp/aatpwebusable.htm" target="_blank">Most Important Web Usability Issues</a></li>
<li><a href="http://www.usability.gov/methods/process.html">Usability.gov &#8211; Visual Map</a></li>
<li><a href="http://blog.kissmetrics.com/color-psychology/?wide=1">How do colors affect purchases?</a></li>
<li><a href="http://oreilly.com/catalog/9780596529307" target="_blank">High Performance Web Sites &#8211; Essential Knowledge for Front-End Engineers</a></li>
</ul>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><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/experiencia-cross-device/" title="Experiência cross-device">Experiência cross-device</a></li><li><a href="http://tableless.com.br/experiencia-deve-ter-comeco-meio-e-fim/" title="Experiência deve ter começo, meio e fim">Experiência deve ter começo, meio e fim</a></li><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/google-apps-nao-suportara-mais-ie6/" title="Google Apps não suportará mais IE6">Google Apps não suportará mais IE6</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/vote-no-especialista-em-usabilidade-para-presidente/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Digest 04/09: Javascript, JQuery e Ajax</title>
		<link>http://tableless.com.br/digest-0409-javascript-jquery-e-ajax/</link>
		<comments>http://tableless.com.br/digest-0409-javascript-jquery-e-ajax/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 10:11:06 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Digest]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://tableless.com.br/?p=1306</guid>
		<description><![CDATA[Links sobre Javascript, JQuery e Ajax para estudar e ter como referência.]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://jorenrapini.com/blog/web-development/useful-javascript-jquery-and-ajax-tutorials-and-resources-massive-link-collection-part-1">Useful Javascript, jQuery, and AJAX Tutorials and Resources &#8211; Massive Link Collection Part #1</a></li>
<li><a href="http://tableless.com.br/wp-admin/post-new.php">jQuery Tips and Tricks II</a></li>
<li><a href="http://www.ajaxline.com/10-best-jquery-datepickers-plugins">10 Best jQuery Datepickers Plugins</a></li>
<li><a href="http://www.noupe.com/php/20-useful-php-jquery-tutorials.html"> 20 Useful PHP + jQuery Components &amp; Tuts for Everyday Project</a></li>
<li><a href="http://webstandard.kulando.de/post/2009/04/09/best-of-jquery-tutorials-part-3">Best of JQuery Tutorials</a></li>
<li><a href="http://www.queness.com/post/212/10-jquery-and-non-jquery-javascript-rich-text-editors">10 JQuery and Non JQuery Javascript Rich Text Editors</a></li>
<li><a href="http://www.queness.com/post/204/25-jquery-plugins-that-enhance-and-beautify-html-form-elements">25+ jQuery Plugins that enhance and beautify HTML form elements</a></li>
<li><a href="http://www.webdesigntoolslist.com/2009/04/webmastertools/javascript-cheat-sheets-quick-reference-guides-for-javascript-webmasters-coders-web-developers-designers/">Roundup of Javascript Cheat Sheets</a></li>
</ul>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/lendo-um-arquivo-de-texto-com-ajax/" title="Lendo um arquivo de texto com AJAX">Lendo um arquivo de texto com AJAX</a></li><li><a href="http://tableless.com.br/digest-0609-javascript-jquery/" title="Digest 06/09: Javascript, JQuery">Digest 06/09: Javascript, JQuery</a></li><li><a href="http://tableless.com.br/digest-0509-javascript-jquery/" title="Digest 05/09: Javascript, JQuery">Digest 05/09: Javascript, JQuery</a></li><li><a href="http://tableless.com.br/podcast-16/" title="Podcast #16">Podcast #16</a></li><li><a href="http://tableless.com.br/entendendo-quais-apis-realmente-fazem-parte-do-html5/" title="Entendendo quais APIs (realmente) fazem parte do HTML5">Entendendo quais APIs (realmente) fazem parte do HTML5</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/digest-0409-javascript-jquery-e-ajax/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Descontos no DreamHost &#8211; para serviços anuais e mensais</title>
		<link>http://tableless.com.br/desconto-no-dreamhost/</link>
		<comments>http://tableless.com.br/desconto-no-dreamhost/#comments</comments>
		<pubDate>Wed, 04 Jan 2006 23:39:29 +0000</pubDate>
		<dc:creator>Diego Eis</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Bonito de se ver]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Client-Side]]></category>
		<category><![CDATA[Convertidos]]></category>
		<category><![CDATA[Digest]]></category>
		<category><![CDATA[Extensões]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Na Prática]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[acessibilidade]]></category>
		<category><![CDATA[cotidiano]]></category>
		<category><![CDATA[Extensions]]></category>

		<guid isPermaLink="false">http://tableless.com.br/desconto-no-dreamhost</guid>
		<description><![CDATA[Atenção: Se tiver problemas com o pagamento por ser necessário o Google Checkout, leia as instruções aqui: Pagando o Dreamhost com Google Checkout mesmo sendo brasileiro e outras informações aqui. Eu uso Dreamhost a muito tempo. Quase nunca tenho problemas &#8230;]]></description>
			<content:encoded><![CDATA[<p><strong>Atenção</strong>: Se tiver problemas com o pagamento por ser necessário o Google Checkout, leia as instruções aqui:<br />
<a href="http://blog.elcio.com.br/pagando-o-dreamhost-com-google-checkout-mesmo-sendo-brasileiro/">Pagando o Dreamhost com Google Checkout mesmo sendo brasileiro</a> e <a href="http://www.revolucao.etc.br/archives/criando-sua-conta-no-google-checkout-para-assinar-a-dreamhost/">outras informações aqui</a>.<a href="http://blog.elcio.com.br/pagando-o-dreamhost-com-google-checkout-mesmo-sendo-brasileiro/"><br />
</a></p>
<p>Eu uso <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Dreamhost</a> a muito tempo. Quase nunca tenho problemas (você já viu este site fora do ar?). Ele tem ferramentas úteis como WordPress ou PHPBB que são facilmente instaláveis com apenas 1 clique. Fazer atualização destes sistemas também é tão fácil quanto instalá-los.</p>
<p>Algumas vantagens:</p>
<ul>
<li>No <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Dreamhost</a> você também pode criar domínios e subdomínios ilimitados. Isso é bom para quem quiser hospedar sites de clientes, amigos e etc;</li>
<li>Painel de controle simple e bonito;</li>
<li>Você pode criar uma conta FTP individual para cada domínio hospedado;</li>
<li>Além do FTP, você tem acesso o servidor via SSH;</li>
<li>O <a href="http://www.dreamhost.com/r.cgi?132780/signup/?next_step=Index">plano mais básico</a> do <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Dreamhost</a> te dá 200 Gigas de espaço e 2 Teras de transferência mensal.</li>
<li>Você pode ter mais de 3000 contas de email para cada domínio hospedado&#8230; e isso no plano básico!</li>
<li>Fora painel de controle, instalações com um clique, Ruby on Rails, PHP nas versões 4 e 5 e MySQL, Streamming Quicktime, Aliases de e-mails ilimitados e muito mais.</li>
<li>Você ganha um domínio .com/.net/.org <strong><strong>graça</strong></strong></li>
<li>E depois que virar cliente, você ainda pode ganhar uns trocados com o programa de afiliados que eles tem. É só indicar assim como fazemos aqui. Se quiser, pode copiar as informações descritas nesta página.</li>
</ul>
<p>No <a href="http://wiki.dreamhost.com/index.php/Main_Page">Wiki do Dreamhost</a> tem mais detalhes e repostas de alguma dúvida que você possa ter.</p>
<p>Com o Tableless você ganha 3 tipos de descontos no <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Dreamhost</a>, abaixo veja as descrições e passos para o cadastro:</p>
<p>Com o cupom de desconto <strong>TABLELESS </strong>você consegue:<br />
25% de desconto no L1 Anual:<strong> de $119.40 você paga $89.65</strong><br />
15% no L2  Anual: <strong>de $239.40 você paga $203.49</strong></p>
<p>Se você preferir <strong>uma conta mensal</strong> no <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Dreamhost</a>, também damos desconto, use o cupom <strong>TABLEBLESSMENSAL </strong>e ganhe <strong>$39,90</strong> de desconto em todos os planos mensais do <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Dreamhost</a>.<br />
Mensal L1 de $59,90 <strong>você paga $20,00</strong>.<br />
Mensal L2 de $69,90 <strong>você paga $30,00</strong>.<br />
Mensal L3 de $89,90 <strong>você paga $50,00</strong>.</p>
<p>E tem também o cupom <strong>TABLELESS6007</strong>, onde você ganha 60% de desconto nos planos:<br />
Mensal L1 de $59,90 <strong>você paga $24,96.</strong><br />
Anual L1 de $119,40 <strong>você paga $47,76 por um ano!</strong><br />
Mensal L2 de $69,90 <strong>você paga só $27,96.<br />
</strong>Mensal L3 de $89,90 <strong>você paga $35,96.</strong></p>
<p>E tem também o <strong>TABLELESS2</strong> onde você ganha $40,00 de desconto em qualquer plano do <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Dreamhost</a>. Só colocar TABLELESS2 na hora de comprar qualquer plano e você ganha $40,00 de desconto no ato.</p>
<p>Para poder <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">ganhar desconto ao assinar</a> algum plano de hospedagem na <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Dreamhost</a>, siga os seguintes passos:</p>
<ul>
<li><a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">Escolha o plano que gostar mais</a>;</li>
<li>Clique no botão “<strong>SIGN UP NOW</strong>” do respectivo plano;</li>
<li>Na seguinte página, você escolhe o nível do plano que você gostaria de ter;</li>
<li>Na mesma página, você escolhe se quer receber comissões por indicações;</li>
<li>Logo após, selecione as opções de domínio, se você não tiver domínio ainda, preencha os dados referentes ao seu domínio, conta de usuário, email e seus dados pessoais. Se já tiver, é só selecionar dizendo que já tem um domínio;</li>
<li>No último campo, intitulado “<strong>Promo Code or email of who referred you:</strong>“, digite um dos cupons do Tableless: <strong>TABLELESS</strong>, <strong>TABLELESSMENSAL</strong> ou <strong>TABLELESS60</strong>;</li>
<li>Clique em <strong>I agree to abide by DreamHost&#8217;s <a href="http://www.dreamhost.com/tos.html" target="new">Terms of Service</a> and <a href="http://www.dreamhost.com/spam.html" target="new">Anti-Spam Policy</a>.</strong></li>
<li>E para finalizar clique no botão “<strong>Continue to secure payment…</strong>”;</li>
<li>Cheque o valor. Ele já deve estar <em>com o desconto aplicado</em>;</li>
<li>Preencha os dados do seu cartão de crédito (<strong><em>tem que ser internacional</em></strong> <strong>ou via <a href="http://www.paypal.com/us/">paypal</a></strong>) e finalize a compra;</li>
</ul>
<p>Pagando pelo GoogleChekout é fácil:</p>
<p>Por causa de fraudes que estavam ocorrendo o Dreamhost está passando a utilizar o GoogleCheckout como forma de pagamento. Para ter uma conta no GoogleCheckout, você precisa apenas já ter ou criar uma conta no Google (GMail).</p>
<p>Para usar o GoogleCheckout no Dreamhost, siga os passos abaixo:</p>
<ol>
<li>Ao se cadastrar, no país escolha BAHAMAS. Isso porque você não precisará colocar CEP.</li>
<li>Preencha o restante dos dados normalmente.</li>
<li>Quando chegar em SHIP MY ORDER TO, selecione a opção A DIFFERENT ADDRESS, e agora sim, selecione BRAZIL como seu país. Depois, preencha seu endereço.</li>
<li>Clique em AGREE e CONTINUE e pronto!</li>
</ol>
<p>Assine o <a href="http://www.dreamhost.com/r.cgi?132780/hosting.html">DreamHost pelo Tableless</a> e saia do sufoco.</p>
<h3  class="related_post_title">Posts Relacionados</h3><ul class="related_post"><li><a href="http://tableless.com.br/curso_de_web_standards/" title="Curso de Web Standards">Curso de Web Standards</a></li><li><a href="http://tableless.com.br/site-em-ajax-site-em-flash-pergunta-ruim/" title="Site em Ajax? Site em Flash? Pergunta ruim.">Site em Ajax? Site em Flash? Pergunta ruim.</a></li><li><a href="http://tableless.com.br/cuidado-para-nao-regredir/" title="Cuidado para não regredir">Cuidado para não regredir</a></li><li><a href="http://tableless.com.br/web-20-pe-no-chao/" title="Web 2.0 pé no chão">Web 2.0 pé no chão</a></li><li><a href="http://tableless.com.br/seu-lugar-ao-sol/" title="Seu lugar ao sol">Seu lugar ao sol</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://tableless.com.br/desconto-no-dreamhost/feed/</wfw:commentRss>
		<slash:comments>59</slash:comments>
		</item>
	</channel>
</rss>

