<?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"
	>

<channel>
	<title>Adriano Frazão</title>
	<atom:link href="http://www.adrianofrazao.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.adrianofrazao.com</link>
	<description>blog</description>
	<pubDate>Thu, 24 Apr 2008 13:17:36 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Os 10 Princípios de Design do Google</title>
		<link>http://www.adrianofrazao.com/2008/04/24/os-10-principios-de-design-do-google/</link>
		<comments>http://www.adrianofrazao.com/2008/04/24/os-10-principios-de-design-do-google/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 13:17:36 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Fotografia]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/?p=32</guid>
		<description><![CDATA[Na sua busca por organizar a internet o grupo responsável pelo Google User Experience criou uma lista com 10 regras de design a serem seguidas.
1. Foco nas pessoas - sua vida, seu trabalho, seus sonhos.
2. Todo milisegundo conta.
3. Simplicidade é poderosa.
4. Envolva os novatos e atraia especialistas.
5. Ousar para inovar.
6. Desenhe para o mundo.
7. Planeje [...]]]></description>
			<content:encoded><![CDATA[<p>Na sua busca por organizar a internet o grupo responsável pelo Google User Experience criou uma lista com <a href="http://www.google.com/corporate/ux.html">10 regras de design</a> a serem seguidas.</p>
<p>1. Foco nas pessoas - sua vida, seu trabalho, seus sonhos.<br />
2. Todo milisegundo conta.<br />
3. Simplicidade é poderosa.<br />
4. Envolva os novatos e atraia especialistas.<br />
5. Ousar para inovar.<br />
6. Desenhe para o mundo.<br />
7. Planeje para os atuais e futuros negócios.<br />
8. Delicie os olhos sem distrair a mente.<br />
9. Ser digno de confiança das pessoas.<br />
10. Adicione um toque humano.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2008/04/24/os-10-principios-de-design-do-google/feed/</wfw:commentRss>
		</item>
		<item>
		<title>jQuery - por onde começar</title>
		<link>http://www.adrianofrazao.com/2007/06/22/jquery-por-onde-comecar/</link>
		<comments>http://www.adrianofrazao.com/2007/06/22/jquery-por-onde-comecar/#comments</comments>
		<pubDate>Fri, 22 Jun 2007 14:58:55 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Fotografia]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2007/06/22/jquery-por-onde-comecar/</guid>
		<description><![CDATA[Este guia é uma introdução à biblioteca jQuery. Ter um conhecimento sobre javascript e modelo de objeto de documento (DOM) são requisitos necessários. Ele começa do básico e tenta explicar os detalhes quando necessário. Ele abordará um exemplo simples alô mundo, seletores e eventos básicos, AJAX, efeitos e o desenvolvimento de plugins.

Conteúdo

Configuração
Olá jQuery
Me encontre: Usando [...]]]></description>
			<content:encoded><![CDATA[<p>Este guia é uma introdução à biblioteca jQuery. Ter um conhecimento sobre javascript e modelo de objeto de documento (DOM) são requisitos necessários. Ele começa do básico e tenta explicar os detalhes quando necessário. Ele abordará um exemplo simples alô mundo, seletores e eventos básicos, AJAX, efeitos e o desenvolvimento de plugins.</p>
<p><span id="more-27"></span></p>
<h2>Conteúdo</h2>
<ol>
<li><a href="#setup">Configuração</a></li>
<li><a href="#hello">Olá jQuery</a></li>
<li><a href="#find">Me encontre: Usando seletores e eventos</a></li>
<li><a href="#rate">Me avalie: Usando AJAX</a></li>
<li><a href="#animate">Me anime: Usando Efeitos</a></li>
<li><a href="#sort">Me ordene: Usando o plugin <em>tablesorter</em> (ordenador de tabela) </a></li>
<li><a href="#plug">Me plugue: Escrevendo seus próprios plugins</a></li>
<li><a href="#next">Próximos passos</a></li>
</ol>
<div>
<h2 id="setup">Configuração</h2>
<p class="inplace1" id="edit1">Para começar, nós precisamos de uma cópia da bliblioteca jQuery. Ainda que a versão mais recente possa ser encontrada <a href="http://jquery.com/src/">aqui</a>, este guia fornece um pacote básico que você poderá baixar.</p>
<p><a class="download" href="http://docs.jquery.com/images/c/c7/Jquery-starterkit.zip">Kit para começar com o jQuery</a></p>
<p class="instruction">Faça o download deste arquivo e extraia o seu conteúdo. Abra o starterkit.html e o custom.js com o seu editor preferido e o starterkit.html com o navegador.</p>
<p>Agora nós temos tudo o que precisamos para inciar o notório exemplo do &#8220;Alô mundo&#8221;.</p>
<h4>Links interessantes para este capítulo:</h4>
<ul>
<li><a href="http://docs.jquery.com/images/c/c7/Jquery-starterkit.zip">Kit para começar</a></li>
<li><a href="http://jquery.com/src/">Downloads do jQuery</a></li>
</ul>
</div>
<div>
<h2 id="hello">Olá jQuery</h2>
<p>Como quase tudo o que fazemos quando estamos utilizando o jQuery lê ou manipula um modelo de objeto de documento (DOM), precisamos nos certificar que começamos adicionado eventos etc tão logo o DOM esteja pronto.</p>
<p>Para fazer isso, nós registramos o evento <em>ready (pronto)</em>  para o documento.</p>
<pre>$(document).ready(function() {
	// faça alguma coisa quando o DOM estiver pronto
});</pre>
<p>Colocar um <em>alert</em> nesta função não faz muito sentido, pois o <em>alert</em> não requer que o DOM esteja carregado. Então vamos tentar algo mais sofisticado: Mostrar um <em>alert</em> quando clicarmos o link.</p>
<pre>$(document).ready(function() {
	$("a").click(function() {
		alert("Olá mundo!");
	});
});</pre>
<p>Dessa forma o <em>alert</em> será exibido assim que você clicar no link.</p>
<p>Vamos dar uma olhada no que estamos fazendo: <code>$("a")</code> é um seletor do jQuery, neste caso, ele seleciona todos os elementos a. O <code>$</code> por si só é um <em>alias</em> para a &#8220;classe&#8221; jQuery, por outro lado o <code>$()</code> constrói um novo objeto jQuery. A função <code>click()</code> que chamamos depois é um método do objeto jQuery. Ele liga o evento clique a todos os elementos selecionados (neste caso, um único elemento a) e executa a função fornecida quando o evento ocorre.<br />
	Isto é similar ao seguinte código:</p>
<pre>&lt;a href="#" onclick="alert('Olá mundo')"&gt;Link&lt;/a&gt;</pre>
<p>A diferença é bem óbvia: Nós não precisamos escrever onclick para todo elemento. Nós temos uma separação clara de estrutura (HTML) e comportamento (JS), assim como separamos estrutura e formatação utilizando CSS.</p>
<p>Com isso em mente, exploramos seletores e eventos um pouco mais a fundo.</p>
<h4>Links interessantes para este capítulo:</h4>
<ul>
<li><a href="http://jquery.com/docs/Base/">Base do jQuery</a></li>
<li><a href="http://jquery.com/docs/Base/Expression/">Expressões do jQuery </a></li>
<li><a href="http://jquery.com/docs/Base/Events/">Eventos Básicos do jQuery</a></li>
</ul>
</div>
<div>
<h2 id="find">Me encontre: Usando seletores e eventos</h2>
<p>O jQuery provê duas maneiras de selecionar elementos. A primeira utiliza uma combinação de seletores CSS e XPath<br />
	passados como uma string para o construtor do jQuery (ex. <code>$("div &gt; ul a")</code>). A segunda utiliza vários métodos do objeto jQuery. Ambas podem ser combinadas.</p>
<p>Para testar alguns desses seletores, vamos selecionar e modificar a primeira lista ordenada no nosso kit para começar.</p>
<p>Primeiramente queremos selecionar a própria lista. A lista tem um ID &#8220;listaOrdenada&#8221;. No javascript clássico, você pode selecioná-la usando <code>document.getElementById("listaOrdenada")</code>.<br />
	Com o jQuery, nós fazemos isso assim:</p>
<pre>$(document).ready(function() {
	$("#listaOrdenada").addClass("vermelho");
});</pre>
<p>O kit para começar fornece uma folha de estilos com a classe &#8220;vermelho&#8221; que simplesmente adiciona um fundo vermelho.<br />
	No entanto, quando você recarrega a página no seu navegador, você verá que a primeira lista tem o fundo vermelho. A segunda lista permanece inalterada.</p>
<p>Agora vamos adicionar mais classes para os elementos filhos desta lista.</p>
<pre>$(document).ready(function() {
	$("#listaOrdenada &gt; li").addClass("azul");
});</pre>
<p>Isto seleciona todos os <code>li</code>s filhos do elemento com id listaOrdenada e adiciona a classe &#8220;azul&#8221;.</p>
<p>Agora alguma coisa mais sofisticada: Nós queremos adicionar e remover a classe quando o usuário passar o mouse sobre o elemento li, mas somente no último elemento da lista.</p>
<pre>$(document).ready(function() {
	$("#listaOrdenada li:last").hover(function() {
		$(this).addClass("verde");
	}, function() {
		$(this).removeClass("verde");
	});
});</pre>
<p>Existem diversos outros seletores similires à sintaxe <a class="doc" href="http://jquery.com/docs/Base/Expression/CSS/" title="Documentation for CSS selectors">CSS</a> e <a class="doc" href="http://jquery.com/docs/Base/Expression/XPath/" title="Documentation for XPath selectors">XPath</a>.<br />
	Mais exemplos e a lista de todas as expressões disponíveis podem ser encontrados <a class="doc" href="http://jquery.com/docs/Base/Expression/" title="Documentation for base selectors">aqui</a>.</p>
<p>Para todo evento <em>onxxx</em> disponível, como onclick, onchange, onsubmit, existem um equivalente no jQuery. <a class="doc" href="http://jquery.com/docs/EventModule/" title="Documentation for advanced events">Alguns outros eventos</a>, como ready e hover, são métodos convenientes para algumas tarefas.</p>
<p>Você pode encontrar uma lista completa com todos os eventos suportados no <a href="http://visualjquery.com/">Visual<br />
	jQuery</a>, na seção de <em>Events</em>.</p>
<p>Com estes seletores e eventos você já pode fazer muita coisa, mas tem muito mais.</p>
<pre>$(document).ready(function() {
        $("#listaOrdenada").find("li").each(function(i) {
            $(this).html( $(this).html() + " BAM! " + i );
        });
    });</pre>
<p>O <code>find()</code> permite que você faça uma pesquisa mais a fundo nos descendentes dos elementos já selecionados, apesar de <code>$("#listaOrdenada).find("li")</code> ser praticamente o mesmo que  <code>$("#listaOrdenada<br />
	li")</code>. O <code>each()</code> faz a iteração sobre cada elemento e permite um processamento mais profundo. A maioria dos métodos, como o <code>addClass()</code>, utiliza o <code>each()</code> internamente. Neste exemplo, o <code>html()</code> é utilizado para recuperar o texto de cada elemento li, adicionar algum texto a ele e definí-lo como o texto do elemento.</p>
<p>Uma outra tarefa que você frequentemente terá que lidar é chamar métodos em elementos DOM que não são suportados pelo jQuery. Pense em um formulário que você gostaria de resetar depois que enviou com sucesso via AJAX.</p>
<pre>$(document).ready(function() {
	// use isto para resetar um único formulário
	$("#reset").click(function() {
		$("#form")[0].reset();
	});
});</pre>
<p>Este código seleciona o elemento com o ID &#8220;form&#8221; e chama o <code>reset()</code> no primeiro elemento selecionado. Caso exista mais de um form, você pode fazer dessa maneira:</p>
<pre>$(document).ready(function() {
	// use isto para resetar todos os formulários de uma só vez
	$("#reset").click(function() {
		$("form").each(function() {
			this.reset();
		});
	});
});</pre>
<p>Isto deve selecionar todos os formulários no seu documento, fazer a iteração sobre eles e chamar o <code>reset()</code> para cada um.</p>
<p>Outro problema que você pode encontrar é não selecionar alguns elementos. O jQuery provê o <code>filter()</code><br />
	e o <code>not()</code> para isto. Enquanto o <code>filter()</code> reduz a seleção para os elementos que atendem à expressão de filtro, o <code>not()</code> faz exatamente o contrário, removendo todos os elementos que atendem a expressão. Imagine uma lista desordenada onde você quer selecionar todos os elementos li que não possuam um filho ul.</p>
<pre>$(document).ready(function() {
	$("li").not("[ul]").css("border", "1px solid black");
});</pre>
<p>Isto seleciona todos os elementos li e remove todos os elementos da seleção que possuam um elemento ul como filho. Sendo assim todos os elementos li ficarão com uma borda, com exceção daqueles que possuam um filho ul. A sintaxe <code>[expressão]</code> é vinda do XPath e pode ser utilizada para filtrar elementos e atributos filhos. Talvez você queira selecionar todas as âncoras que possuam o attributo name:</p>
<pre>$(document).ready(function() {
	$("a[@name]").background("#eee");
});</pre>
<p>Isto adiciona uma cor de fundo para todos os elementos âncora com o atributo name.</p>
<p>Mais comum que selecionar as âncoras pelo nome, você pode precisar selecionar as âncoras pelo atributo &#8220;href&#8221;. Isto pode ser um problema uma vez que os navegadores se comportam inconsistentemente quando retornam o que eles pensam que o valor do &#8220;href&#8221; é. Para selecionar apenas uma parte do value, podemos utilizar o seletor contém &#8220;*=&#8221; ao invés do igual (&#8221;=&#8221;):</p>
<pre>$(document).ready(function() {
	$("a[@href*=/content/gallery]").click(function() {
		// faça alguma coisa com todos os links que apontam para algum lugar em /content/gallery
	});
});</pre>
<p>Até agora, usamos todos os seletores para selecionar os filhos ou filtrar a seleção atual. Existem situações onde você irá precisar selecionar os anteriores ou próximos elementos, conhecidos como <em>siblings</em> (filhos do mesmo pai). Pense em uma página de um FAQ, onde todas as respostas estão escondidas em um primeiro momento e são exibidas quando a questão é clicada. O código do jQuery para isso:</p>
<pre>$(document).ready(function() {
	$('#faq').find('dd').hide().end().find('dt').click(function() {
         var resposta = $(this).next();
         if (resposta.is(':visible')) {
             resposta.slideUp();
         } else {
             resposta.slideDown();
         }
     });
});</pre>
<p>Aqui estamos usando um pouco de encadeamento para reduzir o tamanho do código e ganhar performance, uma vez que &#8216;#faq&#8217; é selecionada apenas uma única vez. Usando o <code>end()</code>, o primeiro <code>find()</code> é desfeito, assim podemos começar a procurar com o próximo <code>find()</code> no nosso elemento #faq, ao invés de procurar no filho dd.</p>
<p>Com o acionamento do evento click, a função passada ao método <code>click()</code>, utilizamos $(this).next() para encontrar o próximo <em>sibling</em> a partir do dt atual. Isto nos permite selecionar rapidamente a resposta seguinte à questão clicada.</p>
<p>Além dos <em>siblings</em>, você também pode selecionar os elementos pais (também conhecidos como ancestrais para os mais familiarizados com o XPath). Talvez você pode querer realçar o parágrafo que é o pai do link que o usuário passar o mouse. Tente isso:</p>
<pre>$(document).ready(function() {
        $("a").hover(function() {
            $(this).parents("p").addClass("realcar");
        }, function() {
            $(this).parents("p").removeClass("realcar");
        });
    });</pre>
<p>Para todos os elementos âncoras que o usuário passar o mouse, o parágrafo pai é procurado e a classe &#8220;realcar&#8221; é adicionada e removida.</p>
<p>Vamos voltar um passo atrás de continuarmos: o jQuery faz com que o código fique menor e tornando-o mais fácil de ler e dar manutenção. O código seguinte é um atalho para a notação $(document).ready(callback):</p>
<pre>$(function() {
	// código a ser executado quando DOM está pronto
});</pre>
<p>Aplicado ao exemplo do Alô Mundo!, ficaria assim:</p>
<pre>$(function() {
	$("a").click(function() {
		alert("Alô Mundo!");
	});
});</pre>
<p>Agora com o básico em mãos, queremos explorar outros aspectos, começando com o AJAX.</p>
<h4>Links interessantes para este capítulo:</h4>
<ul>
<li><a href="http://jquery.com/api/">Documentação da API do jQuery</a></li>
<li><a href="http://visualjquery.com/">Visual jQuery - Uma documentação categorizada e navegável da API do jQuery</a></li>
<li><a href="http://jquery.com/docs/Base/Expression/CSS/">Expressões do jQuery: CSS</a></li>
<li><a href="http://jquery.com/docs/Base/Expression/XPath/">Expressões do jQuery: XPath</a></li>
<li><a href="http://jquery.com/docs/Base/Expression/Custom/">Expressões do jQuery: Customizadas</a></li>
<li><a href="http://jquery.com/docs/EventModule/">Eventos especiais no jQuery</a></li>
<li><a href="http://jquery.com/docs/Base/Traverse/">jQuery DOM Traversing</a></li>
</ul>
</div>
<div>
<h2 id="rate">Me avalie: Usando AJAX</h2>
<p>Nesta parte nós escreveremos uma pequena aplicação AJAX que permite que o usuário avalie alguma coisa, assim como é feito no youtube.com.</p>
<p>Precisamos de um pouco de código do servidor para isso. Meu exemplo utiliza um arquivo php que lê o parâmetro &#8220;avaliacao&#8221; e retorna o número de avaliações e a média de avaliação. Dê uma olhada no <a href="http://jquery.bassistance.de/rate.phps">rate.php</a> para o código server-side.</p>
<p>Nós não queremos que este exemplo funcione sem AJAX, mesmo que isto seja possível, então nós geramos a marcação necessária com o jQuery e a adicionamos à div com o ID &#8220;avaliacao&#8221;.</p>
<pre>$(document).ready(function() {
	// gera a marcação
	var ratingMarkup = ["Por favor avalie: "];
	for(var i=1; i &lt;= 5; i++) {
		ratingMarkup[ratingMarkup.length] = "&lt;a href='#'&gt;" + i + "&lt;/a&gt;&nbsp;";
	}
	// adiciona a marcação ao container e aplica o acionador de click às âncoras
	$("#avaliacao").append( ratingMarkup.join('') ).container.find("a").click(function(e) {
		e.preventDefault();
		// envia a requisição
		$.post("rate.php", {avaliacao: $(this).html()}, function(xml) {
			// formata o resultado
			var resultado = [
				"Obrigado por avaliar, média atual: ",
				$("media", xml).text(),
				", número de votos: ",
				$("contador", xml).text()
			];
			// saída do resultado
			$("#avaliacao").html(resultado.join(''));
		} );
	});
});</pre>
<p>Este pedaço de código gera cinco elementos âncoras adicionando-os ao elemento container com o id &#8220;avaliacao&#8221;. Depois disso, para cada âncora no container, um observador do click é adicionado. Quando a âncora é clicada, uma requisição post é enviada para o rate.php com o conteúdo da âncora como parâmetro. O resultado retornado como um XML é então adicionado ao container, substituindo as âncoras.</p>
<p>Se você não possui um servidor web com o PHP instalado em mãos, você pode dar uma olhada no <a href="http://jquery.bassistance.de/example-rateme.html">exemplo on-line</a>.</p>
<p>Para ver um exemplo muito bom de um sistema de avaliação que funciona até  mesmo sem javascript, visite <a href="http://www.softonic.de/ie/51494">softonic.de</a> e clique em &#8220;Kurz bewerten!&#8221;</p>
<p>Mais documentação sobre os métodos AJAX do jQuery pode ser encontrada <a class="doc" href="http://jquery.com/docs/AJAXModule/" title="Documentação para os métodos AJAX">aqui</a> ou no <a href="http://visualjquery.com/">Visual jQuery</a> na categoria AJAX.</p>
<p>Um problema muito comum encontrado quando se carrega um conteúdo por AJAX é o seguinte: Quando se adiciona controladores de evento ao seu documento que deveriam ser aplicados também ao conteúdo carregado, você deve aplicar estes controladores depois que o conteúdo é carregado. Para prevenir a código duplicado, você pode delegar a uma função. Exemplo:</p>
<pre>// Vamos usar o atalho
$(function() {
	var addClickHandlers = function() {
		$("a.cliqueParaCarregarConteudo").click(function() {
			$("#target").load(this.href, addClickHandlers);
		});
	};
	addClickHandlers();
});</pre>
<p>Agora a função addClickHandlers é aplicada uma vez quando o DOM está pronto e depois toda vez que o usuário clicar um link com a classe <code>cliqueParaCarregarConteudo</code> e o conteúdo tiver terminado de ser carregado.</p>
<p>Por favor observe que a função &#8220;addClickHandlers&#8221; é definida como uma variável local, ao invés de uma função global (como <code>function addClickHandlers() {...}</code>). Procure seguir esta prática para prevenir conflito com outras variáveis ou funções globais.</p>
<p>Com AJAX podemos explorar muita coisa &#8220;Web 2.0&#8243;. Mas até agora estamos devendo efeitos bacanas.</p>
<h4>Links interessantes para este capítulo:</h4>
<ul>
<li><a href="http://jquery.com/docs/AJAXModule/">Módulo AJAX do jQuery</a></li>
<li><a href="http://jquery.com/api/">API do jQuery: Contém descrição e exemplos para adicionar e todos os outros métodos do jQuery</a></li>
<li><a href="http://jquery.com/demo/thickbox/">ThickBox: Um plugin para o jQuery que o utiliza para aprimorar o famoso lightbox</a></li>
</ul>
</div>
<div>
<h2 id="animate">Me anime: Usando Efeitos</h2>
<p>Animações simples com o jQuery podem ser feitas com o <code>show()</code> e o <code>hide()</code></p>
<pre>$(document).ready(function() {
	$("a").toggle(function() {
		$(".algumacoisa").hide('slow');
	}, function() {
		$(".algumacoisa").show('fast');
	});
});</pre>
<p>Você pode criar qualquer combinação das animações com o <code>animate()</code> como por exemplo um <em>slide</em> com fade:</p>
<pre>$(document).ready(function() {
	$("a").toggle(function() {
		$(".algumacoisa").animate({
			height: 'hide',
			opacity: 'hide'
		}, 'slow');
	}, function() {
		$(".algumacoisa").animate({
			height: 'show',
			opacity: 'show'
		}, 'slow');
	});
});</pre>
<p>Efeitos muito mais sofisticados podem ser feitos com a <a href="http://interface.eyecon.ro/">coleção de plugins Interface</a>. No site você encontrará demonstrações e a documentação.</p>
<p>Além da coleção Interface, que está no topo da lista de plugins do jQuery, existem muitos outros. O próximo capítulo lhe mostrará como usar o plugin <em>tablesorter</em>.</p>
<h4>Links interessantes para este capítulo:</h4>
<ul>
<li><a href="http://jquery.com/docs/FxModule/">Módulo de efeitos do jQuery</a></li>
<li><a href="http://interface.eyecon.ro/">Plugin Interface</a></li>
</ul>
</div>
<div>
<h2 id="sort">Me ordene: Usando o plugin tablesorter</h2>
<p>O plugin tablesorter permite que você ordene as tabelas no lado do cliente. Você inclui o jQuery e o pluguin e informa ao pluguin quais tabelas deseja ordernar.</p>
<p>Para experimentar este exemplo, adicione esta linha ao starterkit.html (abaixo da inclusão do jquery):</p>
<pre>&lt;script src="lib/jquery.tablesorter.js" type="text/javascript"&gt;&lt;/script&gt;</pre>
<p>Depois de incluir o plugin, você poderá chamá-lo assim:</p>
<pre>$(document).ready(function() {
	$("#large").tableSorter();
});</pre>
<p>Tente clicar nos cabeçalhos da tabela e veja se ela fica ordenada em ordem ascendente no primeiro clique e descendente no segundo.</p>
<p>A tabela deve utilizar algum realce nas linhas, podemos adicioná-los passando algumas opções:</p>
<pre>$(document).ready(function() {
	$("#large").tableSorter({
		stripingRowClass: ['odd','even'],	// Nome da classe a ser utilizada para a divisão das linhas como um array.
		stripRowsOnStartUp: true		// Divide as linhas quando o tableSorter iniciar.
	});
});</pre>
<p>Existem mais exemplos e documentação sobre as opções disponíveis no <a href="http://motherrussia.polyester.se/jquery-plugins/tablesorter/">site do tablesorter</a>.</p>
<p>A maioria dos plugins podem ser utilizados como este: Inclua o arquivo do pluguin e chame o método do plugin em alguns elementos, passando os parâmetros opcionais para customizar o plugin.</p>
<p>Uma lista atualizada dos plugins disponíveis pode ser encontrada <a href="http://jquery.com/plugins/" title="Plugins for jQuery">no site do jQuery</a>.</p>
<p>Quando você utilizar o jQuery com mais frequência, você perceberá que será melhor empacotar o seu próprio código como um plugin, seja para o reuso para você mesmo ou para a sua empresa, ou para compartilhá-lo com a comunidade. O próximo capítulo dá algumas dicas sobre como estruturar um plugin.</p>
<h4>Links interessantes para este capítulo:</h4>
<ul>
<li><a href="http://jquery.com/plugins/">Plugins para o jQuery</a></li>
<li><a href="http://motherrussia.polyester.se/jquery-plugins/tablesorter/">Tablesorter Plugin</a></li>
</ul>
</div>
<div>
<h2 id="plug">Me plugue: Escrevendo seus próprios plugins</h2>
<p>Escrever seus próprios plugins para o jQuery é muito fácil. Se você seguir as regras abaixo, será fácil para outros integrarem o seu plugin também.</p>
<ol>
<li>Encontre um nome para o seu plugin, vamos chamar o nosso exemplo  &#8220;foobar&#8221;.</li>
<li>Crie um arquivo chamado jquery.[nomedoseuplugin].js, ex. jquery.foobar.js</li>
<li>Crie um ou mais métodos no plugin extendendo o objeto jQuery, ex.:
<pre>jQuery.fn.foobar = function() {
	// faça alguma coisa
};</pre>
</li>
<li>Opcional: Crie um objeto com funções de ajuda, ex.:
<pre>jQuery.fooBar = {
	height: 5,
	calculateBar = function() { ... },
	checkDependencies = function() { ... }
};</pre>
<p>Você poderá então chamar essa função de ajuda pelo seu plugin:</p>
<pre>jQuery.fn.foobar = function() {
	// faça alguma coisa
	jQuery.foobar.checkDependencies(value);
	// faça alguma outra coisa
};</pre>
</li>
<li>Opcional: Crie configurações padrões que possam ser alteradas pelo usuário, ex.:
<pre>jQuery.fn.foobar = function(options) {
	var settings = {
		value: 5,
		name: "pete",
		bar: 655
	};
	if(options) {
		jQuery.extend(settings, options);
	}
};</pre>
<p>Você pode então chamar o plugin sem opções, usando as configurações padrões:</p>
<pre>$("...").foobar();</pre>
<p>Ou com algumas opções:</p>
<pre>$("...").foobar({
	value: 123,
	bar: 9
});</pre>
</li>
</ol>
<p>Se você lançar o seu plugin, você deverá prover alguns exemplos e uma documentação. Existem diversos plugins disponíveis como ótimas referências.</p>
<p>Agora você já deve ter uma idéia básica de como escrever um plugin. Vamos utilizar este conhecimento e escrever nosso próprio plugin.</p>
<p>Uma coisa que muita gente, tentando manipular formulários com o jQuery, pede, é marcar e desmarcar radio buttons ou checkboxes. Eles acabam com um código como este:</p>
<pre>$("input[@type='checkbox']").each(function() {
	this.checked = true;
	// ou, para desmarcar
	this.checked = false;
	// ou, para inverter
	this.checked = !this.checked;
});</pre>
<p>Sempre que você possuir um <em>each</em> no seu código, você pode querer reescrever isto com um plugin, quase sem alterações:</p>
<pre>$.fn.check = function() {
	return this.each(function() {
		this.checked = true;
	});
};</pre>
<p>Este plugin agora pode ser utilizado:</p>
<pre>$("input[@type='checkbox']").check();</pre>
<p>Agova você pode escrever plugins para as duas funções uncheck() e toggleCheck() também. Mas ao contrário nós estendemos nosso plugin para aceitar algumas opções.</p>
<pre>$.fn.check = function(modo) {
	var modo = modo || 'on'; // se modo não está definido, use 'on' como padrão
	return this.each(function() {
		switch(modo) {
		case 'on':
			this.checked = true;
			break;
		case 'off':
			this.checked = false;
			break;
		case 'toggle':
			this.checked = !this.checked;
			break;
		}
	});
};</pre>
<p>Definindo um valor padrão para as opções, permite que o usuário omita a opção ou passe &#8220;on&#8221;, &#8220;off&#8221;, e &#8220;toggle&#8221;, ex.:</p>
<pre>$("input[@type='checkbox']").check();
$("input[@type='checkbox']").check('on');
$("input[@type='checkbox']").check('off');
$("input[@type='checkbox']").check('toggle');</pre>
<p>Com mais de uma configuração opcional, este método torna-se complicado, pois o usuário deverá passar valores nulos se quiser omitir o primeiro parâmetro e usar somente o segundo.</p>
<p>O uso do <em>tablesorter</em> no último capítulo demonstra o uso de um objeto literal também resolve este problema. O usuário omite todos os parâmetros ou passa um objeto com um par chave/valor para cada configuração que deseja sobrescrever.</p>
<p>Como um exercício, você poderia tentar reescrever o código do <a href="#rate">quarto capítulo</a> como um plugin. O esqueleto do plugin deve ser similar a isto:</p>
<pre>$.fn.rateMe = function(options) {
	var container = this; // ao invés de selecionar um container estático com  $("#rating"), nós agora utilizamos o contexto do jQuery

	var settings = {
		url: "rate.php"
		// coloque mais padrões aqui
		// lembre-se de colocar uma vírgula (",") depois de cada par, mas não depois do último!
	};

	if(options) { // verifica se as opções estão presentes antes de estender as configurações
		$.extend(settings, options);
	}

	// ...
	// resto do código
	// ...

	return this; // se possível, retorne "this" para não quebrar a corrente
});</pre>
</div>
<div>
<h2 id="next">Próximos passos</h2>
<p>Se você tem interesse em desenvolver mais em javascript, você deve dar uma olhada numa extensão do Firefox chamada <a href="http://www.joehewitt.com/software/firebug/">FireBug</a>. Ela provê um console (ótimo para substituir os alerts), um debugger e outras coisas úteis para o seu desenvolvimento diário em javascript.</p>
<p>Se você tem problemas que não consegue resolver, idéias que gostaria de compartilhar ou apenas necessidade de expressar sua opinião sobre o jQuery, sinta-se à vontade para postar na <a href="http://jquery.com/discuss/">lista de discussão do jQuery</a>.</p>
<p>Para qualquer coisa relacionada a este guia, envie um <a href="mailto:enchos%20%5Bat%5D%20gmx%20%5Bdot%5D%20net">email</a> para mim ou poste um comentário no meu <a href="http://bassistance.de/index.php/2006/09/12/jquery-getting-started-guide/">blog</a>.</p>
</div>
<div>
<h3>O que restou&#8230;</h3>
<p>Muito obrigado a John Resig por esta ótima biblioteca! Obrigado à comunidade do jQuery por proporcionar ao John café e tudo mais!</p>
</div>
<h4><a href="http://bassistance.de/">© 2006, Jörn Zaefferer</a> - last update: 2006-09-12</h4>
<h4>Tradução para o português do Brasil por Carlos Pires (carlos.pires arroba 2km.com.br)</h4>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2007/06/22/jquery-por-onde-comecar/feed/</wfw:commentRss>
		</item>
		<item>
		<title>O que é Web 2.0?</title>
		<link>http://www.adrianofrazao.com/2007/02/19/o-que-e-web-20/</link>
		<comments>http://www.adrianofrazao.com/2007/02/19/o-que-e-web-20/#comments</comments>
		<pubDate>Mon, 19 Feb 2007 17:41:47 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2007/02/19/o-que-e-web-20/</guid>
		<description><![CDATA[
Web 2.0 is linking people&#8230;
&#8230;people sharing, trading and collaborating
]]></description>
			<content:encoded><![CDATA[<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/6gmP4nk0EOE"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/6gmP4nk0EOE" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object><br />
Web 2.0 is linking people&#8230;<br />
&#8230;people sharing, trading and collaborating</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2007/02/19/o-que-e-web-20/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bill Gates no Daily Show</title>
		<link>http://www.adrianofrazao.com/2007/02/01/bill-gates-no-daily-show/</link>
		<comments>http://www.adrianofrazao.com/2007/02/01/bill-gates-no-daily-show/#comments</comments>
		<pubDate>Thu, 01 Feb 2007 19:26:08 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2007/02/01/bill-gates-no-daily-show/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/M4suTsIIBWo"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/M4suTsIIBWo" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2007/02/01/bill-gates-no-daily-show/feed/</wfw:commentRss>
		</item>
		<item>
		<title>80% dos problemas têm origem em 20% das causas</title>
		<link>http://www.adrianofrazao.com/2006/12/12/80-dos-problemas-tem-origem-em-20-das-causas/</link>
		<comments>http://www.adrianofrazao.com/2006/12/12/80-dos-problemas-tem-origem-em-20-das-causas/#comments</comments>
		<pubDate>Tue, 12 Dec 2006 14:41:17 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Outros]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2006/12/12/80-dos-problemas-tem-origem-em-20-das-causas/</guid>
		<description><![CDATA[Princípio de Pareto (também conhecido como regra 80:20) afirma que para muitos fenómenos, 80% das consequências advém de 20% das causas.
A grande aplicação deste princípio na resolução dos problemas reside precisamente no fato de ajudar a identificar o reduzido número de causas que estão muitas vezes por detrás de uma grande parte dos problemas que ocorrem. [...]]]></description>
			<content:encoded><![CDATA[<p>Princípio de Pareto (também conhecido como regra 80:20) afirma que para muitos fenómenos, 80% das consequências advém de 20% das causas.</p>
<p>A grande aplicação deste princípio na resolução dos problemas reside precisamente no fato de ajudar a identificar o reduzido número de causas que estão muitas vezes por detrás de uma grande parte dos problemas que ocorrem. É na detecção de 20% das causas que dão origem a 80% dos efeitos que o princípio se revela uma ferramenta muito eficiente. O Diagrama diz que, em muitos casos, a maior parte das perdas que se fazem sentir são devidas a um pequeno número de defeitos considerados vitais (vital few). Os restantes defeitos, que dão origem a poucas perdas, são considerados triviais (trivial many) e não constituem qualquer perigo sério. Uma vez identificados os vital few se deve proceder à sua análise, estudo e implementação de processos que conduzam à sua redução ou eliminação.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2006/12/12/80-dos-problemas-tem-origem-em-20-das-causas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Fotografia de moda</title>
		<link>http://www.adrianofrazao.com/2006/12/11/fotografia-de-moda/</link>
		<comments>http://www.adrianofrazao.com/2006/12/11/fotografia-de-moda/#comments</comments>
		<pubDate>Mon, 11 Dec 2006 16:56:53 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Fotografia]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2006/12/11/fotografia-de-moda/</guid>
		<description><![CDATA[
Um pouquinho de photoshop não faz mal a ninguêm.
]]></description>
			<content:encoded><![CDATA[<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/ZquECn6pmWA"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/ZquECn6pmWA" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object><br />
Um pouquinho de photoshop não faz mal a ninguêm.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2006/12/11/fotografia-de-moda/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sport Club do Recife de volta à elite do futebol brasileiro</title>
		<link>http://www.adrianofrazao.com/2006/11/12/sport-club-do-recife-de-volta-a-elite-do-futebol-brasileiro/</link>
		<comments>http://www.adrianofrazao.com/2006/11/12/sport-club-do-recife-de-volta-a-elite-do-futebol-brasileiro/#comments</comments>
		<pubDate>Sun, 12 Nov 2006 10:42:41 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Futebol]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2006/11/12/sport-club-do-recife-de-volta-a-elite-do-futebol-brasileiro/</guid>
		<description><![CDATA[O Sport Recife garantiu sua volta à elite do futebol brasilero. Cinco anos após ter caído para a Série B, o Leão Pernambucano assegurou seu retorno à Série A do Campeonato Brasileiro.

]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.meusport.com/">Sport Recife</a> garantiu sua volta à elite do futebol brasilero. Cinco anos após ter caído para a Série B, o Leão Pernambucano assegurou seu retorno à Série A do Campeonato Brasileiro.</p>
<p><img id="image21" alt="vamos_leao.jpg" src="http://www.adrianofrazao.com/wp-content/uploads/2006/11/vamos_leao.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2006/11/12/sport-club-do-recife-de-volta-a-elite-do-futebol-brasileiro/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mudanças na forma como as pessoas navegam na web</title>
		<link>http://www.adrianofrazao.com/2006/08/10/mudancas-na-forma-como-as-pessoas-navegam-na-web/</link>
		<comments>http://www.adrianofrazao.com/2006/08/10/mudancas-na-forma-como-as-pessoas-navegam-na-web/#comments</comments>
		<pubDate>Thu, 10 Aug 2006 09:41:01 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2006/08/10/mudancas-na-forma-como-as-pessoas-navegam-na-web/</guid>
		<description><![CDATA[Estudo sobre o clickstream mostra como a forma que se navega na internet tem sofrido alterações com o tempo.
- Navegação via links diminuiu de 45.7% para 43.5%;
- Abrir novas janelas passou de 0.2% para 10.5%;
- A utilização do Back baixou dos 35.7% para os 14.3%;
- 76.5% dos links clicados estão na área visível;
- 23.1% dos [...]]]></description>
			<content:encoded><![CDATA[<p>Estudo sobre o clickstream mostra como a forma que se navega na internet tem sofrido alterações com o tempo.</p>
<p>- Navegação via links diminuiu de 45.7% para 43.5%;<br />
- Abrir novas janelas passou de 0.2% para 10.5%;<br />
- A utilização do Back baixou dos 35.7% para os 14.3%;<br />
- 76.5% dos links clicados estão na área visível;<br />
- 23.1% dos links clicados estão abaixo da área visível;<br />
- Muitas pessoas não utilizam toda a área útil do ecrã (na resolução 1024&#215;768, cerca de 160px na horizontal e 170px na vertival não são usados).</p>
<p>Link: <a href="http://www.websiteoptimization.com/speed/tweak/clickstream/">A Clickstream Analysis</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2006/08/10/mudancas-na-forma-como-as-pessoas-navegam-na-web/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mário Quintana</title>
		<link>http://www.adrianofrazao.com/2006/08/01/mario-quintana/</link>
		<comments>http://www.adrianofrazao.com/2006/08/01/mario-quintana/#comments</comments>
		<pubDate>Tue, 01 Aug 2006 13:54:48 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Outros]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2006/08/01/mario-quintana/</guid>
		<description><![CDATA[Já vamos em Agosto e só agora descobri que 2006 é o ano do centenário de Mário Quintana, o poeta do simples, meu poeta preferido.
Mário Quintana, por ele mesmo:
Nasci em Alegrete, em 30 de julho de 1906. Creio que foi a principal coisa que me aconteceu. E agora pedem-me que fale sobre mim mesmo. Bem! [...]]]></description>
			<content:encoded><![CDATA[<p>Já vamos em Agosto e só agora descobri que 2006 é o ano do <a href="http://www.rs.gov.br/marioquintana/index.php">centenário de Mário Quintana</a>, o poeta do simples, meu poeta preferido.<a href="http://www.pensador.info/autor/Mario_Quintana/" /></p>
<p><a href="http://www.pensador.info/autor/Mario_Quintana/">Mário Quintana</a>, por ele mesmo:</p>
<blockquote><p>Nasci em Alegrete, em 30 de julho de 1906. Creio que foi a principal coisa que me aconteceu. E agora pedem-me que fale sobre mim mesmo. Bem! Eu sempre achei que toda confissão não transfigurada pela arte é indecente. Minha vida está nos meus poemas, meus poemas são eu mesmo, nunca escrevi uma vírgula que não fosse uma confissão. Ah! mas o que querem são detalhes, cruezas, fofocas&#8230; Aí vai! Estou com 78 anos, mas sem idade. Idades só há duas: ou se está vivo ou morto. Neste último caso é idade demais, pois foi-nos prometida a Eternidade.</p>
<p>Nasci no rigor do inverno, temperatura: 1grau; e ainda por cima prematuramente, o que me deixava meio complexado, pois achava que não estava pronto. Até que um dia descobri que alguém tão completo como Winston Churchill nascera prematuro - o mesmo tendo acontecido a sir Isaac Newton! Excusez du peu&#8230; Prefiro citar a opinião dos outros sobre mim. Dizem que sou modesto. Pelo contrário, sou tão orgulhoso que acho que nunca escrevi algo à minha altura. Porque poesia é insatisfação, um anseio de auto-superação. Um poeta satisfeito não satisfaz. Dizem que sou tímido. Nada disso! sou é caladão, introspectivo. Não sei porque sujeitam os introvertidos a tratamentos. Só por não poderem ser chatos como os outros?</p>
<p>Exatamente por execrar a chatice, a longuidão, é que eu adoro a síntese. Outro elemento da poesia é a busca da forma (não da fôrma), a dosagem das palavras. Talvez concorra para esse meu cuidado o fato de ter sido prático de farmácia durante cinco anos. Note-se que é o mesmo caso de Carlos Drummond de Andrade, de Alberto de Oliveira, de Erico Verissimo - que bem sabem (ou souberam) o que é a luta amorosa com as palavras.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2006/08/01/mario-quintana/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Para organizar CDs e DVDs</title>
		<link>http://www.adrianofrazao.com/2006/07/28/para-organizar-cds-e-dvds/</link>
		<comments>http://www.adrianofrazao.com/2006/07/28/para-organizar-cds-e-dvds/#comments</comments>
		<pubDate>Fri, 28 Jul 2006 10:49:26 +0000</pubDate>
		<dc:creator>adrianofrazao</dc:creator>
		
		<category><![CDATA[Minha Wishlist]]></category>

		<guid isPermaLink="false">http://www.adrianofrazao.com/2006/07/28/para-organizar-cds-e-dvds/</guid>
		<description><![CDATA[A Imation lançou o Disc Stakka, uma solução eficiente e de baixo custo(cerca de 150 euros) para gerir o arquivo de CDs e DVDs.

Cada Disc Stakka armazena até 100 discos, precisa apenas de um cabo USB para ligação ao computador. Caso necessite de armazenar mais discos, podem ser empilhados até cinco unidades que utilizam uma [...]]]></description>
			<content:encoded><![CDATA[<p>A Imation lançou o <a href="http://www.imation.co.uk/products/disc_stakka/index.html">Disc Stakka</a>, uma solução eficiente e de baixo custo(cerca de 150 euros) para gerir o arquivo de CDs e DVDs.</p>
<div style="text-align: center"><img id="image17" alt="Imation Stakka" src="http://www.adrianofrazao.com/wp-content/uploads/2006/07/stakka1.jpg" /></div>
<p>Cada Disc Stakka armazena até 100 discos, precisa apenas de um cabo USB para ligação ao computador. Caso necessite de armazenar mais discos, podem ser empilhados até cinco unidades que utilizam uma única ligação USB.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adrianofrazao.com/2006/07/28/para-organizar-cds-e-dvds/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
