<?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>Klaus Paiva &#187; jQuery</title>
	<atom:link href="http://blog.klaus.pro.br/tags/jquery/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.klaus.pro.br</link>
	<description>Idéias e desventuras de Klaus Paiva</description>
	<lastBuildDate>Mon, 12 Jul 2010 20:26:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>FireQuery &#8211; Firebug++ para a jQuery</title>
		<link>http://blog.klaus.pro.br/2010/ler/firequery-firebug-para-a-jquery/index.html</link>
		<comments>http://blog.klaus.pro.br/2010/ler/firequery-firebug-para-a-jquery/index.html#comments</comments>
		<pubDate>Wed, 14 Apr 2010 16:03:56 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[FireQuery]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=400</guid>
		<description><![CDATA[Dica rápida pra quem usa a biblioteca jQuery no seu dia-a-dia. A extensão FireQuery se acopla ao já famoso Firebug e adiciona uma série de novos recursos, todos pensados em facilitar a vida de quem usa jQuery. Entre os vários recursos vale destacar a listagem dos eventos que estão associados a um elemento na página. [...]]]></description>
			<content:encoded><![CDATA[<p>Dica rápida pra quem usa a biblioteca jQuery no seu dia-a-dia.</p>
<p>A extensão <a href="http://firequery.binaryage.com/">FireQuery</a> se acopla ao já famoso <a href="http://getfirebug.com/">Firebug</a> e adiciona uma série de novos recursos, todos pensados em facilitar a vida de quem usa jQuery.</p>
<p>Entre os <a href="http://firequery.binaryage.com/#features">vários recursos</a> vale destacar a listagem dos eventos que estão associados a um elemento na página. Isso é extremamente útil quando você precisa alterar códigos feitos por outras pessoas, ou mesmo um código seu que você já nem lembra mais como ele funciona. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Dica enviada pelo meu colega de trabalho Paulo Lomanto, que é totalmente <strong>Web 1.0</strong> e não tem Twitter, nem blog, nem nada pra eu <em>linkar</em> aqui. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2010/ler/firequery-firebug-para-a-jquery/index.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery 1.4</title>
		<link>http://blog.klaus.pro.br/2010/ler/jquery-1-4/index.html</link>
		<comments>http://blog.klaus.pro.br/2010/ler/jquery-1-4/index.html#comments</comments>
		<pubDate>Thu, 14 Jan 2010 20:44:43 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=384</guid>
		<description><![CDATA[Hoje saiu a versão 1.4 da mais popular biblioteca de Javascript na atualidade: a jQuery. Neste texto estão descritas as mudanças presentes nesta nova versão, detalhamento dos novos métodos, novas formas de passar alguns parâmetros e gráficos que ilustram os ganhos de performance obtidos. E se você planeja migrar seu código para esta nova versão, [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje saiu a versão 1.4 da mais popular biblioteca de Javascript na atualidade: a <a href="http://jquery.com/">jQuery</a>.</p>
<p><a href="http://jquery14.com/day-01/jquery-14">Neste texto</a> estão descritas as mudanças presentes nesta nova versão, detalhamento dos novos métodos, novas formas de passar alguns parâmetros e gráficos que ilustram os ganhos de performance obtidos.</p>
<p>E se você planeja migrar seu código para esta nova versão, não deixe de conferir a <a href="http://jquery14.com/day-01/jquery-14#backwards">lista de incompatibilidades</a>. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Via <a href="http://twitter.com/jeresig">@jeresig</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2010/ler/jquery-1-4/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>text-overflow para múltiplas linhas</title>
		<link>http://blog.klaus.pro.br/2009/ler/text-overflow-para-multiplas-linhas/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/text-overflow-para-multiplas-linhas/index.html#comments</comments>
		<pubDate>Mon, 26 Oct 2009 18:04:35 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[text-overflow]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=360</guid>
		<description><![CDATA[Esse texto surgiu de uma necessidade que é bastante comum pra nós, seres programadores de interfaces web. Sabe quando o webdesigner desenha uma caixa de tamanho fixo (e largura variável, pra complicar um pouco), em que o texto deverá ficar contido ali dentro da caixa, e no caso do texto ser maior que o tamanho [...]]]></description>
			<content:encoded><![CDATA[<p>Esse texto surgiu de uma necessidade que é bastante comum pra nós, seres programadores de interfaces <em>web</em>. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Sabe quando o <em>webdesigner</em> desenha uma caixa de tamanho fixo (e largura variável, pra complicar um pouco), em que o texto deverá ficar contido ali dentro da caixa, e no caso do texto ser maior que o tamanho disponível, os famosos &#8220;três pontinhos&#8221; devem aparecer?</p>
<p>Pra ilustrar isso melhor, veja a imagem abaixo:</p>
<dl class="images">
<dt><img src="http://blog.klaus.pro.br/wp-content/uploads/2009/10/text-overflow-exemplo.png" alt="Caixa com dimensões fixas e conteúdo &quot;ajustado&quot; para caber" /></dt>
<dd>Caixa com dimensões fixas e conteúdo &#8220;ajustado&#8221; para caber</dd>
</dl>
<p>Um método comum de se fazer isso é contar o número de caracteres e colocar &#8220;&#8230;&#8221;, caso o número de caracteres ultrapasse o número máximo de caracteres que ficarão visíveis. Claro que esse número máximo é uma estimativa e nem sempre o resultado fica bom. Além disso, pode acontecer do &#8220;corte&#8221; no texto acontecer no meio de uma palavra, gerando um resultado estranho ao visitante, &#8220;tipo isso aq&#8230;&#8221;.</p>
<p>Nas CSS existe uma propriedade chamada &#8220;text-overflow&#8221; que, sob certas circustâncias, adiciona automagicamente &#8220;&#8230;&#8221; ao final do texto que não coube na área visível. OK! Problema resolvido então? Não exatamente&#8230; <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>O problema não está resolvido por conta de duas outras questões. Uma delas é que o Firefox ainda não implementa essa propriedade (sim, o IE tem! Moderno hein? <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). A outra questão é que essa propriedade não se aplica nos casos em que o texto ocuparia mais de uma linha.</p>
<p>Se você quiser uma explicação mais detalhada (e exemplos) sobre a propriedade &#8220;text-overflow&#8221;, <a href="http://www.quirksmode.org/css/textoverflow.html">acesse este texto no blog do PPK</a>.</p>
<p>Voltando ao assunto original, agora precisamos resolver aquelas duas questões. Felizmente, com algum tempo de Google e mais algum tempo de pesquisa em fóruns, consegui encontrar algo capaz de ajudar nesta tarefa: o <a href="http://jquerytextoverflow.ipdemo.nl/">jQuery textOverflow Plugin</a>.</p>
<p>O código é relativamente simples e oferece várias opções de customização. Aqui tem uma página de exemplo (<a href="http://www.klaus.pro.br/projects/text-overflow/teste1.php">exemplo 1</a>) gerando algo similar ao que foi mostrado na imagem acima.</p>
<p>Caso você tenha vários elementos na página que vão receber esse tratamento, deixo uma dica: tome cuidado com a performance! Como é uma operação intensiva no DOM, a chance desse código deixar o navegador bastante lento é bastante alta.</p>
<p>Pra esses casos, se você realmente precisa dos &#8220;&#8230;&#8221;, acho que vale a pena tentar juntar esse código com a solução de &#8220;<a href="http://www.nczonline.net/blog/2009/08/11/timed-array-processing-in-javascript/">execução de Javascript com pausas</a>&#8220;, proposta pelo <a href="http://www.nczonline.net/">Nicholas Zakas</a>.</p>
<p>Fiz uma proposta com essa combinação. Ela pode ser vista aqui no <a href="http://www.klaus.pro.br/projects/text-overflow/teste2.php">exemplo 2</a> (com 100 elementos). Embora seja visualmente mais lenta, ela não trava o navegador em momento algum, mesmo no IE 6. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bom, o texto ficou bem longo&#8230; mas acho que deu pra passar bem a ideia. Sugestões ou comentários, é só usar o formulário abaixo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/text-overflow-para-multiplas-linhas/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tooltips no Google Maps</title>
		<link>http://blog.klaus.pro.br/2008/ler/tooltips-no-google-maps/index.html</link>
		<comments>http://blog.klaus.pro.br/2008/ler/tooltips-no-google-maps/index.html#comments</comments>
		<pubDate>Mon, 15 Dec 2008 16:44:36 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Code]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=173</guid>
		<description><![CDATA[Dizem por aí que a necessidade é a mãe da invenção e da criação e&#8230; eu, de fato, concordo com isso. Há duas semanas atrás eu fazia uma aplicação que exibia vários marcadores sobre um mapa e percebi que seria útil exibir uma espécie de tooltip sobre esses marcadores. A opção de usar o atributo [...]]]></description>
			<content:encoded><![CDATA[<p>Dizem por aí que <em>a necessidade é a mãe da invenção e da criação</em> e&#8230; eu, de fato, concordo com isso. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Há duas semanas atrás eu fazia uma aplicação que exibia vários marcadores sobre um <a href="http://maps.google.com/">mapa</a> e percebi que seria útil exibir uma espécie de <em>tooltip</em> sobre esses marcadores. A opção de usar o atributo <strong><em title="Isso, esse mesmo">title</em></strong> estava disponível sim, mas eu queria mais, queria poder personalizar essas <em>tooltips</em>!</p>
<p>Aproveitando-me do fato que a <a href="http://code.google.com/apis/maps/">API de Mapas do Google</a> já possui uma série de métodos para tratar eventos do <em>mouse</em>, resolvi criar algo que permitisse exibir <em>tooltips</em> personalizadas sobre os marcadores no mapa. O resultado? <a href="http://code.google.com/p/maptips/">MapTips</a>.</p>
<p>O resultado ficou bem legal e simples. Até criei uma <a href="http://www.klaus.pro.br/projects/maptips/index.html">página que explica o funcionamento e tem exemplos de utilização</a>.</p>
<p>Como talvez você já tenha notado, disponibilizei o código fonte no <a href="http://code.google.com/p/maptips/">Google Code</a>. Agora preciso criar mais algumas páginas de <em>wiki</em> e <em>bug tracking</em>. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2008/ler/tooltips-no-google-maps/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vai uma busca binária aí?</title>
		<link>http://blog.klaus.pro.br/2008/ler/vai-um-algoritmo-de-busca-binaria-ai/index.html</link>
		<comments>http://blog.klaus.pro.br/2008/ler/vai-um-algoritmo-de-busca-binaria-ai/index.html#comments</comments>
		<pubDate>Tue, 07 Oct 2008 22:58:35 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=127</guid>
		<description><![CDATA[Esses dias eu estava pensando comigo mesmo: &#8220;a gente vê várias idéias boas e, por não usar na hora em que vimos, acabamos esquecendo&#8230;&#8221;. Alguém aí lembrou de algoritmos? É, caso típico. =) Semana passada eu estava vendo um algoritmo em C++ de busca binária. Deixando o C++ um pouco de lado parei para pensar [...]]]></description>
			<content:encoded><![CDATA[<p>Esses dias eu estava pensando comigo mesmo: &#8220;a gente vê várias idéias boas e, por não usar na hora em que vimos, acabamos esquecendo&#8230;&#8221;. Alguém aí lembrou de <a href="http://pt.wikipedia.org/wiki/Algoritmo">algoritmos</a>? É, caso típico. =)</p>
<p>Semana passada eu estava vendo um algoritmo em C++ de <a href="http://pt.wikipedia.org/wiki/Pesquisa_bin%C3%A1ria">busca binária</a>. Deixando o C++ um pouco de lado parei para pensar onde eu já havia aplicado esse algoritmo. Qual não foi a minha surpresa em lembrar de um lugar onde faria sentido e eu <strong>deixei de usar</strong> o algoritmo. A situação? Marcar uma cidade qualquer numa listagem (combo) HTML.</p>
<p>Permita-me ilustrar melhor o cenário. Imagine uma <a onclick="this.target = '_blank';" href="http://blog.klaus.pro.br/wp-content/uploads/2008/10/cidades-combo.html">listagem beeeem grande de cidades</a> (nota: arquivo pesado). Como toda boa lista de cidades, ela está ordenada alfabeticamente. Agora, por algum dado motivo, você gostaria de selecionar uma cidade qualquer <strong>X</strong> dessa listagem. <em>Nota: a lista tem algumas cidades falsas apenas para aumentar o volume de dados.</em></p>
<p>Intuitivamente você faria um <em>for</em> percorrendo as opções da listagem e marcando a cidade desejada. Em termos de código isso seria:</p>
<pre class="javascript"><code><span class="kw2">var</span> maximo = combo.<span class="me1">options</span>.<span class="me1">length</span> - <span class="nu0">1</span>;
<span class="kw1">for</span><span class="br0">(</span> <span class="kw2">var</span> i = <span class="nu0">0</span>; i &lt; maximo; i++ <span class="br0">)</span>
<span class="br0">{</span>
  <span class="kw1">if</span><span class="br0">(</span> combo.<span class="me1">options</span><span class="br0">[</span>i<span class="br0">]</span>.<span class="me1">text</span> == cidade <span class="br0">)</span>
  <span class="br0">{</span>
    combo.<span class="me1">selectedIndex</span> = i;
    <span class="kw1">return</span>;
  <span class="br0">}</span>
<span class="br0">}</span></code></pre>
<p>O código acima funciona, só não funciona bem para a nossa listagem tamanho família. Se eu pedir para marcar uma cidade próxima do final da lista, por exemplo <strong>Salto</strong>, a busca vai demorar pois o <em>for</em> vai percorrer a lista desde a letra A até chegar no S, aí marcando a cidade desejada.</p>
<p>Se explorarmos um pouco mais nossa intuição veremos que podemos usar algo semelhante ao que fazemos pra pesquisar numa lista telefônica. Abro a lista num ponto e verifico se o nome que eu quero está antes ou depois da página que estou vendo. Por exemplo, estou procurando <strong>Vitória</strong>. Se eu abri na página com nomes próximos de <strong>Teobaldo</strong>, vou procurar mais pra frente da lista, não adianta eu olhar pra trás. Essa é a vantagem da ordem alfabética, afinal. =)</p>
<p>Em termos de algoritmos podemos usar uma busca binária para expressar esse comportamento. Ou ainda, falando em código:</p>
<pre class="javascript"><code><span class="kw2">var</span> esquerda = <span class="nu0">0</span>;
<span class="kw2">var</span> direita = combo.<span class="me1">options</span>.<span class="me1">length</span> - <span class="nu0">1</span>;
<span class="kw2">var</span> meio;
<span class="kw1">while</span><span class="br0">(</span> esquerda &lt;= direita <span class="br0">)</span>
<span class="br0">{</span>
  meio = esquerda + Math.<span class="me1">floor</span><span class="br0">(</span> <span class="br0">(</span> direita - esquerda <span class="br0">)</span> / <span class="nu0">2</span> <span class="br0">)</span>;
  <span class="co1">// Javascript consegue comparar strings usando &lt; e &gt;. Ahá! <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </span>
  <span class="kw1">if</span><span class="br0">(</span> combo.<span class="me1">options</span><span class="br0">[</span>meio<span class="br0">]</span>.<span class="me1">text</span> &lt; cidade <span class="br0">)</span>
  <span class="br0">{</span>
    esquerda = meio + <span class="nu0">1</span>;
  <span class="br0">}</span>
  <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> combo.<span class="me1">options</span><span class="br0">[</span>meio<span class="br0">]</span>.<span class="me1">text</span> &gt; cidade <span class="br0">)</span>
  <span class="br0">{</span>
    direita = meio - <span class="nu0">1</span>;
  <span class="br0">}</span>
  <span class="kw1">else</span>
  <span class="br0">{</span>
    <span class="co1">// é o cara, pode marcar e encerrar a função</span>
    combo.<span class="me1">selectedIndex</span> = meio;
    <span class="kw1">return</span>;
  <span class="br0">}</span>
<span class="br0">}</span></code></pre>
<p>Caso ainda não tenha ficado claro pra você, a busca binária funciona bem melhor para este cenário. Ao invés de percorrer a listagem item a item (linearmente), vamos tomar vantagem da organização alfabética e fazer uma pesquisa mais inteligente. =)</p>
<p>Fiz um arquivo de testes que permite, obviamente, <a onclick="this.target = '_blank';" href="http://blog.klaus.pro.br/wp-content/uploads/2008/10/cidades.html">testar as duas implementações</a> (nota: arquivo pesado &#8211; cuidado com o pé =). Usei a <a href="http://www.jquery.com/">jQuery</a> somente fora dos algoritmos em questão, pra facilitar a manipulação dos eventos.</p>
<p>Como dá pra notar pelo arquivo de testes, a busca binária funciona melhor para a esmagadora maioria dos casos. O que é de se esperar dada a <a href="http://www.cs.sfu.ca/~tamaras/sortAndSearch/Binary_Search_Complexity.html">complexidade O(log n)</a> da busca binária ante a complexidade O(n) da busca linear.</p>
<p>E fica o lembrete, até pra mim mesmo, que tal pesquisar um algoritmo mais eficiente da próxima antes de sair implementando qualquer coisa? <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2008/ler/vai-um-algoritmo-de-busca-binaria-ai/index.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Qual o botão do mouse gerou esse clique?</title>
		<link>http://blog.klaus.pro.br/2008/ler/qual-o-botao-do-mouse-gerou-esse-clique/index.html</link>
		<comments>http://blog.klaus.pro.br/2008/ler/qual-o-botao-do-mouse-gerou-esse-clique/index.html#comments</comments>
		<pubDate>Mon, 04 Aug 2008 19:22:39 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Mouse]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=93</guid>
		<description><![CDATA[São vários os motivos em que pode ser interessante descobrir qual o botão do mouse seu visitante usou para clicar em um elemento. E como muitos já sabem, eventos sofrem bastante com a falta de padronização entre os navegadores. Mas com as popularização das bibliotecas de Javascript, por exemplo jQuery, essa é uma tarefa relativamente [...]]]></description>
			<content:encoded><![CDATA[<p>São vários os motivos em que pode ser interessante descobrir qual o botão do <em>mouse</em> seu visitante usou para clicar em um elemento. E como muitos já sabem, eventos sofrem bastante com a falta de padronização entre os navegadores. Mas com as popularização das bibliotecas de Javascript, por exemplo <a href="http://jquery.com/">jQuery</a>, essa é uma tarefa relativamente fácil.</p>
<p>Seguindo as dicas encontradas no site do PPK, <a href="http://www.quirksmode.org/js/events_properties.html#button">QuirksMode</a>, podemos ver como identificar qual o botão usado pelo visitante. Traduzindo isso em código teríamos algo assim: (com jQuery disponível na página):</p>
<pre class="javascript"><code><span class="kw2">var</span> left_button = <span class="nu0">0</span>;
<span class="kw2">var</span> middle_button = <span class="nu0">1</span>;
<span class="kw2">var</span> right_button = <span class="nu0">2</span>;
<span class="kw1">if</span><span class="br0">(</span> $.<span class="me1">browser</span>.<span class="me1">msie</span> <span class="br0">)</span>
<span class="br0">{</span>
  left_button = <span class="nu0">1</span>;
  middle_button = <span class="nu0">4</span>;
  right_button = <span class="nu0">2</span>;
<span class="br0">}</span>
$<span class="br0">(</span> <span class="st0">"#container"</span> <span class="br0">)</span>.<span class="me1">mouseup</span><span class="br0">(</span>
  <span class="kw2">function</span><span class="br0">(</span> e <span class="br0">)</span>
  <span class="br0">{</span>
    <span class="kw2">var</span> botao = <span class="st0">""</span>;
    <span class="kw1">if</span><span class="br0">(</span> e.<span class="me1">button</span> == middle_button <span class="br0">)</span>
    <span class="br0">{</span>
      botao = <span class="st0">"meio (rodinha)"</span>;
    <span class="br0">}</span>
    <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> e.<span class="me1">button</span> == right_button <span class="br0">)</span>
    <span class="br0">{</span>
      botao = <span class="st0">"direito (contexto)"</span>;
    <span class="br0">}</span>
    <span class="kw1">else</span>
    <span class="br0">{</span>
      botao = <span class="st0">"esquerdo (principal)"</span>;
    <span class="br0">}</span>
    <span class="kw3">alert</span> <span class="br0">(</span> <span class="st0">"botão: "</span> + botao <span class="br0">)</span>;
  <span class="br0">}</span>
<span class="br0">)</span>;</code></pre>
<p>Um fator importante é que se você usar o evento <strong>click</strong>, a informação sobre o botão usado poderá não estar disponível e o código provavelmente não irá funcionar. Por isso é importante usar eventos como <strong>mousedown, mouseup.</strong> Aproveitei e fiz uma contribuição com a <a href="http://docs.jquery.com/Types/Event#which">documentação da jQuery sobre eventos</a> adicionando uma nota sobre o fato acima. =)</p>
<p>Se quiser ver o exemplo acima em uma página funcional, <a href="http://blog.klaus.pro.br/wp-content/uploads/2008/08/qual-o-botao-do-mouse-gerou-esse-clique.html">acesse este exemplo</a>.</p>
<p><strong>Nota</strong>: <del>Ainda não tive tempo de testar o código em diversos navegadores, farei isso assim que possível.</del> Testei no Firefox 3, no Firefox 2, IEs 7 e 6, e Safari 3, todos funcionam. Só no Opera 9.5 que o único botão &#8220;capturável&#8221; parece ser o botão esquerdo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2008/ler/qual-o-botao-do-mouse-gerou-esse-clique/index.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Último dia da oficina de Javascript e Ajax</title>
		<link>http://blog.klaus.pro.br/2008/ler/ultimo-dia-da-oficina-de-javascript-e-ajax/index.html</link>
		<comments>http://blog.klaus.pro.br/2008/ler/ultimo-dia-da-oficina-de-javascript-e-ajax/index.html#comments</comments>
		<pubDate>Thu, 17 Jul 2008 18:47:55 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Cursos]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Senac]]></category>
		<category><![CDATA[Vida Social]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=89</guid>
		<description><![CDATA[A oficina de Ajax que começou no dia 1 deste mês acabou hoje, dia 17. Nestes vários dias de curso/oficina deu pra abordar vários temas, desde os fundamentais para o bom entendimento da linguagem até o uso prático e produtivo do Javascript. Durante esse período mostrei desde a sintaxe base da linguagem, passando por manipulação [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://blog.klaus.pro.br/2008/ler/apresentacao-para-a-oficina-sobre-javascript-e-ajax/index.html">oficina de Ajax</a> que começou no dia 1 deste mês acabou hoje, dia 17. Nestes vários dias de curso/oficina deu pra abordar vários temas, desde os fundamentais para o bom entendimento da linguagem até o uso prático e produtivo do Javascript.</p>
<p>Durante esse período mostrei desde a sintaxe base da linguagem, passando por manipulação de <a href="http://www.w3.org/Style/CSS/">CSS</a> e <a href="http://developer.mozilla.org/en/docs/Category:Gecko_DOM_Reference">DOM</a>, eventos e <em>listeners</em>, até chegar no tão falado Ajax. E no último dia ainda deu tempo de apresentar a ótima biblioteca <a href="http://jquery.com/">jQuery</a> sob o tópico <strong>produtividade</strong>.</p>
<p>Ah, tirei uma foto com o pessoal que participou da oficina:</p>
<dl class="images">
<dt> <a class="thickbox" title="Na foto estão os alunos da oficina e eu, quase no centro, de camisa azul." href="http://blog.klaus.pro.br/wp-content/uploads/2008/07/oficina-de-javascript-ajax-ultimo-dia.jpg"><img src="http://blog.klaus.pro.br/wp-content/uploads/2008/07/oficina-de-javascript-ajax-ultimo-dia-thumb.jpg" alt="" /> </a></dt>
<dd>Na foto estão os alunos da oficina e eu, quase no centro, de camisa azul.</dd>
</dl>
<p>Espero que todos possam ter aprendido pelo menos algo de novo e interessante. Aproveito para agradecer a presença de todos, que se esforçaram pra acordar cedo mesmo durante as férias letivas. Bom, agora deixa eu mostrar a foto para minha mãe&#8230; =)</p>
<p>Gostei de ministrar essas oficinas, e já estou até pensando qual pode ser o tema da oficina de verão, no final do ano? <a href="http://en.wikipedia.org/wiki/LAMP_(software_bundle)">LAMP</a>? <a href="http://rubyonrails.com/">Ruby on Rails</a>? Só o tempo dirá&#8230; <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2008/ler/ultimo-dia-da-oficina-de-javascript-e-ajax/index.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Javascript é com jQuery</title>
		<link>http://blog.klaus.pro.br/2007/ler/javascript-e-com-jquery/index.html</link>
		<comments>http://blog.klaus.pro.br/2007/ler/javascript-e-com-jquery/index.html#comments</comments>
		<pubDate>Wed, 04 Apr 2007 23:05:40 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://wp.blog.klaus.pro.br/2007/ler/javascript-e-com-jquery/index.html</guid>
		<description><![CDATA[Se você programa ou já programou em Javascript sabe que, entre as maiores dores de cabeça na hora de codificar temos: a incompatibilidade entre navegadores distintos ou mesmo um comportamento inesperado naquele navegador de ícone azul. =) Já há algum tempo que eu tenho feito vários códigos usando uma biblioteca leve e poderosa chamada jQuery. [...]]]></description>
			<content:encoded><![CDATA[<p>Se você programa ou já programou em Javascript sabe que, entre as maiores dores de cabeça na hora de codificar temos: a incompatibilidade entre navegadores distintos ou mesmo um comportamento inesperado naquele navegador de ícone azul. =)</p>
<p>Já há algum tempo que eu tenho feito vários códigos usando uma biblioteca leve e poderosa chamada <a href="http://www.jquery.com">jQuery</a>. Ela é uma ferramenta muito versátil, que vai te ajudar a se concentrar mais no que realmente importa: <strong>a lógica para implementar a solução</strong>.</p>
<h3 id="funcionamento" class="subtitles">E como essa jQuery, basicamente, funciona?</h3>
<p>Um dos grandes trunfos, e talvez o principal, é o modo com que você consegue acessar os elementos da sua página. Usando <a href="http://www.w3.org/TR/CSS21/selector.html">seletores CSS</a> e/ou <a href="http://www.w3.org/TR/xpath#location-paths">seleção por XPath</a> você consegue alcançar quaisquer combinações de elementos, ou elementos isolados, em sua página.</p>
<p>Feita a seleção dos elementos, a jQuery vai, digamos, encapsular cada um dos elementos e te dar um leque grande, realmente grande, de <a href="http://www.visualjquery.com/1.1.1.html">métodos diversos</a> extremamente úteis.</p>
<p>Como os métodos estão todos concentrados na jQuery e já possuem os devidos tratamentos para um suporte amplo <em>cross-browser</em>, sua única preocupação será implementar a lógica do código. Muito bom!</p>
<h3 id="selecionando" class="subtitles">Selecionando</h3>
<p>OK, até agora muita teoria e entusiasmo mas nenhum código. Que tal uns exemplos? <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Primeiramente, vamos selecionar todos os elementos &#8220;p&#8221; de nossa página. Não vamos fazer nada com eles, ainda:</p>
<p><code class="javascript">$<span class="br0">(</span> <span class="st0">"p"</span> <span class="br0">)</span>;</code></p>
<p>Só isso! Agora imagine que você gostaria de esconder todos esses elementos &#8220;p&#8221; que selecionamos. Nosso código ficaria:</p>
<p><code class="javascript">$<span class="br0">(</span> <span class="st0">"p"</span> <span class="br0">)</span>.<span class="me1">hide</span><span class="br0">(</span><span class="br0">)</span>;</code></p>
<p>Fácil, não? Porém, suponha que esconder todos os &#8220;p&#8221;&#8216;s não é o que queremos realmente, seria bom esconder apenas os &#8220;p&#8221;&#8216;s de uma &#8220;div#menu&#8221;. Veja:</p>
<p><code class="javascript">$<span class="br0">(</span> <span class="st0">"p"</span>, <span class="st0">"div#menu"</span> <span class="br0">)</span>.<span class="me1">hide</span><span class="br0">(</span><span class="br0">)</span>;</code></p>
<h3 id="markup" class="subtitles">Adicionando e modificando conteúdo na página</h3>
<p>Modificar o conteúdo de um elemento já é, de certa forma, fácil se você usar o <em>innerHTML</em> comum. Mas, como você já deve imaginar, com jQuery é muito mais:</p>
<p><code class="javascript">$<span class="br0">(</span> <span class="st0">"p#exemplo"</span> <span class="br0">)</span>.<span class="me1">html</span><span class="br0">(</span> <span class="st0">"&lt;strong&gt;Novo&lt;/strong&gt; conteúdo!"</span> <span class="br0">)</span>;</code></p>
<p>O pequeno código acima vai acessar um &#8220;p#exemplo&#8221; e alterar seu <em>markup</em> interno por aquele outro, passado como parâmetro à função. Se você quiser apenas saber qual o <em>markup</em> atual do elemento:</p>
<p><code class="javascript">$<span class="br0">(</span> <span class="st0">"p#exemplo"</span> <span class="br0">)</span>.<span class="me1">html</span><span class="br0">(</span><span class="br0">)</span>;</code></p>
<p>E que tal adicionar um novo elemento após nosso &#8220;p&#8221; de exemplo? Veja:</p>
<p><code class="javascript">$<span class="br0">(</span> <span class="st0">"p#exemplo"</span> <span class="br0">)</span>.<span class="me1">after</span><span class="br0">(</span> <span class="st0">"&lt;p&gt;Um elemento depois!&lt;/p&gt;"</span> <span class="br0">)</span>;</code></p>
<p>Ou seja, usando o método intuitivo <em>after</em> conseguimos adicionar elementos <strong>após</strong> o nosso elemento original. Se você está pensando que podemos inserir elementos antes usando o método análogo <em>before</em>:</p>
<p><code class="javascript">$<span class="br0">(</span> <span class="st0">"p#exemplo"</span> <span class="br0">)</span>.<span class="me1">before</span><span class="br0">(</span> <span class="st0">"&lt;p&gt;Um elemento antes!&lt;/p&gt;"</span> <span class="br0">)</span>;</code></p>
<p>Acertou! Simples e intuitivo, não? =)</p>
<h3 id="mais" class="subtitles">E o que mais?</h3>
<p>Acesse a página com uma <a href="http://www.visualjquery.com/1.1.1.html">visão geral dos métodos</a> e veja quantas outras coisas o jQuery ainda pode fazer por você. AJAX, animações, tratamento de eventos, só pra citar algumas delas.</p>
<p>Além disso, a jQuery possui uma boa <a href="http://docs.jquery.com/Main_Page">documentação</a> e uma comunidade ativa, que pode interagir diretamente com a biblioteca através de <em>plugins</em>. Ah sim, você pode adicionar novos comportamentos com <em>plugins</em>. =)</p>
<dl class="references">
<dt>Referências</dt>
<dd> <a href="http://jquery.com/">jQuery</a> </dd>
<dd> <a href="http://15daysofjquery.com/">15 dias de jQuery</a> &#8211; Uma visão geral sobre o poder da jQuery </dd>
<dd> <a href="http://www.w3.org/TR/CSS21/selector.html">Seletores CSS</a> </dd>
<dd> <a href="http://www.w3.org/TR/xpath#location-paths">Seleção por XPath</a> </dd>
<dd> <a href="http://www.visualjquery.com/1.1.1.html">Métodos diversos da jQuery</a> </dd>
<dd> <a href="http://docs.jquery.com/Main_Page">Documentação da jQuery</a> </dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2007/ler/javascript-e-com-jquery/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benchmark simples de processamento com Javascript</title>
		<link>http://blog.klaus.pro.br/2007/ler/benchmark-simples-de-processamento-com-javascript/index.html</link>
		<comments>http://blog.klaus.pro.br/2007/ler/benchmark-simples-de-processamento-com-javascript/index.html#comments</comments>
		<pubDate>Thu, 29 Mar 2007 22:59:02 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Benchmarks]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://wp.blog.klaus.pro.br/2007/ler/benchmark-simples-de-processamento-com-javascript/index.html</guid>
		<description><![CDATA[Quantas vezes você já fez aquele Javascript e, quando testou numa máquina com um processador rápido ele ficou suave e vistoso, já numa máquina com baixo processamento&#8230; melhor nem lembrar, certo? =) Eu mesmo já me deparei várias vezes com esse impasse. Porém, na terça-feira, ao usar alguns efeitos da (excelente) jQuery, eu resolvi que [...]]]></description>
			<content:encoded><![CDATA[<p>Quantas vezes você já fez <em>aquele</em> Javascript e, quando testou numa máquina com um processador rápido ele ficou suave e vistoso, já numa máquina com baixo processamento&#8230; melhor nem lembrar, certo? =)</p>
<p>Eu mesmo já me deparei várias vezes com esse impasse. Porém, na terça-feira, ao usar alguns efeitos da (excelente) <a href="http://www.jquery.com/">jQuery</a>, eu resolvi que iria, de alguma forma, usar os efeitos somente quando o resultado fosse agradável visualmente.</p>
<h3 id="benchmark" class="subtitles">O benchmark usado</h3>
<p>Os <a href="#detalhes">detalhes</a>, <a href="#pros">prós</a> e <a href="#contras">contras</a> do método estão listados mais abaixo. Inicialmente vou apenas demonstrar qual foi a idéia que implementei.</p>
<p>Minha idéia partiu de uma premissa simples: &#8220;<cite>Vou fazer um laço de <strong>n</strong> iterações e contar quando tempo este laço vai levar. Por esse tempo eu consigo presumir, mesmo que sem grande precisão, qual o poder de processamento da máquina.&#8221;</cite>.</p>
<p><strong>Calma</strong>! Sim, sim&#8230; a idéia de contar a duração deste laço é afetada por uma série de fatores extras, além da velocidade do processador. Mas como eu já disse, vou tratar disso logo mais.</p>
<p>Veja o código final que usei: (adaptado para exemplo)</p>
<p><code class="javascript"><span class="kw2">var</span> x = <span class="kw2">new</span> Date<span class="br0">(</span><span class="br0">)</span>;<br />
i = <span class="nu0">0</span>;<br />
<span class="kw1">while</span><span class="br0">(</span> i &lt; <span class="nu0">50000</span> <span class="br0">)</span><br />
<span class="br0">{</span><br />
i++;<br />
<span class="br0">}</span><br />
<span class="kw2">var</span> y = <span class="kw2">new</span> Date<span class="br0">(</span><span class="br0">)</span>;<br />
<span class="kw1">if</span><span class="br0">(</span> <span class="br0">(</span> y - x <span class="br0">)</span> &lt; <span class="nu0">70</span> <span class="br0">)</span><br />
<span class="br0">{</span><br />
set_cookie<span class="br0">(</span> <span class="st0">"has-effects"</span>, <span class="st0">"yes"</span> <span class="br0">)</span>;<br />
<span class="br0">}</span><br />
<span class="kw1">else</span><br />
<span class="br0">{</span><br />
set_cookie<span class="br0">(</span> <span class="st0">"has-effects"</span>, <span class="st0">"none"</span> <span class="br0">)</span>;<br />
<span class="br0">}</span></code></p>
<p>Como você pode notar, o código é ridiculamente simples. Usei 50000 iterações numa página completa, não numa página de testes com apenas o código dentro e obtive resultados como (tempo em milissegundos):</p>
<ul class="lists">
<li> Pentium 4 2.8, 1GB de RAM &#8211; Xubuntu e Firefox 2.0.0.3: <strong>40</strong> (esse é meu Firefox de trabalho, cheio de <em>tabs</em> e <em>extensions</em>&#8230;)</li>
<li> Pentium 4 2.8, 1GB de RAM &#8211; Xubuntu e IE6: <strong>25</strong></li>
<li> Pentium III 551, 384MB de RAM &#8211; Windows XP e Firefox 2.0.0.3: <strong>140</strong></li>
<li> Pentium III 551, 384MB de RAM &#8211; Windows XP e IE7: <strong>100</strong></li>
<li> Pentium III 551, 384MB de RAM &#8211; Windows XP e IE6 (standalone): <strong>90</strong></li>
<li> Mac PowerPC 1.25, 512MB de RAM &#8211; Mac OS X e Safari 2.0.4: <strong>100</strong></li>
<li> Mac PowerPC 1.25, 512MB de RAM &#8211; Mac OS X e Firefox 2.0.0.3: <strong>100</strong></li>
</ul>
<p>Se você olhar meu código anterior, eu defino como aptas a executarem os efeitos apenas máquinas cujo resultado foi inferior a 70. Na sequência, <a href="http://www.quirksmode.org/js/cookies.html">gravo um <em>cookie</em></a> para não repetir o teste a cada página visitada, apenas uma vez por sessão.</p>
<p>O código completo, inclusive com o devido controle por <em>cookies</em>, ficou:</p>
<p><code class="javascript"><span class="kw2">var</span> has_effects = <span class="kw2">false</span>;<br />
<span class="kw1">if</span><span class="br0">(</span> document.<span class="me1">cookie</span>.<span class="me1">indexOf</span><span class="br0">(</span> <span class="st0">"has-effects"</span> <span class="br0">)</span> != <span class="nu0">-1</span> <span class="br0">)</span><br />
<span class="br0">{</span><br />
<span class="kw1">if</span><span class="br0">(</span> document.<span class="me1">cookie</span>.<span class="me1">indexOf</span><span class="br0">(</span> <span class="st0">"has-effects=yes"</span> <span class="br0">)</span> != <span class="nu0">-1</span> <span class="br0">)</span><br />
<span class="br0">{</span><br />
has_effects = <span class="kw2">true</span>;<br />
<span class="br0">}</span><br />
<span class="br0">}</span><br />
<span class="kw1">else</span><br />
<span class="br0">{</span><br />
<span class="kw2">var</span> x = <span class="kw2">new</span> Date<span class="br0">(</span><span class="br0">)</span>;<br />
i = <span class="nu0">0</span>;<br />
<span class="kw1">while</span><span class="br0">(</span> i &lt; <span class="nu0">50000</span> <span class="br0">)</span><br />
<span class="br0">{</span><br />
i++;<br />
<span class="br0">}</span><br />
<span class="kw2">var</span> y = <span class="kw2">new</span> Date<span class="br0">(</span><span class="br0">)</span>;<br />
<span class="kw1">if</span><span class="br0">(</span> <span class="br0">(</span> y - x <span class="br0">)</span> &lt; <span class="nu0">70</span> <span class="br0">)</span><br />
<span class="br0">{</span><br />
set_cookie<span class="br0">(</span> <span class="st0">"has-effects"</span>, <span class="st0">"yes"</span> <span class="br0">)</span>;<br />
has_effects = <span class="kw2">true</span>;<br />
<span class="br0">}</span><br />
<span class="kw1">else</span><br />
<span class="br0">{</span><br />
set_cookie<span class="br0">(</span> <span class="st0">"has-effects"</span>, <span class="st0">"none"</span> <span class="br0">)</span>;<br />
<span class="br0">}</span><br />
<span class="br0">}</span></code></p>
<p>Se você reparar, eu crio uma variável global <var>has_effects</var> para usar posteriormente em meu código.</p>
<h3 id="detalhes" class="subtitles">Detalhes</h3>
<p>Como eu já havia dito acima, obviamente este teste não mede com precisão o real poder de processamento de uma máquina. Existem uma série de fatores que influeciam, tanto positivamente como negativamente, no resultado da duração do laço.</p>
<p>Uma máquina completamente ociosa ou com vários processos rodando em <em>background</em> são exemplos destes dois casos, respectivamente.</p>
<h3 id="pros" class="subtitles">Prós</h3>
<p>Efeitos de animação são legais, mas só são realmente legais quando eles funcionam adequadamente. Com essa simples detecção você pode esconder um elemento qualquer da página, com um efeito de <em>fade-out</em> num computador supostamente rápido ou, escondendê-lo de uma vez só no caso de uma máquina com processamento lento.</p>
<h3 id="contras" class="subtitles">Contras</h3>
<p>O ponto contra deste <em>benchmark</em> é que ele leva em conta a velocidade de processamento em apenas um dado momento. Isto significa que se no momento da abertura da página seu processador estava bastante ocupado, o código irá assumir que seu processador não tem poder suficiente para fazer animações dali então. O que pode ser verdade, ou não. =)</p>
<h3 id="mais-testes" class="subtitles">Mais testes e sugestões</h3>
<p>Se você tem sugestões ou usou o código em algum cenário diferente dos listados acima, deixe seu comentário! Um bom <em>benchmark</em> é também um conjunto de bons testes! <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<dl class="references">
<dt>Referências</dt>
<dd> <a href="http://www.jquery.com/">jQuery</a> </dd>
<dd> <a href="http://en.wikipedia.org/wiki/Benchmark_%28computing%29">O que é <em>benchmark</em>?</a> </dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2007/ler/benchmark-simples-de-processamento-com-javascript/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
