<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2portuguesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Pinceladas da Web - XHTML, CSS, JavaScript e WebStandards</title>
	
	<link>http://www.pinceladasdaweb.com.br/blog</link>
	<description>Blog pessoal do Desenvolvedor Web Pedro Rogério com foco em XHTML, CSS, Acessibilidade, Usabilidade, Arquitetura de Informação, SEO e WebStandards.</description>
	<lastBuildDate>Wed, 02 May 2012 19:08:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PinceladasDaWeb" /><feedburner:info uri="pinceladasdaweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><image><link>http://www.pinceladasdaweb.com.br/blog/</link><url>http://feeds.feedburner.com/~fc/PinceladasDaWeb?bg=F9FCFE&amp;fg=000000&amp;anim=1&amp;label=leitores</url><title>Pinceladas da Web</title></image><feedburner:emailServiceId>PinceladasDaWeb</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FPinceladasDaWeb" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FPinceladasDaWeb" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FPinceladasDaWeb" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/PinceladasDaWeb" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FPinceladasDaWeb" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FPinceladasDaWeb" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FPinceladasDaWeb" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:browserFriendly>Pensamentos e reflexões de um desenvolvedor web.</feedburner:browserFriendly><item>
		<title>Aplicações dinâmicas com PHP e Ajax</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/bWl478kPFpg/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 16:17:06 +0000</pubDate>
		<dc:creator>Diogo Cezar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5357</guid>
		<description><![CDATA[Como seria possível imaginar a vida sem a Internet? Atualmente um profissional que não está familiarizado com a web certamente está com sua carreira em risco. Isso porque inevitavelmente o que estamos acompanhando nos últimos tempos é a convergência dos produtos e serviços para a Internet. A dimensão dessa transformações pode ser exemplificada quando tomamos [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/">Aplicações dinâmicas com PHP e Ajax</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/php-ajax/ajax.jpg" alt="Aplicações dinâmicas com PHP e Ajax" title="Aplicações dinâmicas com PHP e Ajax" /></div>
<p>Como seria possível imaginar a vida sem a Internet? Atualmente um profissional que não está familiarizado com a web certamente está com sua carreira em risco. Isso porque inevitavelmente o que estamos acompanhando nos últimos tempos é a convergência dos produtos e serviços para a Internet. A dimensão dessa transformações pode ser exemplificada quando tomamos como exemplo a indústria que distribui matérias audiovisual (emissoras de tv, distribuidoras de cd’s, dvd’s ou blue-rays).</p>
<p><span id="more-5357"></span></p>
<p>Na década de 90, alugar um filme ou comprar um CD era a única maneira de consumir um entretenimento específico. Com a evolução da Internet criou-se uma nova forma de consumo, que inevitavelmente tomou o lugar dessa indústria. Isso se deve as inúmeras vantagens que a web oferece para seu “consumidor”, as principais são que o conteúdo é na maioria das vezes gratuito, e é possível assistir quando e onde quiser.</p>
<p>Mas a Internet nem sempre foi o que é hoje. Os recursos que acessamos hoje passaram por uma grande evolução. É lógico que com o aumento na velocidade de transmissão de dados, tornou-se viável o consumo de áudio e vídeo, entretanto as tecnologias que envolvem tais recursos também passaram por uma grande evolução.</p>
<h3>A evolução da Internet</h3>
<p>A Internet não foi concebida para tomar a dimensão que tomou. Sua ideia inicial era promover acessos a dados em uma rede de computadores, e o que temos hoje é muito mais que isso.</p>
<p>Nos testes iniciais da Internet por volta do início da década de 90, cientistas tinham o intuito de compartilhar dados ao redor do mundo, e para isso não precisavam de muito mais que o compartilhamento de texto puro e eventuais gráficos e/ou imagens.</p>
<p>Na internet são trafegados diversos protocolos, entre eles temos o HTTP (HyperText Transfer Protocol). Esse, é um protocolo que transporta uma página em HTML (HyperText Markup Language) que é gerada em um servidor. O cliente, ao receber uma página em HTML invoca um programa (navegador) interpreta o protocolo HTTP e extrai o código HTML para sua exibição.</p>
<p>A linguagem HTML permitia que esses textos e imagens fossem organizados em um documento de texto através da utilização de tags (etiquetas). Essas seriam interpretadas por um programa específico e exibiria informações de uma maneira agradável. A linguagem HTML era suficiente para suprir as necessidades da época, pois cumpriu com eficiência a tarefa a que se propôs.</p>
<p><strong>Nota:</strong> Tags em HTML são estruturas da linguagem que consistem em breves instruções, tendo uma marca de início e outra de fim, cada uma dessas instruções tem uma função específica na formatação de um documento web. Por exemplo &lt;h1&gt;Exemplo&lt;/h1&gt; marca a palavra &#8220;Exemplo&#8221; como um título</p>
<p>O grande problema foi que os objetivos da Internet se alteraram mas a linguagem de marcação não acompanhou essas alterações. Entre a versão 1 do HTML e a versão 3 não houveram mudanças consideráveis. O HTML 4.0 foi convencionado em 1997 pela W3C (World Wide Web Consortium). A W3C é consórcio formado por instituições comerciais e educacionais que têm como objetivo definir os padrões para escrita de documentos que trafegam pela web. A grande diferença notada na versão 4.0 do HTML foi a inserção de objetos dinâmicos. Desta forma, tornou-se possível modificar elementos da página HTML sem a necessidade de obter um novo documento. Surge então o DHTML (Dynamic HyperText Markup Language) que foi a junção das tecnologias JavaScript, CSS e DOM (Document Object Model). O DOM é a organização dos elementos de um HTML, ele os mapeia os elementos HTML em formato de árvore, e assim, a linguagem JavaScript pode manipular um nodo nó (uma folha da árvore) independentemente de toda a estrutura.</p>
<p>Em 2000 a W3C propõe uma modificação nos conceitos trabalhos até então. A nova proposta uni a linguagem de marcação HTML com as regras de marcação da linguagem XML, estava então criado o XHTML 1.0. Sua principal proposta era orientar o desenvolvedor a escrever o documento HTML de forma correta, utilizando para isso as regras DTD (Document Type Definition) especificadas no cabeçalho do documento.</p>
<p>A grande questão foi que o XHTML 1.0 precisava de alguma alternativa que suprisse as necessidades dos usuários carentes por algo a mais que textos e imagens. Como a linguagem nativa não era capaz de suprir essas vontades, deu-se início a agregação de plug-ins como alternativa a necessidade audiovisual.</p>
<p>Adobe Flash, Microsoft SilverLight e Sun com JavaFx foram usados como alternativa para suprir essa necessidade. Aparentemente o problema estava resolvido, mas entretanto sua utilização apresentavam algumas desvantagens, como: não seguem um padrão, não são nativos, são particulares e não tem a codificação aberta.</p>
<p>Em 2004, os representantes das empresas Mozilla, Apple e Opera se reuniram e decidiram criar um grupo paralelo a W3C, em que começaram a desenvolver padrões de marcação em paralelo a W3C, estava formado o The Web Hypertext Application Technology Working Group (WHAT-WG). A ideia era tomar como base a evolução e não a revolução (assim como uma tentativa fracassada da W3C em construir o XHTML 2.0). Mudanças drásticas poderiam corromper muito do que já estava funcionando na Internet. Os sites que utilizavam as linguagens especificadas em 1999 e 2000 continuariam funcionando, entretanto novos conceitos seriam implicados. O grupo WHAT-WG deu início ao desenvolvimento do HTML5, que hoje já foi incorporado pelas diretrizes da W3C.</p>
<h3>Cada navergador com sua interpretação</h3>
<p>Um dos problemas recorrentes na área de desenvolvimento para web é que cada navegador interpreta o código HTML de uma forma diferente. Isso é um grande problema para desenvolvedores que tem que deixar o site o mais compatível possível dentre os navegadores presentes. Mas Sse existe um padrão criado pela W3C por que cada navegador insiste em interpretar o código a sua própria maneira?</p>
<p>Quando o HTML 4.01 foi especificado, tags foram criadas e seus objetivos estipulados, entretanto nada foi documentado com relação a como os navegadores deveriam interpretar essas tags, Isso deu origem a incompatibilidade da mesma codificação em navegadores diferentes; o que acontece é que cada navegador tenta adivinhar como interpretar determinada tag quando ela não está implementada de forma correta.</p>
<p>Outra questão é que existe uma certa aversão por parte de certas empresas em adotar os padrões estabelecidos, mas o que nota-se é uma convergência para tal unificação. Assim a maioria das empresas que desenvolvem navegadores estão adaptando seus produtos para o padrão estabelecido pela W3C que atualmente já aponta para o HTML5.</p>
<h3>O início do Ajax</h3>
<p>Em 1998, um membro da equipe da Microsoft, ao se deparar com o DHTML (utilização de JavaScript integrado com HTML), implementou uma função que daria vida ao AJAX(Asynchronous Javascript And XML) o XMLHTTP. Essa função permitia uma comunicação entre cliente e servidor de forma assíncrona, descontinuando a necessidade de enviar uma solicitação para receber uma resposta. Essa descoberta foi revolucionária, mas na época não teve destaque, pois não ficou claro para os desenvolvedores como se implementaria a comunicação assíncrona.</p>
<p>Em 2002 a empresa Mozilla percebeu a potencialidade desse recurso e implementou a função XMLHttpRequest, que se tornou o padrão para comunicação assíncrona nos principais navegadores como (FireFox, Opera, Safari, Chrome), mas foi somente em 2004 que essa nova funcionalidade teve destaque, com os recursos inovadores apresentados pelo Google, em sua aplicação Gmail, que construindo o conceito de programação chamado Ajax.</p>
<p>Até então, não era possível ter uma ideia da capacidade do AJAXAjax. Em 2005 que o Google lança o Google Maps, a primeira aplicação web com características de uma aplicação desktop, que contava com conceitos de clicar e arrastar (drag and drop), zoom ao scrool do mouse, uma interface intuitiva e  outros recursos das aplicações desktop.</p>
<p>A utilização dessa tecnologia se tornou cada vez mais visada, não tão somente para a construção de sites, mas para a criação de aplicativos que pudessem rodar inteiramente na Internet.</p>
<h3>Como funciona o Ajax</h3>
<p>A Internet funciona em um modelo de requisição resposta. Em sites, esse protocolo apresenta-se ineficiente. Isso porque é necessário carregar uma página completa a cada requisição e ainda é preciso esperar seu carregamento antes de liberar o usuário para a tomada de qualquer outra ação na página em questão.</p>
<p>O que a tecnologia Ajax permite é uma comunicação assíncrona, dessa forma uma página principal é carregada, e quando um usuário interage em determinada seção doa site uma nova requisição é feita de forma transparente (sem que o usuário precise esperar uma nova página ser carregada) interagindo somente com aquele trecho do site.</p>
<p>Na Figura 1 observa-se uma representação de comunicação síncrona em uma página tradicional. Nota-se que para cada requisição (seta orientada para direita) existe uma resposta (seta orientada para a esquerda).</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/php-ajax/figura1.png" alt="Figura 1" title="Figura 1" /></div>
<p>Na representação da Figura 2 nota-se que a página principal é carregada uma vez e pequenas requisições transparentes ao usuário são feitas ao servidor e devolvem o conteúdo solicitado.</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/php-ajax/figura2.png" alt="Figura 2" title="Figura 2" /></div>
<p>É importante salientar que a tecnologia Ajax é uma tecnologia que vem sido muito utilizada, pois oferece conforto ao usuário, entretanto é necessário ponderar sua utilização. Recomenda-se sua utilização em aplicações web que sofrem com o modelo requisição-resposta, tais como: aplicações com menus, com interatividade em tempo real, com modelos de aplicações gráficas (desktop) entre outros. Entretanto não é necessário sua utilização em casos que a informação desejada será carregada apenas uma vez e não terá alterações, como por exemplo: uma tabela de informações para impressão.</p>
<p>&lt;3>Colocando a mão na massa</p>
<p>Nesse artigo utiliza-se as tecnologias MySQL, PHP, e HTML. Para testar o exemplo é necessário ter instalado em seu computador um servidor web com suporte a PHP e MySQL. Para os iniciantes recomendo a utilização de programas como o XAMPP ou Wamp que proporcionam em poucos cliques um servidor web completo e de fácil configuração.</p>
<p>Para iniciarmos o entendimento básico do funcionamento do Ajax, precisamos de alguma aplicação web. Para isso utiliza-se um exemplo de agenda de contatos. Para armazenar os dados dessa agenda vamos utilizar o banco de dados MySQL em sua versão 5.x.</p>
<p>Os campos a serem armazenados são: id, nome, email e telefone. O seguinte código demonstra a criação da tabela contatos:</p>
<pre class="brush: sql">
CREATE TABLE &#039;contatos&#039; (
  &#039;id&#039; int(11) NOT NULL AUTO_INCREMENT,
  &#039;nome&#039; varchar(45) DEFAULT NULL,
  &#039;email&#039; varchar(200) DEFAULT NULL,
  &#039;telefone&#039; varchar(45) DEFAULT NULL,
  PRIMARY KEY (&#039;id&#039;)
) DEFAULT CHARSET=latin1;
</pre>
<p>Note que o campo id é um campo que armazena um inteiro e está marcado como um campo que se auto incrementa, dessa forma não precisamos nos preocupar com o gerenciamento das identificações dos registros.</p>
<p>Depois dos campos criados deve-se dar destaque ao arquivo HTML que servirá de interface para o acesso remoto das informações. O seguinte código apresenta já algumas características do HTML5 como a utilização de tags como header ou ainda a construção de um cabeçalho mais simplificado.</p>
<pre class="brush: html">
&lt; !DOCTYPE html&gt;
&lt;html lang=&quot;pt-br&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Desenvolvimento com Ajax&lt;/title&gt;
&lt;/meta&gt;&lt;/head&gt;
&lt;body&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;func.js&quot;&gt;&lt;/script&gt;
&lt;div id=&quot;container&quot;&gt;
	&lt;header&gt;
    	&lt;h1&gt;Iniciando com o desenvolvimento com ajax&lt;/h1&gt;
    &lt;/header&gt;
	&lt;h2&gt;Carregar dados:&lt;/h2&gt;
    &lt;div id=&quot;readData&quot;&gt;
		&lt;div id=&quot;label_id&quot;&gt;Carregar id:&lt;/div&gt;
		&lt;input name=&quot;id&quot; id=&quot;id&quot; type=&quot;text&quot; /&gt;
		&lt;input value=&quot;Ok&quot; onclick=&quot;getById()&quot; type=&quot;button&quot; /&gt;
    &lt;/div&gt;
	&lt;hr /&gt;
	&lt;h2&gt;Inserir dados:&lt;/h2&gt;
	&lt;form action=&quot;index.php&quot;&gt;
		&lt;div id=&quot;label_nome&quot;&gt;Nome:&lt;/div&gt;
		&lt;input name=&quot;nome&quot; type=&quot;text&quot; /&gt;
		&lt;div id=&quot;label_email&quot;&gt;E-mail:&lt;/div&gt;
		&lt;input name=&quot;email&quot; type=&quot;text&quot; /&gt;
		&lt;div id=&quot;label_telefone&quot;&gt;Telefone:&lt;/div&gt;
		&lt;input name=&quot;telefone&quot; type=&quot;text&quot; /&gt;
		&lt;input value=&quot;Ok&quot; onclick=&quot;insertData()&quot; type=&quot;button&quot; /&gt;
	&lt;/form&gt;
	&lt;hr /&gt;
	&lt;h2&gt;Registros:&lt;/h2&gt;
	&lt;div id=&quot;result&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Analisando o código HTML acima podemos notar que logo após definirmos o título do documento, dentro da tagb &lt;body&gt;, invocamos um arquivo JavaScript (func.js) que irá conter funções para manipulação do HTML.</p>
<p>Na construção dos blocos, temos um bloco principal chamado container. Manter esse bloco é importante pois é com ele que conseguimos melhorias estéticas, tais como o tamanho (largura e altura) que a aplicação terá, o espaçamento da borda superior da página, entre outros.</p>
<p>Alguns cabeçalhos (h1, h2) são adicionados para separar e nomear os blocos da página.</p>
<p><strong>Nota:</strong> Pretende-se aqui explicar como se dá o funcionamento da tecnologia Ajax, logo explicações de CSS ou estética de construção do HTML estão fora de escopo, e ficam para uma próxima oportunidade.</p>
<p>O arquivo HTML possui três sessões seções básicas:</p>
<ul>
<li>1. carregar dados: apresenta um input do tipo text um botão ok. Aqui o usuário pode procurar na base de dados um registro, por uma identificação específica, caso nenhuma identificação seja inserida, retorna-se todos os registros da base de dados;</li>
<li>2. inserir dados: estão dispostos três inputs do tipo text referentes aos dados para cadastro de um novo registro. Ao clicar em ok o registro é armazenado e uma resposta de sucesso ou fracasso é retornada para o usuário;</li>
<li>3. registros: Ao procurar por um registro específico, todos os registros ou inserir um novo, sua resposta será exibida nessa sessão, dentro da div result.</li>
</ul>
<p>Nota-se que os botões ok não são botões do tipo submit e sim botões do tipo button, isso porque cada um deles chama uma função JavaScript específica. Como estamos trabalhando com Ajax não podemos contar com a prática tradicional de enviar um formulário pelo botão submit, agora teremos que tratar cada caso separadamente por funções da linguagem JavaScript.</p>
<p>Depois de escrito, pode-se salvar esse HTML como index.html, assim ele será o arquivo principal a ser acessado por seus usuários.</p>
<p>A Figura 3 mostra um exemplo de como deve ficar seu HTML depois de pronto.</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/php-ajax/agenda.png" alt="Agenda" title="Agenda" /></div>
<h3>E como ficam os JavaScript?</h3>
<p>Agora vamos analisar detalhadamente como toda a mágica acontece. Quando contextualizamos o início da tecnologia Ajax citamos o objeto XMLHttpRequest criado pela empresa Mozilla em 2002. E é exatamente com esse objeto que vamos trabalhar.</p>
<p>A primeira função a ser analisada no arquivo func.js é a função generateXMLHttp(). Essa função tenta exaustivamente criar o objeto XMLHttpRequest. O que acontece é que pela incompatibilidade de alguns navegadores tenta-se criar o objeto padrão, caso não seja possível sua criação, tenta-se uma serie de outras versões semelhantes do próprio objeto, implementada para diferentes navegadores. Todas essas versões estão armazenadas em um vetor nomeado de versions. Depois das tentativas se nenhum objeto conseguir ser criado, retorna-se uma mensagem ao usuário dizendo que seu navegador é incapaz de trabalhar com a tecnologia Ajax.</p>
<pre class="brush: js">
function generateXMLHttp() {
	if (typeof XMLHttpRequest != &quot;undefined&quot;){
		return new XMLHttpRequest();
	}
	else{
	 	if (window.ActiveXObject){
			var versions = [&quot;MSXML2.XMLHttp.5.0&quot;,
		                 &quot;MSXML2.XMLHttp.4.0&quot;,
                                 &quot;MSXML2.XMLHttp.3.0&quot;,
		                 &quot;MSXML2.XMLHttp&quot;,
		                 &quot;Microsoft.XMLHttp&quot;
		               		];
		}
	}
	for (var i=0; i &lt; versions.length; i++){
		try{
			return new ActiveXObject(versions[i]);
		}catch(e){}
	}
	alert(&#039;Seu navegador não pode trabalhar com Ajax!&#039;);
}
</pre>
<p>A próxima função a ser analisada é a função getById(). Essa função captura o que foi digitado pelo usuário e armazena em uma variável id. Cria-se o XMLHttp que armazena um objeto do tipo XMLHttpRequest. Algumas propriedades desse objeto devem ser analisadas.</p>
<p>XMLHttp.open: recebe 3 parâmetros:</p>
<ul>
<li>1. Tipo de requisição: o tipo da requisição é a forma com que será montado o protocolo HTTP, aqui pode-se passar uma das duas strings samblagens ‘get’ ou ‘post’. Em um primeiro momento vamos analisar como se dá o funcionamento do Ajax utilizando as variáveis de get e posteriormente analisar um próximo exemplo com as variáveis do tipo post.</li>
<li>2. URL: aqui devemos inserir o arquivo de destino, ou seja, o arquivo que irá realizar as manipulações do lado do servidor. Como estamos utilizando a linguagem PHP para manipulação do banco de dados, anexa-se aqui um arquivo php que faz a consulta em um banco de dados. Note também que, como nosso tipo de requisição foi setado como get, passamos logo depois do nome do arquivo uma variável de get (id) recuperada pelo JavaScript;</li>
<li>3. Async: Esse parâmetro é o que liga ou desliga a assincronicidade da função, então setamos como ‘true’ pois desejamos que essa chamada seja feita de forma assíncrona;</li>
</ul>
<p>XMLHttp.onreadystatechange: É um método do objeto XMLHttpRequest que fica monitorando uma propriedade chamada readyState. Assim que essa propriedade é alterada esse método é executado, então no exemplo, atribuímos a ele uma função.</p>
<p>XMLHttp.readyState: é uma lista de estados, definida por:</p>
<ul>
<li>1. 0 (não iniciado): o objeto já foi criado mas o método open() não foi invocado até o momento;</li>
<li>2. 1 (carregando): o método open() já foi invocado mas a requisição ainda não foi enviada;</li>
<li>3. 2 (carregado): a requisição foi enviada;</li>
<li>4. 3 (incompleto): apenas uma parte da resposta do servidor foi recebida;</li>
<li>5. 4 (completo): todas as informações foram recebidas e a conexão foi encerrada com sucesso.</li>
</ul>
<p>Note que com tais informações e um pouco de criatividade é fácil montar um aviso de ‘carregando’ para o usuário.</p>
<p>XMLHttp.status: é uma lista de estados proveniente do protocolo HTTP, definida por:</p>
<ul>
<li>1. 200 (OK): arquivo encontrado com sucesso;</li>
<li>2. 304 (NOT MODIFIED): o arquivo não foi modificado desde o ultimo request;</li>
<li>3. 401 (UNAUTHORIZED): cliente não tem autorização para acessar o arquivo;</li>
<li>4. 403 (FORBIDDEN): cliente falhou na autorização;</li>
<li>5. 404 (NOT FOUND): quando o arquivo não existe na localização informada.</li>
</ul>
<p>Com essas informações também é possível fazer um tratamento mais refinado para possíveis erros.</p>
<p>XMLHttp.responseText: Esse é o texto proveniente da execução com sucesso do arquivo chamado em open(); É esse retorno que deve ser manipulado para exibir o resultado desejado.</p>
<p>XMLHttp.statusText: Esse é o texto de retorno do status, normalmente utilizado para saber qual foi o erro, quando algo não aconteceu como o esperado.</p>
<p>XMLHttp.send: é o método que envia a requisição propriamente dita, ao utiliza um requisição por GET não precisamos passar nenhum parâmetro, entretanto quando utilizamos POST devemos passar uma lista de variáveis que serão anexadas ao protocolo HTTP, essa lista será melhor explicada quando exemplificarmos a utilização do POST.</p>
<pre class="brush: js">
function getById() {
	var id      = document.getElementById(&quot;id&quot;).value;
	var result  = document.getElementById(&quot;result&quot;);
	var XMLHttp = generateXMLHttp();
	XMLHttp.open(&quot;get&quot;, &quot;getData.php?id=&quot; + id, true);
	XMLHttp.onreadystatechange = function(){
		if (XMLHttp.readyState == 4)
			if (XMLHttp.status == 200){
				result.innerHTML = XMLHttp.responseText;
			} else {
				result.innerHTML = &quot;Um erro ocorreu: &quot; + XMLHttp.statusText;
			}
	};
	XMLHttp.send(null);
}
</pre>
<p>Analisando agora todos os métodos e operadores do objeto XMLHttpRequest podemos notar a seguinte sequência de ações:</p>
<ul>
<li>1. Cria-se um objeto do tipo XMLHttpRequest;</li>
<li>2. Abre-se a conexão com o tipo de operador get apontando para uma página em PHP chamada getData.php?id=%id%, sendo que %id% é uma variável obtida pelo input id em nosso HTML. Ainda marca-se como true uma conexão assíncrona;</li>
<li>3.	Atribui-se uma função que é executada a qualquer mudança de estado, e no momento em que obtêm-se os códigos de que as informações foram recebidas com sucesso e a conexão foi fechada (XMLHttp.readyState == 4) e o arquivo foi encontrado com sucesso (XMLHttp.status == 200) então atribui-se ao div com id result a resposta fornecida pela página em questão, caso contrário mostra-se uma mensagem de erro;</li>
<li>4. Envia-se a requisição através do método send, passando null como parâmetro, pois estamos usando uma requisição do tipo GET.</li>
</ul>
<p>Antes de analisarmos as demais funções do arquivo func.js vamos ver como foi construído o arquivo invocado pela função getById().</p>
<pre class="brush: php">
&lt; ?php

$id   = $_GET[&#039;id&#039;];
$sql  = &quot;&quot;;

if(empty($id)){
	$type = &quot;all&quot;;
	$sql = &quot;SELECT * FROM contatos&quot;;
}
else{
	$type = &quot;id&quot;;
	$sql = &quot;SELECT * FROM contatos WHERE id = &quot; . mysql_real_escape_string($id);
}

$user = &quot;root&quot;;
$pass = &quot;&quot;;
$host = &quot;localhost&quot;;
$base = &quot;agenda&quot;;
mysql_connect($host, $user, $pass);
mysql_select_db($base);

$result = mysql_query($sql);

if($type == &quot;all&quot;){
	$return = &quot;&quot;;
	while($data = mysql_fetch_array($result)){
		$return .= &quot;Nome: &quot; .     $data[&#039;nome&#039;] .     &quot;&lt;br /&gt;&quot;;
		$return .= &quot;E-mail: &quot; .   $data[&#039;email&#039;] .    &quot;&lt;br /&gt;&quot;;
		$return .= &quot;Telefone: &quot; . $data[&#039;telefone&#039;] . &quot;&lt;br /&gt;&quot;;
		$return .= &quot;&lt;hr /&gt;&quot;;
	}
}
else{
	if($data = mysql_fetch_array($result)){
		$return .= &quot;Nome: &quot; .     $data[&#039;nome&#039;] .     &quot;&lt;br /&gt;&quot;;
		$return .= &quot;E-mail: &quot; .   $data[&#039;email&#039;] .    &quot;&lt;br /&gt;&quot;;
		$return .= &quot;Telefone: &quot; . $data[&#039;telefone&#039;] . &quot;&lt;br /&gt;&quot;;
	}
	else{
		$return .= &quot;Não foi possível listar o registro com id: &quot; . $id;
	}
}

echo $return;
?&gt;
</pre>
<p>Esse arquivo recupera uma variável passada por GET e atribui a uma variável $id. Uma rápida verificação é feita para verificar se a id está vazia. Lembrando que nossa aplicação deve retornar todos os registros caso nenhum registro específico seja selecionado. Então montamos as sentenças SQL e iniciamos uma conexão com o banco de dados. Logo após exibimos através do comando echo as informações obtidas do banco de dados. Note que são exatamente essas informações serão colocadas em nossa página principal.</p>
<p>Vamos agora analisar uma maneira de inserir os dados utilizando uma requisição do tipo POST.</p>
<p>O primeiro passo para construir a inserção de dados por Ajax está relacionado a construção de uma função que irá construir uma string que será passada como parâmeto da função send do objeto XMLHttpRequest. Essa string é semelhante aos parâmetros passados depois passados de uma url quando trabalhamos com variáveis de GET. Sua formatação é dada por variavel1=valor1&#038;variavel2=valor2&#038;&#8230;variavelN=valorN. Segue a função que analisa os campos do formulário passado como função e gera essa string.</p>
<pre class="brush: js">
function generateFieldsValues(formInsert){
	var strReturn = new Array();

	for(var i=0; i &lt; formInsert.elements.length; i++){
		var str = encodeURIComponent(formInsert.elements[i].name);
		str    += &quot;=&quot;;
		str    += encodeURIComponent(formInsert.elements[i].value);
		strReturn.push(str);
	}
	return strReturn.join(&quot;&amp;&quot;);
}
</pre>
<p>A função simplesmente pega o cada elemento do formulário e gera uma samblagem no formato citado acima.</p>
<p>Agora vamos analisar a função que faz a inserção propriamente dita. Em primeiro lugar gera-se uma string com a função anteriormente descrita. Os próximos passos são semelhantes aos descritos para a utilização da função getById(). A única diferença está na utilização da requisição POST post ao invés de GET, e na passagem das variáveis no método send.</p>
<pre class="brush: js">
function insertData(){
	var formInsert   = document.forms[0];
	var fieldsValues = generateFieldsValues(formInsert);
	var result       = document.getElementById(&quot;result&quot;);

	var XMLHttp = generateXMLHttp();
	XMLHttp.open(&quot;post&quot;, &#039;insertData.php&#039;, true);
	XMLHttp.setRequestHeader(&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;);

	XMLHttp.onreadystatechange = function (){
		if(XMLHttp.readyState == 4)
			result.innerHTML = XMLHttp.responseText;
		else
			result.innerHTML = &quot;Um erro ocorreu: &quot; + XMLHttp.statusText;
	};
	XMLHttp.send(fieldsValues);
}
</pre>
<p>O arquivo insertData.php é um arquivo PHP que faz uma simples inserção no banco de dados. Atenção para como se recuperam as informações. Aqui, utilizamos a variável global $_POST ao invés de $_GET.</p>
<pre class="brush: php">
&lt; ?php

$nome     = $_POST[&#039;nome&#039;];
$email    = $_POST[&#039;email&#039;];
$telefone = $_POST[&#039;telefone&#039;];

$sql = &quot;INSERT INTO contatos (id, nome, email, telefone) VALUES (&#039;&#039;, &#039;$nome&#039;, &#039;$email&#039;, &#039;$telefone&#039;)&quot;;

$user = &quot;root&quot;;
$pass = &quot;&quot;;
$host = &quot;localhost&quot;;
$base = &quot;agenda&quot;;
mysql_connect($host, $user, $pass);
mysql_select_db($base);

if($result = mysql_query($sql)){
	$return = &quot;O registro foi inserido com sucesso!&quot;;
}
else{
	$return = &quot;Erro ao inserir o registro no banco de dados.&quot;;
}

echo $return;
?&gt;
</pre>
<p><strong>Nota:</strong> A utilização dos arquivos PHP demostram apenas um exemplo de como o Ajax pode funcionar, lembrando que a linguagem pode ser substituída utilizando os mesmos conceitos aqui explicados.</p>
<p>O exemplo da agenda é um exemplo básico, utilizando os conceitos básicos e nativos da tecnologia Ajax. Na prática existem muitas ferramentas ou frameworks que auxiliam em sua utilização. Vamos analisar agora a utilização de Ajax com a ferramenta JQuery.</p>
<h3>Ajax com jQuery</h3>
<p>jQuery é uma biblioteca escrita em JavaScript desenvolvida com o objetivo de simplificar a interação com os objetos HTML. Com a utilização da biblioteca jQuery os desenvolvedores podem se concentrar na construção lógica de suas aplicações enquanto deixam para a biblioteca a missão de garantir a compatibilidade (discutida anteriormente) entre os navegadores.</p>
<p>Outra grande vantagem em se utilizar JQuery, é que estão disponíveis na web uma infinidade de plug-ins que o utilizam como base e sua infinidade de recursos. Dentre suas principais funcionalidades podemos destacar:</p>
<ul>
<li>resolução da incompatibilidade entre os navegadores;</li>
<li>redução de código;</li>
<li>reusabilidade do código através de plug-ins;</li>
<li>implementação segura de recursos do CSS1, CSS2 e CSS3;</li>
<li>utilização de uma vasta quantidade de plugins criados por outros desenvolvedores;</li>
<li>trabalha com AJAX e DOM.</li>
</ul>
<p>A biblioteca jQuery não requer instalação. Por se tratar de um arquivo JavaScript formal, basta que você crie um link para o arquivo, na seção head do documento onde o script irá rodar, tal como faz com qualquer arquivo JavaScript tradicional.</p>
<pre class="brush: js">
&lt;script type=&quot;text/javascript&quot; src=&quot;../jquery.js&quot;&gt;&lt;/script&gt;
</pre>
<p>O modo com que se utiliza a biblioteca jQuery acontece de forma diferenciada que as implementações em JavaScript. Como a ideia do jQuery é simplificar, sua utilização é concentrada em um único lugar, evitando que se espalhem diferentes chamadas e funções por todo o código.</p>
<p>Sua estrutura básica é:</p>
<pre class="brush: js">
$(document).ready(function() {
// faça alguma coisa quando o DOM estiver pronto
});
</pre>
<p>Assim, logo após o documento estar carregado todas as funcionalidades descritas aqui serão aplicadas aos elementos HTML. Imagine por exemplo que se queira adicionar uma funcionalidade a um botão, então poderíamos utilizar:</p>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Get Text&lt;/title&gt;
&lt;script language=&quot;javascript&quot; src=&quot;jquery/jquery.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
$(document).ready(function(){
	$(&#039;#botao&#039;).click(function(){
		alert($(&#039;#texto&#039;).attr(&#039;value&#039;));
	});
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
Digite seu nome:
&lt;input id=&quot;texto&quot; name=&quot;texto&quot; type=&quot;text&quot; maxlength=&quot;50&quot; /&gt;
&lt;input name=&quot;botao&quot; type=&quot;button&quot; id=&quot;botao&quot; value=&quot;Ok&quot;/&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Note que, o elemento botão não está ligado diretamente a nenhuma ação do JavaScript, isso fica por conta do que foi definido em $(&#8216;#botao&#8217;).click(function(){}); O objetivo do artigo não é entrar em detalhes da biblioteca de jQuery, mas focar na utilização de seus recursos para a construção de sites com a tecnologia Ajax.</p>
<p>Existem diferentes formas para se trabalhar com Ajax utilizando a biblioteca jQuery, basicamente todas seguem a mesma lógica, mas sua sintaxe e recursos são diferentes.</p>
<p>A primeira forma de utilizar JQuery com Aajax é através da função load(). Nela observamos 3 parâmetros:</p>
<ul>
<li>1.	url: é o arquivo ao qual será solicitada a requisição;</li>
<li>2.	parâmetros: são os parâmetros a serem enviados para a página de destino;</li>
<li>3.	callback: qual será a função de retorno a ser utilizada após a execução da página de destino, com os parâmetros passados;</li>
</ul>
<p>O próximo exemplo demonstra como seria possível utilizar a tecnologia Ajax para criar um sistema CRUD (Create, Retrieve, Update e Delete) em uma aplicação web.</p>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Ajax com jQuery&lt;/title&gt;
&lt;style type=&quot;text/css&quot;&gt;
	#box {border:1px solid #ccc; padding:5px}
&lt;/style&gt;
&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
	$(&quot;input[type=button]&quot;).click(function(event) {
		var acao = $(this).attr(&quot;value&quot;);
		$(&quot;#box&quot;).load(&#039;requisicao.php&#039;,{acc:acao},ready());
	});
});

function ready(){
	alert(&#039;Ajax terminou com sucesso.&#039;);
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;Exibir&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;Editar&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;Novo&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;Deletar&quot; /&gt;&lt;/p&gt;
    &lt;div id=&quot;box&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Note que nesse caso utilizamos a importação da biblioteca jQuery diretamente do servidor onde ela está hospedada, é uma prática interessante caso não se queira deixar uma biblioteca junto de seus arquivos. Nesse exemplo utilizamos a biblioteca JQuery para aplicar uma determinada função a todos os botões da página, isso pois procura-se pelo seletor $(&#8220;input[type=button]&#8220;). Para cada um desses botões, a função click é alterada e cria-se uma variável chamada acao. Essa variável recebe a string referente ao atributo value do elemento HTML. Depois disso, utiliza-se a propriedade load() em um seletor que busca pelo div de id “box”. É importante destacar que essa função carrega automaticamente o conteúdo retornado ao elemento que a estiver chamando, nesse caso um seletor que aponta para um div. Note que o primeiro parâmetro é o nome do arquivo a ser executado, ‘requisicao.php’ o segundo parâmetro tem uma característica especial utilizada pela biblioteca JQuery, onde formata-se {var:valor}. Dessa forma é possível capturar através de uma variável de POST dentro do arquivo PHP uma variável com o nome ‘var’ com o valor descrito.  Ainda temos uma função que é chamada depois que a solicitação terminou, a função ready() foi criada logo abaixo das invocações JQuery, justamente para demonstrar que é possível fazer uma mesclagem com a linguagem JavaScript tradicional.</p>
<p>Abaixo temos o arquivo PHP que apenas filtra a ação passada (de acordo com o botão clicado) e para cada uma delas exibe uma mensagem.</p>
<pre class="brush: php">
&lt; ?php
$acao = $_POST[&#039;acc&#039;];

switch($acao){
	case &#039;Editar&#039;:
		echo &#039;A ação selecionada é editar&#039;;
	break;

	case &#039;Novo&#039;:
		echo &#039;A ação solicitada é criar&#039;;
	break;

	case &#039;Exibir&#039;:
		echo &#039;A ação solicitada é exibir&#039;;
	break;

	case &#039;Deletar&#039;:
		echo &#039;A ação solicitada é deletar&#039;;
	break;
}
?&gt;
</pre>
<p>A Figura 4 mostra a tela de exemplo da aplicação criada utilizando a biblioteca jQuery.</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/php-ajax/jquery-1.png" alt="Ajax com jQuery" title="Ajax com jQuery" /></div>
<p>Uma outra característica interessante do método load() é a capacidade de filtrar o conteúdo a ser exibido. Colocando uma string contendo ‘#nome_da_div’ que será exibida logo após o nome do arquivo escolhido, temos um filtro automático que irá buscar no conteúdo retornado somente a div especificada.</p>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Ajax com jQuery&lt;/title&gt;
&lt;style type=&quot;text/css&quot;&gt;
	#box {border:1px solid #ccc; padding:5px}
&lt;/style&gt;
&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
	$(&quot;input[type=button]&quot;).click(function(event) {
		var acao = $(this).attr(&quot;value&quot;);
		$(&quot;#box&quot;).load(&#039;dados.html #&#039; + acao);
	});
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;parte1&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;parte2&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;parte3&quot; /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;Deletar&quot; /&gt;&lt;/p&gt;
    &lt;div id=&quot;box&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Nesse exemplo usamos diferentes botões que carregam um conteúdo de acordo com o nome do botão que é acionado.</p>
<pre class="brush: html">
&lt;div id=&quot;parte1&quot;&gt;
	&lt;h1&gt;Parte 1&lt;/h1&gt;
	&lt;p&gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam era&lt;/p&gt;
&lt;/div&gt;

&lt;div id=&quot;parte2&quot;&gt;
	&lt;h1&gt;Parte 2&lt;/h1&gt;
	&lt;p&gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam era&lt;/p&gt;
&lt;/div&gt;

&lt;div id=&quot;parte3&quot;&gt;
	&lt;h1&gt;Parte 3&lt;/h1&gt;
	&lt;p&gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam era&lt;/p&gt;
&lt;/div&gt;
</pre>
<p>A Figura 5 mostra o carregamento de uma parte depois que o botão “parte_1” é acionado:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/php-ajax/jquery-2.png" alt="Ajax com jQuery" title="Ajax com jQuery" /></div>
<p>Além do método load() a biblioteca JQuery ainda oferece outras opções para utilização de Ajax, a estrutura é bem semelhante a que vimos do load():</p>
<ul>
<li>$.post(url, parâmetros, função_retorno(data));</li>
<li>$.get(url, parâmetro, função_retorno(data));</li>
</ul>
<p>Aqui os parâmetros também são formatados especialmente, com uma lista de {variavel1: valor1, variavel2, valor2, &#8230;, variavelN, valor}.</p>
<p>A principal diferença é que ao invés de se colocar o conteúdo diretamente em um div selecionado, temos a opção de implementar uma função que tratará os dados de retorno. Nota-se que a diferença entre o $.post e o $.get está somente na questão de como os dados serão tratados no arquivo que receberá a requisição.</p>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Ajax com jQuery&lt;/title&gt;
&lt;style type=&quot;text/css&quot;&gt;
	#box {border:1px solid #ccc; padding:5px}
&lt;/style&gt;
&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
	$(&quot;input[type=button]&quot;).click(function(event) {
		var texto = $(&#039;#txt&#039;).attr(&quot;value&quot;);
		$.post(&#039;requisicao.php&#039;,{txt:texto},
		function call_back(data){
			$(&quot;#box&quot;).html(data);
		});
	});
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;p&gt;&lt;input type=&quot;text&quot; id=&quot;txt&quot; /&gt;&lt;/p&gt;
	&lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;Ok&quot; /&gt;&lt;/p&gt;
    &lt;div id=&quot;box&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Note que o terceiro parâmetro da invocação $.post é a declaração de uma nova função, chamada call_back e que apresenta um variável data. Por definição essa variável é o retorno da requisição efetuada.</p>
<pre class="brush: php">
&lt; ?php
$txt = $_POST[&#039;txt&#039;];
if(!empty($txt)){
	echo &quot;Você digitou: &quot; . $txt;
}
else{
	echo &quot;Campo está vazio.&quot;;
}
?&gt;
</pre>
<p>A Figura 6 mostra o exemplo depois da transferência da informação digitada.</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/php-ajax/jquery-3.png" alt="Ajax com jQuery" title="Ajax com jQuery" /></div>
<h3>Conclusão</h3>
<p>A tecnologia Ajax está presente na maioria dos grandes sites: Google, Twitter, Facebook, entre outros. Com a evolução da Internet houve a necessidade de implementar algum recurso que suprisse a a deficiência do modelo requisição-resposta do protocolo HTTP. Por esse motivo, quando se fala em Ajax, têm-se a ideia de algo novo, relacionado com as novidades que compõem a Internet 2.0.</p>
<p>O primeiro exemplo tenta demonstra em baixo nível como realmente funciona uma implementação em Ajax, explorando suas propriedades. Desta forma, conceitua-se como funcionamento do modelo requisição-resposta de forma assíncrona.</p>
<p>O segundo exemplo utiliza a biblioteca JQuery e demonstra a utilização de seus recursos para a implementação utilizando Ajax. Desta forma, fica claro que a primeira implementação funciona bem para pequenos sistemas, entretanto ao se deparar com projetos maiores, têm-se a necessidade de alguma ferramenta que encapsule a camada de Ajax, assim como o JQuery faz.</p>
<p>Existem ainda ferramentas que auxiliam no desenvolvimento com Ajax em um nível mais abstrato, como por exemplo o Sajax para a linguagem PHP. O framework é composto por uma classe e uma série de regras que em resumo transformam uma função escrita na própria linguagem PHP em uma função JavaScript. Uma de suas desvantagens é a quantidade se “sujeira” gerada na página em que o Sajax funciona, para mapear a função ele precisa escrever uma série de outras funções em JavaScript que mascaram toda a camada Ajax.</p>
<p>Por fim, é importante salientar que Ajax é uma tecnologia que pode ser vinculada a qualquer linguagem de programação para web. A parte inicial demonstrada nesse artigo, é bastante parecida para todas as linguagens, mas existem inúmeras ferramentas e frameworks específicos para as linguagens que ajudam em sua utilização.</p>
<p><a href="http://www.pinceladasdaweb.com.br/blog/uploads/php-ajax/php-ajax.rar" title="Download dos arquivos" rel="alternate enclosure">Faça aqui o download</a> dos arquivos de exemplo utilizados nesse post.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/">Aplicações dinâmicas com PHP e Ajax</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/28/ajax-image-gallery/" title="Ajax Image Gallery">Ajax Image Gallery</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/22/carregar-botao-like-do-facebook-via-ajax/" title="Carregar botão Like do Facebook via Ajax">Carregar botão Like do Facebook via Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2009/08/03/ajax-load-com-jquery/" title="Ajax load com jQuery">Ajax load com jQuery</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2009/05/11/ajax-com-jquery-metodo-load/" title="Ajax com jQuery &#8211; Método load()">Ajax com jQuery &#8211; Método load()</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2006/10/23/tutocle-tutoriais-para-desenvolvedores-web/" title="Tutocle &#8211; Tutoriais para desenvolvedores web">Tutocle &#8211; Tutoriais para desenvolvedores web</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/IUrF6xPcHVfRZ7JIZtfIm2bUIak/0/da"><img src="http://feedads.g.doubleclick.net/~a/IUrF6xPcHVfRZ7JIZtfIm2bUIak/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/IUrF6xPcHVfRZ7JIZtfIm2bUIak/1/da"><img src="http://feedads.g.doubleclick.net/~a/IUrF6xPcHVfRZ7JIZtfIm2bUIak/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bWl478kPFpg:BS6PT4dy_0Y:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=bWl478kPFpg:BS6PT4dy_0Y:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bWl478kPFpg:BS6PT4dy_0Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bWl478kPFpg:BS6PT4dy_0Y:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bWl478kPFpg:BS6PT4dy_0Y:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bWl478kPFpg:BS6PT4dy_0Y:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=bWl478kPFpg:BS6PT4dy_0Y:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bWl478kPFpg:BS6PT4dy_0Y:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=bWl478kPFpg:BS6PT4dy_0Y:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bWl478kPFpg:BS6PT4dy_0Y:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=bWl478kPFpg:BS6PT4dy_0Y:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/bWl478kPFpg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/</feedburner:origLink></item>
		<item>
		<title>Sorteio: Livro Smashing HTML5</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/LBqXf4rL578/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2012/02/14/sorteio-livro-smashing-html5/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 13:56:47 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5345</guid>
		<description><![CDATA[Em mais uma parceria de sucesso com a Bookman Editora, irei sortear aqui no blog o livro Smashing HTML5, de Bill Sanders, que foi inclusive revisado pelo Diego Eis. Se você quer aprender mais sobre HTML5 e ficou interessado na promoção, para participar é muito fácil. A partir de hoje, dia 14 de Fevereiro, até [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2012/02/14/sorteio-livro-smashing-html5/">Sorteio: Livro Smashing HTML5</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/html5/html5-wallpaper.jpg" alt="HTML5" title="HTML5" /></div>
<p>Em mais uma parceria de sucesso com a <a href="http://www.grupoa.com.br/site/default.aspx" title="Grupo A" rel="external">Bookman Editora</a>, irei sortear aqui no blog o livro <a href="http://www.grupoa.com.br/site/exatas-sociais-e-aplicadas/2/99/104/5918/5919/0/smashing-html5.aspx" title="Smashing HTML5">Smashing HTML5, de Bill Sanders</a>, que foi inclusive revisado pelo <a href="http://tableless.com.br/" title="Tableless" rel="external">Diego Eis</a>.</p>
<p><span id="more-5345"></span></p>
<p>Se você quer aprender mais sobre HTML5 e ficou interessado na promoção, para participar é muito fácil. A partir de hoje, dia 14 de Fevereiro, até o dia 19 de Fevereiro de 2012 o formulário de comentários estará aberto, portanto, basta você deixar um comentário com um e-mail válido e você já está concorrendo. A ferramenta que utilizarei para o sorteio será o <a href="http://random.org" title="Random.org" rel="external">Random.org</a>.</p>
<p>Após o sorteio entrarei em contato imediatamente por e-mail com o ganhador, e caso nas próximas 72 horas eu não obtenha nenhuma resposta, farei um novo sorteio.</p>
<p>Mas não fique triste se você não for o feliz ganhador, você pode comprar o livro com 20% de desconto até o dia 29 de Fevereiro de 2012 utilizando o seguinte código no carrinho de compras: <strong>pinceladashtml5</strong>.</p>
<p>Abaixo você pode ler maiores informações sobre o livro:</p>
<p>&#8220;HTML5 está cheia de recursos incríveis, incluindo os novos elementos específicos de conteúdo e controles de formulário, o elemento canvas para desenho, a reprodução de áudio e vídeo e muitos outros. Mas por onde começar? Com Smashing HTML5, você tem tudo o que precisa para fazer a transição para a nova versão da linguagem e começar a trabalhar rapidamente. Fiel à missão do Smashing Magazine (smashingmagazine.com), um dos sites de Web design mais populares do mundo, este é um guia prático para a construção de sites modernos e atraentes que aproveitam todas as vantagens dos recursos oferecidos por HTML5.&#8221;</p>
<p>O ganhador da promoção foi o <a href="http://www.pinceladasdaweb.com.br/blog/2012/02/14/sorteio-livro-smashing-html5/#comment-291437" title="Ganhador da promoção" rel="alternate">Rafael cardoso</a></p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2012/02/14/sorteio-livro-smashing-html5/">Sorteio: Livro Smashing HTML5</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/11/grayscale-images-hover-com-html5-cross-browser/" title="Grayscale Images Hover com HTML5 Cross Browser">Grayscale Images Hover com HTML5 Cross Browser</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/07/06/sorteio-livro-html5-do-maujor/" title="Sorteio: Livro HTML5 do Maujor">Sorteio: Livro HTML5 do Maujor</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/06/30/tabela-semantica-html5/" title="Tabela Semântica no HTML5">Tabela Semântica no HTML5</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/04/27/html5-canvas-o-basico/" title="HTML5 Canvas &#8211; O Básico">HTML5 Canvas &#8211; O Básico</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/03/25/o-internet-explorer-9-e-um-navegador-moderno/" title="O Internet Explorer 9 é um navegador moderno?">O Internet Explorer 9 é um navegador moderno?</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/kSbl84vrAa3FQQwmvL1REPaeHkI/0/da"><img src="http://feedads.g.doubleclick.net/~a/kSbl84vrAa3FQQwmvL1REPaeHkI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/kSbl84vrAa3FQQwmvL1REPaeHkI/1/da"><img src="http://feedads.g.doubleclick.net/~a/kSbl84vrAa3FQQwmvL1REPaeHkI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=LBqXf4rL578:esv2WU19ndc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=LBqXf4rL578:esv2WU19ndc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=LBqXf4rL578:esv2WU19ndc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=LBqXf4rL578:esv2WU19ndc:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=LBqXf4rL578:esv2WU19ndc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=LBqXf4rL578:esv2WU19ndc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=LBqXf4rL578:esv2WU19ndc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=LBqXf4rL578:esv2WU19ndc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=LBqXf4rL578:esv2WU19ndc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=LBqXf4rL578:esv2WU19ndc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=LBqXf4rL578:esv2WU19ndc:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/LBqXf4rL578" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2012/02/14/sorteio-livro-smashing-html5/feed/</wfw:commentRss>
		<slash:comments>257</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2012/02/14/sorteio-livro-smashing-html5/</feedburner:origLink></item>
		<item>
		<title>Webservice – Consulta de CEP diretamente ao site dos correios</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/zxeHWzdNHV4/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 10:30:32 +0000</pubDate>
		<dc:creator>Felipe Roberto</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webservice]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5333</guid>
		<description><![CDATA[Até pouco tempo, tinhamos um site onde podiamos fazer consultas via get, ou até baixar a base de dados utilizada de forma gratuita. Mas seu maior problema para todos que já utilizaram tal base era o fato desta ser muito antiga. Com isso surgia o problema de ruas e bairros com nomes errados ou até [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/">Webservice &#8211; Consulta de CEP diretamente ao site dos correios</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/correios.png" alt="Correios" title="Correios" /></div>
<p>Até pouco tempo, tinhamos um site onde podiamos fazer consultas via get, ou até baixar a base de dados utilizada de forma gratuita. Mas seu maior problema para todos que já utilizaram tal base era o fato desta ser muito antiga. Com isso surgia o problema de ruas e bairros com nomes errados ou até mesmo não existentes. O tempo passou, a base ficou ainda mais velha e o site passou a cobrar pelos serviços. Mas não tem problema, os correios que antes tinham um sistema que não permitia se aproveitar dos dados (gerava as respostas em imagens), hoje nos disponibiliza uma versão mobile que facilmente nos permite tratar as respostas.</p>
<p>Para criarmos nosso próprio webservice em PHP vamos simular o comportamento realizado pelo site através de requisições cURL.</p>
<p><span id="more-5333"></span></p>
<p>Aqui incluimos biblioteca phpQuery (<a href="http://code.google.com/p/phpquery/" title="phpQuery" rel="external">http://code.google.com/p/phpquery/</a> que permite manipular conteúdo html atrvés de seleções tipo jquery/css):</p>
<pre class="brush: php">
include(&#039;phpQuery-onefile.php&#039;);
</pre>
<p>Após criamos uma função para fazermos requisições via cURL, para depois tratarmos com o phpQuery.</p>
<pre class="brush: php">
function simple_curl($url,$post=array(),$get=array()){
	$url = explode(&#039;?&#039;,$url,2);
	if(count($url)===2){
		$temp_get = array();
		parse_str($url[1],$temp_get);
		$get = array_merge($get,$temp_get);
	}

	$ch = curl_init($url[0].&quot;?&quot;.http_build_query($get));
	curl_setopt ($ch, CURLOPT_POST, 1);
	curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($post));
	curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	return curl_exec ($ch);
}
</pre>
<p>Depois de ambiente preparado, mãos as teclas. Aqui esta o cep a ser consultado:</p>
<pre class="brush: php">
$cep = $_GET[&#039;cep&#039;];
</pre>
<p>Fazemos uma chamada POST direta aos correios <a href="http://m.correios.com.br/movel/buscaCepConfirma.do" title="Consulta de CEP nos correios" rel="external">http://m.correios.com.br/movel/buscaCepConfirma.do</a>. Para entender, acesse a url pelo navegador e faça uma consulta, nosso webservice fará o mesmo, mas atráves do servidor.</p>
<p>Aqui é onde capturamos o HTML através da chamada cURL, enviando os parametros necessários.</p>
<pre class="brush: php">
$html = simple_curl(&#039;http://m.correios.com.br/movel/buscaCepConfirma.do&#039;,array(
	&#039;cepEntrada&#039;=&gt;$cep,
	&#039;tipoCep&#039;=&gt;&#039;&#039;,
	&#039;cepTemp&#039;=&gt;&#039;&#039;,
	&#039;metodo&#039;=&gt;&#039;buscarCep&#039;
));
</pre>
<p>Fazemos o phpQuery ler o HTML capturado:</p>
<pre class="brush: php">
phpQuery::newDocumentHTML($html, $charset = &#039;utf-8&#039;);
</pre>
<p>Aqui tratamos os dados com o phpQuery a função pq(), é equivalente ao $() do jQuery $(#id elemento.classe).html() em jQuery, e em PHP pq(#id elemento.classe)->html(). Então temos nosso logradouro, bairro, cidade/uf e cep:</p>
<pre class="brush: php">
$dados =
array(
	&#039;logradouro&#039;=&gt; trim(pq(&#039;.caixacampobranco .resposta:contains(&quot;Logradouro: &quot;) + .respostadestaque:eq(0)&#039;)-&gt;html()),
	&#039;bairro&#039;=&gt; trim(pq(&#039;.caixacampobranco .resposta:contains(&quot;Bairro: &quot;) + .respostadestaque:eq(0)&#039;)-&gt;html()),
	&#039;cidade/uf&#039;=&gt; trim(pq(&#039;.caixacampobranco .resposta:contains(&quot;Localidade / UF: &quot;) + .respostadestaque:eq(0)&#039;)-&gt;html()),
	&#039;cep&#039;=&gt; trim(pq(&#039;.caixacampobranco .resposta:contains(&quot;CEP: &quot;) + .respostadestaque:eq(0)&#039;)-&gt;html())
);
</pre>
<p>Como nem tudo é perfeito, temos que tratar as informações de cidade/uf que vem &#8216;grudadas&#8217;:</p>
<pre class="brush: php">
$dados[&#039;cidade/uf&#039;] = explode(&#039;/&#039;,$dados[&#039;cidade/uf&#039;]);
$dados[&#039;cidade&#039;] = trim($dados[&#039;cidade/uf&#039;][0]);
$dados[&#039;uf&#039;] = trim($dados[&#039;cidade/uf&#039;][1]);
unset($dados[&#039;cidade/uf&#039;]);
</pre>
<p>Pronto, basta agora imprimir no formato json e começar a fazer as requisições via ajax:</p>
<pre class="brush: php">
die(json_encode($dados));
</pre>
<p>Ao invés do phpQuery, podiamos ter usado o YQL, porém teriamos dobrado o numero de requições, pois chamariamos o servidor do yahoo que por sua vez chamaria o servidor dos correios</p>
<p>Façaa <a href="http://www.pinceladasdaweb.com.br/blog/uploads/webservice-cep.rar" title="Download dos arquivos de exemplo" rel="alternate enclosure">aqui o download</a> dos arquivos de exemplo.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/">Webservice &#8211; Consulta de CEP diretamente ao site dos correios</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/" title="Aplicações dinâmicas com PHP e Ajax">Aplicações dinâmicas com PHP e Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/10/07/ler-feed-de-outros-sites-com-simplepie/" title="Ler feed de outros sites com SimplePie">Ler feed de outros sites com SimplePie</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/23/php-random-html/" title="PHP Random HTML">PHP Random HTML</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/24/endentacao-codigo-tab-espacos/" title="Endentação do código &#8211; TAB vs Espaços">Endentação do código &#8211; TAB vs Espaços</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/24/comecando-php-salvando/" title="Começando com PHP &#8211; Salvando o código">Começando com PHP &#8211; Salvando o código</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/HdBI7cV8H0ArxXrKVasIgoZdLxA/0/da"><img src="http://feedads.g.doubleclick.net/~a/HdBI7cV8H0ArxXrKVasIgoZdLxA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HdBI7cV8H0ArxXrKVasIgoZdLxA/1/da"><img src="http://feedads.g.doubleclick.net/~a/HdBI7cV8H0ArxXrKVasIgoZdLxA/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zxeHWzdNHV4:ndyRfCEZPxk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=zxeHWzdNHV4:ndyRfCEZPxk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zxeHWzdNHV4:ndyRfCEZPxk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zxeHWzdNHV4:ndyRfCEZPxk:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zxeHWzdNHV4:ndyRfCEZPxk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zxeHWzdNHV4:ndyRfCEZPxk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=zxeHWzdNHV4:ndyRfCEZPxk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zxeHWzdNHV4:ndyRfCEZPxk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=zxeHWzdNHV4:ndyRfCEZPxk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zxeHWzdNHV4:ndyRfCEZPxk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=zxeHWzdNHV4:ndyRfCEZPxk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/zxeHWzdNHV4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/</feedburner:origLink></item>
		<item>
		<title>ceplivre – API de CEPs para formulários</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/bVZuj48kYZQ/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/12/19/ceplivre-api-de-ceps-para-formularios/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 09:57:46 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5311</guid>
		<description><![CDATA[Você provavelmente já deve ter passado por um daqueles formulários onde ao colocar o CEP da rua onde você mora, ele automaticamente preenche os outros campos com o seu endereço. Pois bem, por trás disso existe um simples código que busca em um banco de dados seu endereço através do seu CEP. Até aí tudo [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/12/19/ceplivre-api-de-ceps-para-formularios/">ceplivre &#8211; API de CEPs para formulários</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/cep-livre.jpg" alt="Ceplivre" title="Ceplivre" /></div>
<p>Você provavelmente já deve ter passado por um daqueles formulários onde ao colocar o CEP da rua onde você mora, ele automaticamente preenche os outros campos com o seu endereço. Pois bem, por trás disso existe um simples código que busca em um banco de dados seu endereço através do seu CEP.</p>
<p><span id="more-5311"></span></p>
<p>Até aí tudo bem, mas e para desenvolver uma engenhoca dessa? Manter o seu banco de dados com os CEPs de todo o brasil atualizados não é tarefa fácil, por isso indico a vocês um site que acabei descobrindo esses dias, o <a href="http://ceplivre.com.br/" title="ceplivre" rel="external">ceplivre</a>, onde através do seu sistema provem informações básicas de endereços, códigos do IBGE, códigos DDD (Discagem Direta à Distância), altitude, área e coordenadas (latitude e longitude) de todas as cidades brasileiras.</p>
<p>Para você ter idéia, hoje o <a href="http://ceplivre.com.br/" title="ceplivre" rel="external">ceplivre</a> conta com uma base de mais de 630.000 CEPs cadastrados que são atualizados diariamente. Manter uma base dessas atualizada não é tarefa fácil, por isso eles dispõem de diversos planos, desde o plano Free, onde você pode efetuar até 15 consultas por dia, até o Plano Premium, com pesquisas ilimitadas e acesso a todas as features do sistema.</p>
<p>O webservice do <a href="http://ceplivre.com.br/" title="ceplivre" rel="external">ceplivre</a> é compatível com todas as principais linguagens de programação web, entregando dados em formatos CSV, XML e JSON. Para utilizar o sistema é simples, basta desenvolver uma rotina que faça acessos HTTP ao servidor, onde as URLs de pesquisa seguem a seguinte estrutura:</p>
<pre class="brush: html">

http://ceplivre.com.br/consultar/$tipo/$key/$busca/$formato
</pre>
<ul>
<li><strong>$tipo</strong> é o tipo de busca, por CEP (cep) ou por endereço (logradouro).</li>
<li><strong>$key</strong> é a chave de autenticação enviada por e-mail na confirmação da assinatura.</li>
<li><strong>$busca</strong> é o termo de busca. Se for um CEP, o código (01001-000). Se for um endereço, parte do nome (Paulista).</li>
<li><strong>$formato</strong> é o formato do resultado da busca que pode ser XML (xml), CSV (csv) ou JSON (json).</li>
</ul>
<p>Portanto, para efetuar uma busca em formato JSON, basta utilizar a seguinte URL:</p>
<pre class="brush: html">

http://ceplivre.com.br/consultar/cep/sua_key_aqui/01001-000/json
</pre>
<p>Estando tudo Ok, seria retornado o seguinte JSON:</p>
<pre class="brush: js">
{

    &quot;cep&quot;: [
        {
            &quot;tp_logradouro&quot;: &quot;Praça&quot;,
            &quot;tp_logradouro_id&quot;: &quot;8&quot;,
            &quot;logradouro&quot;: &quot;da Sé&quot;,
            &quot;bairro&quot;: &quot;Sé&quot;,
            &quot;cidade&quot;: &quot;São Paulo&quot;,
            &quot;uf_sigla&quot;: &quot;SP&quot;,
            &quot;ufnome&quot;: &quot;São Paulo&quot;,
            &quot;id_estado_ibge&quot;: &quot;35&quot;,
            &quot;cep&quot;: &quot;01001-000&quot;,
            &quot;muncoddv&quot;: &quot;3550308&quot;,
            &quot;ddd&quot;: &quot;11&quot;,
            &quot;altitude&quot;: &quot;760&quot;,
            &quot;latitude&quot;: &quot;-23.548&quot;,
            &quot;longitude&quot;: &quot;-46.636&quot;,
            &quot;area&quot;: &quot;1522.986&quot;,
            &quot;capital&quot;: &quot;S&quot;
        }
    ]

}
</pre>
<p>Agora por exemplo eu poderia manipular esses dados com JavaScript para dar mais interatividade ao meu formulário quando o usuário preencher o campo CEP.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/12/19/ceplivre-api-de-ceps-para-formularios/">ceplivre &#8211; API de CEPs para formulários</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/" title="Instagr.am API">Instagr.am API</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/10/10/ler-feeds-com-o-google-jsapi/" title="Ler Feeds com o Google JSAPI">Ler Feeds com o Google JSAPI</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/07/23/galeria-de-fotos-com-a-api-do-flickr-e-jquery/" title="Galeria de fotos com a API do Flickr e jQuery">Galeria de fotos com a API do Flickr e jQuery</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/JBImck-OVaJ0lOrOfmSKlKUox58/0/da"><img src="http://feedads.g.doubleclick.net/~a/JBImck-OVaJ0lOrOfmSKlKUox58/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/JBImck-OVaJ0lOrOfmSKlKUox58/1/da"><img src="http://feedads.g.doubleclick.net/~a/JBImck-OVaJ0lOrOfmSKlKUox58/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bVZuj48kYZQ:tSlD-EasSck:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=bVZuj48kYZQ:tSlD-EasSck:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bVZuj48kYZQ:tSlD-EasSck:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bVZuj48kYZQ:tSlD-EasSck:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bVZuj48kYZQ:tSlD-EasSck:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bVZuj48kYZQ:tSlD-EasSck:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=bVZuj48kYZQ:tSlD-EasSck:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bVZuj48kYZQ:tSlD-EasSck:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=bVZuj48kYZQ:tSlD-EasSck:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=bVZuj48kYZQ:tSlD-EasSck:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=bVZuj48kYZQ:tSlD-EasSck:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/bVZuj48kYZQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/12/19/ceplivre-api-de-ceps-para-formularios/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/12/19/ceplivre-api-de-ceps-para-formularios/</feedburner:origLink></item>
		<item>
		<title>Sorteio – Livro Smashing CSS</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/kB0z_LFXNUk/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/12/12/sorteio-livro-smashing-css/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 10:15:31 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5298</guid>
		<description><![CDATA[Já que o Natal está próximo, eu em conjunto com a Bookman Editora, iremos sortear um exemplar do livro Smashing CSS, sim, aquele famoso livro escrito por Eric Meyer, com a revisão técnica de Diego Eis. Veja abaixo um breve resumo sobre o livro: mashing CSS vai muito além do básico, mostrando desde a seleção [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/12/12/sorteio-livro-smashing-css/">Sorteio &#8211; Livro Smashing CSS</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/smashing-css.jpg" alt="Smashing CSS" /></div>
<p>Já que o Natal está próximo, eu em conjunto com a <a href="http://www.grupoa.com.br/site/Default.aspx" title="Bookman Editora" rel="external">Bookman Editora</a>, iremos sortear um exemplar do livro <a href="http://www.grupoa.com.br/site/exatas-sociais-e-aplicadas/2/99/104/4926/4927/0/smashing-css.aspx" title="Smashing CSS" rel="external">Smashing CSS</a>, sim, aquele famoso livro escrito por <a href="http://meyerweb.com/" title="Eric Meyer" rel="external">Eric Meyer</a>, com a revisão técnica de <a href="http://about.me/diegoeis/" title="Sobre Diego Eis" rel="external">Diego Eis</a>.</p>
<p><span id="more-5298"></span></p>
<p>Veja abaixo um breve resumo sobre o livro:</p>
<p>mashing CSS vai muito além do básico, mostrando desde a seleção das ferramentas corretas até os efeitos com CSS, as técnicas CSS3 com jQuery e o futuro com o uso de HTML5 e CSS3. Poucas pessoas na indústria podem mostrar as vantagens e desvantagens da CSS como Eric Meyer, e neste livro o autor fornece técnicas perfeitas, totalmente úteis e universalmente aplicáveis no mundo real.</p>
<p>Fiel à missão do Smashing Magazine (smashingmagazine.com), um dos sites de Web design mais populares do mundo, Smashing CSS é o guia prático para a construção de layouts modernos na Web.</p>
<p>O que você precisa fazer para participar? Basta deixar um comentário nesse post utilizando um e-mail válido, para caso você seja o vencedor eu possa entrar em contato. O formulário de comentários ficará aberto por uma semana a contar da data de publicação desse post. O sorteio será efetuado utilizando o <a href="http://random.org" title="Random.org" rel="external">Random.org</a>.</p>
<p>Mas não fique triste, se você não for o feliz ganhador, você ainda pode comprar o livro com 20% de desconto utilizando o seguinte código: <strong>pinceladasdaweb</strong>. Mas atenção, a validade desse código é somente um mês. Boa sorte a todos os participantes.</p>
<p>O ganhador foi o <a href="http://www.pinceladasdaweb.com.br/blog/2011/12/12/sorteio-livro-smashing-css/#comment-264285" title="Marcelo Oliveira" rel="alternate">Marcelo Oliveira</a>.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/12/12/sorteio-livro-smashing-css/">Sorteio &#8211; Livro Smashing CSS</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2010/08/19/css-cookbook/" title="CSS Cookbook">CSS Cookbook</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2010/02/02/css3-gradients-e-html5-databases/" title="CSS3 Gradients &#038; HTML5 Databases">CSS3 Gradients &#038; HTML5 Databases</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2008/11/18/seletores-css-com-jquery/" title="Seletores CSS com jQuery">Seletores CSS com jQuery</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2008/11/05/peppy-seletor-javascript-css3-mais-rapido-da-web/" title="Peppy &#8211; Seletor JavaScript CSS3 mais rápido da Web">Peppy &#8211; Seletor JavaScript CSS3 mais rápido da Web</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2008/09/09/css3-seletor-not/" title="CSS3 &#8211; Seletor :not()">CSS3 &#8211; Seletor :not()</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/8JgtN9CtXu-GAjup8KFLJcBPRGE/0/da"><img src="http://feedads.g.doubleclick.net/~a/8JgtN9CtXu-GAjup8KFLJcBPRGE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8JgtN9CtXu-GAjup8KFLJcBPRGE/1/da"><img src="http://feedads.g.doubleclick.net/~a/8JgtN9CtXu-GAjup8KFLJcBPRGE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=kB0z_LFXNUk:CsSojvEKdWo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=kB0z_LFXNUk:CsSojvEKdWo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=kB0z_LFXNUk:CsSojvEKdWo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=kB0z_LFXNUk:CsSojvEKdWo:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=kB0z_LFXNUk:CsSojvEKdWo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=kB0z_LFXNUk:CsSojvEKdWo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=kB0z_LFXNUk:CsSojvEKdWo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=kB0z_LFXNUk:CsSojvEKdWo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=kB0z_LFXNUk:CsSojvEKdWo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=kB0z_LFXNUk:CsSojvEKdWo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=kB0z_LFXNUk:CsSojvEKdWo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/kB0z_LFXNUk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/12/12/sorteio-livro-smashing-css/feed/</wfw:commentRss>
		<slash:comments>316</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/12/12/sorteio-livro-smashing-css/</feedburner:origLink></item>
		<item>
		<title>Ajax Image Gallery</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/rhZqssqp9ak/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/11/28/ajax-image-gallery/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 09:53:39 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5283</guid>
		<description><![CDATA[Criar galerias de imagens provavelmente é o que os desenvolvedores mais fazem no dia-a-dia, e pra facilitar isso, vou deixar aqui um exemplo de um código paraa criar uma galeria de imagens com a utilização de Ajax. O HTML é extremamente simples, crio um elemento para englobar a imagem maior, e os thumbnails são links [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/11/28/ajax-image-gallery/">Ajax Image Gallery</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/ajax-image-gallery/ajax-image-gallery.jpg" alt="Ajax Image Gallery" title="Ajax Image Gallery" /></div>
<p>Criar galerias de imagens provavelmente é o que os desenvolvedores mais fazem no dia-a-dia, e pra facilitar isso, vou deixar aqui um exemplo de um código paraa criar uma galeria de imagens com a utilização de Ajax.</p>
<p><span id="more-5283"></span></p>
<p>O HTML é extremamente simples, crio um elemento para englobar a imagem maior, e os thumbnails são links para as imagens maiores:</p>
<pre class="brush: html">
&lt;div id=&quot;container&quot;&gt;
    &lt;div id=&quot;placeholder&quot;&gt;
    	&lt;img id=&quot;current&quot; src=&quot;imgs/img1.jpg&quot; alt=&quot;Galeria de Imagens com Ajax&quot; title=&quot;Galeria de Imagens com Ajax&quot; /&gt;
    &lt;/div&gt;
    &lt;ul&gt;
    	&lt;li&gt;&lt;a class=&quot;active&quot; href=&quot;imgs/img1.jpg&quot; title=&quot;Galeria de Imagens com Ajax&quot; rel=&quot;alternate&quot;&gt;&lt;img src=&quot;imgs/thumb-img1.jpg&quot; alt=&quot;Galeria de Imagens com Ajax&quot; title=&quot;Galeria de Imagens com Ajax&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;imgs/img2.jpg&quot; title=&quot;Galeria de Imagens com Ajax&quot; rel=&quot;alternate&quot;&gt;&lt;img src=&quot;imgs/thumb-img2.jpg&quot; alt=&quot;Galeria de Imagens com Ajax&quot; title=&quot;Galeria de Imagens com Ajax&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;imgs/img3.jpg&quot; title=&quot;Galeria de Imagens com Ajax&quot; rel=&quot;alternate&quot;&gt;&lt;img src=&quot;imgs/thumb-img3.jpg&quot; alt=&quot;Galeria de Imagens com Ajax&quot; title=&quot;Galeria de Imagens com Ajax&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
        ...
    &lt;/ul&gt;
&lt;/div&gt;
</pre>
<p>E depois o resto fica por conta do JavaScript:</p>
<pre class="brush: js">
        //Flag criada para evitar que 2 imagens sejam abertas ao mesmo tempo
        var working = false;

	$(&#039;li a&#039;).click(function(e){
		e.preventDefault();
		if($(this).hasClass(&#039;active&#039;)) return;

		if(working){
	    	    return false;
	        }

		working = true;

		var imgUrl = $(this).attr(&#039;href&#039;),
		img = new Image();

		$(&#039;li a&#039;).removeClass(&#039;active&#039;);
		$(this).addClass(&#039;active&#039;);

		$(&quot;#current&quot;).remove();
		$(&#039;#placeholder&#039;).addClass(&#039;loading&#039;);

		$(img).load(function(){
			$(this).css({display: &#039;none&#039;});
			$(&#039;#placeholder&#039;).removeClass(&#039;loading&#039;).append(img);
			$(img).fadeIn();
			working = false;
		}).attr(&#039;src&#039;,imgUrl).attr(&#039;id&#039;,&#039;current&#039;);
	});
</pre>
<ul>
<li><a href="http://www.pinceladasdaweb.com.br/blog/uploads/ajax-image-gallery/" title="Ajax Image Gallery" rel="alternate">Ver exemplo</a></li>
<li><a href="http://www.pinceladasdaweb.com.br/blog/uploads/ajax-image-gallery/ajax-image-gallery.rar" title="Ajax Image Gallery" rel="alternate enclosure">Download</a></li>
</ul>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/11/28/ajax-image-gallery/">Ajax Image Gallery</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/" title="Aplicações dinâmicas com PHP e Ajax">Aplicações dinâmicas com PHP e Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/22/carregar-botao-like-do-facebook-via-ajax/" title="Carregar botão Like do Facebook via Ajax">Carregar botão Like do Facebook via Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2009/08/03/ajax-load-com-jquery/" title="Ajax load com jQuery">Ajax load com jQuery</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2009/05/11/ajax-com-jquery-metodo-load/" title="Ajax com jQuery &#8211; Método load()">Ajax com jQuery &#8211; Método load()</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/" title="Instagr.am API">Instagr.am API</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/8Nc7CksaNwTzdgHJ1FnPIdOF2ts/0/da"><img src="http://feedads.g.doubleclick.net/~a/8Nc7CksaNwTzdgHJ1FnPIdOF2ts/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8Nc7CksaNwTzdgHJ1FnPIdOF2ts/1/da"><img src="http://feedads.g.doubleclick.net/~a/8Nc7CksaNwTzdgHJ1FnPIdOF2ts/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=rhZqssqp9ak:zK7GSHuW7sc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=rhZqssqp9ak:zK7GSHuW7sc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=rhZqssqp9ak:zK7GSHuW7sc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=rhZqssqp9ak:zK7GSHuW7sc:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=rhZqssqp9ak:zK7GSHuW7sc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=rhZqssqp9ak:zK7GSHuW7sc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=rhZqssqp9ak:zK7GSHuW7sc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=rhZqssqp9ak:zK7GSHuW7sc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=rhZqssqp9ak:zK7GSHuW7sc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=rhZqssqp9ak:zK7GSHuW7sc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=rhZqssqp9ak:zK7GSHuW7sc:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/rhZqssqp9ak" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/11/28/ajax-image-gallery/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/11/28/ajax-image-gallery/</feedburner:origLink></item>
		<item>
		<title>Instagr.am API</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/GsMlNzRVZIo/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 09:50:31 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5264</guid>
		<description><![CDATA[O Instagram é um serviço de compartilhamento de fotos pelo celular, por enquanto disponível somente para usuários de iPhone (Sorry, Android Users). Através do aplicativo no celular, seus usuários tiram fotos em estilo Polaroid e podem enviá-las para seus amigos, compondo uma espécie de rede social. Assim como o twitter, você pode seguir pessoas e [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/">Instagr.am API</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/instagram/instagram-icon.png" alt="Instagram" title="Instagram" /></div>
<p>O <a href="http://instagr.am/" title="Instagram" rel="external">Instagram</a> é um serviço de compartilhamento de fotos pelo celular, por enquanto disponível somente para usuários de iPhone (Sorry, Android Users). Através do aplicativo no celular, seus usuários tiram fotos em estilo Polaroid e podem enviá-las para seus amigos, compondo uma espécie de rede social. Assim como o twitter, você pode seguir pessoas e ser seguido, enviando as fotos que retratam o seu cotidiano junto com textos curtos, e vendo fotos de amigos. Dá ainda para dizer, por geolocalização, onde as fotos foram tiradas.</p>
<p><span id="more-5264"></span></p>
<p>O serviço tem crescido drasticamente nos últimos dias, e hoje tem aproximadamente 12 milhões de usuários. E como qualquer outra aplicação pop, eles possuem uma API, onde você pode por exemplo mostrar suas últimas fotos em seu site, ou algo do tipo.</p>
<p>Antes de tudo, para utilizar a <a href="http://instagr.am/developer/" title="Instagram Developer API" rel="external">API</a> do Instagr.am, você deve ir <a href="http://instagr.am/developer/" title="Instagram Developer API" rel="external">até o site e criar um aplicativo</a> para obter um access token e um client id, sem os mesmos você não consegue fazer nada.</p>
<p>Com tudo isso OK, vamos a um exemplo prático, mostrar as últimas 20 fotos de um usuário qualquer do Instagr.am. O código responsável por isso você pode ver abaixo:</p>
<pre class="brush: js">
var accessToken = &#039;seu_access_token&#039;;
var username= &quot;nome_do_usuario&quot;;
var limit = 20; //Limite máximo de fotos
var setSize = &quot;small&quot;;

var instagram = function() {
	return {
		init: function() {
			instagram.getUser();
		},
		getUser: function() {
			var getUserURL = &#039;https://api.instagram.com/v1/users/search?q=&#039;+ username +&#039;&amp;access_token=&#039;+ accessToken +&#039;&#039;;
			$.ajax({
				type: &quot;GET&quot;,
				dataType: &quot;jsonp&quot;,
				cache: false,
				url: getUserURL,
				success: function(data) {
					var getUserID = data.data[0].id;
					instagram.loadImages(getUserID);
				}
			});
		},
		loadImages: function(userID) {
			var getImagesURL = &#039;https://api.instagram.com/v1/users/&#039;+ userID +&#039;/media/recent/?access_token=&#039;+ accessToken +&#039;&#039;;
			$.ajax({
				type: &quot;GET&quot;,
				dataType: &quot;jsonp&quot;,
				cache: false,
				url: getImagesURL,
				success: function(data) {
					for(var i = 0; i &lt; limit; i+=1) {
						if(setSize == &quot;small&quot;) {
							var size = data.data[i].images.thumbnail.url;
						} else if(setSize == &quot;medium&quot;) {
							var size = data.data[i].images.low_resolution.url;
						} else {
							var size = data.data[i].images.standard_resolution.url;
						}
						$(&quot;#instagram&quot;).append(&quot;&lt;li&gt;&lt;a target=&#039;_blank&#039; href=&#039;&quot; + data.data[i].link +&quot;&#039;&gt;&lt;img src=&#039;&quot; + size +&quot;&#039;/&gt;&lt;/a&gt;&quot;);
					}
				}
			});
		}
	}
}();

$(document).ready(function() {
    instagram.init();
});
</pre>
<p>Vocês podem ver <a href="http://www.pinceladasdaweb.com.br/blog/uploads/instagram/user/" title="Instagr.am" rel="alternate">aqui um exemplo</a> funcionando do código acima.</p>
<p>Você também pode pegar as últimas fotos mais populares, o código responsável por isso está abaixo:</p>
<pre class="brush: js">
var accessToken = &#039;seu_access_token&#039;;
var limit = 32; //Limite máximo de fotos
var setSize = &quot;small&quot;;

var instagram = function() {
	return {
		init: function() {
			instagram.loadImages();
		},
		loadImages: function() {
			var getImagesURL = &#039;https://api.instagram.com/v1/media/popular?access_token=&#039;+ accessToken +&#039;&#039;;
			$.ajax({
				type: &quot;GET&quot;,
				dataType: &quot;jsonp&quot;,
				cache: false,
				url: getImagesURL,
				success: function(data) {
					for(var i = 0; i &lt; limit; i+=1) {
						if(setSize == &quot;small&quot;) {
							var size = data.data[i].images.thumbnail.url;
						} else if(setSize == &quot;medium&quot;) {
							var size = data.data[i].images.low_resolution.url;
						} else {
							var size = data.data[i].images.standard_resolution.url;
						}
						$(&quot;#instagram&quot;).append(&quot;&lt;li&gt;&lt;a target=&#039;_blank&#039; href=&#039;&quot; + data.data[i].link +&quot;&#039;&gt;&lt;img src=&#039;&quot; + size +&quot;&#039;/&gt;&lt;/a&gt;&quot;);
					}
				}
			});
		}
	}
}();

$(document).ready(function() {
    instagram.init();
});
</pre>
<p>Vocês podem ver <a href="http://www.pinceladasdaweb.com.br/blog/uploads/instagram/popular/" title="Instagr.am" rel="alternate">aqui um exemplo</a> funcionando do código acima.</p>
<p>Caso você queira buscar por alguma tag, utilize o código abaixo:</p>
<pre class="brush: js">
var accessToken = &#039;seu_access_token&#039;;
var limit = 20; //Limite máximo de fotos
var setSize = &quot;small&quot;;

var instagram = function() {
	return {
		init: function() {
			instagram.loadImages();
		},
		loadImages: function() {
			var getImagesURL = &#039;https://api.instagram.com/v1/tags/html5/media/recent?client_id=be52cb013dda4c47a03cdd5689896c37&amp;access_token=&#039;+ accessToken +&#039;&#039;;
			$.ajax({
				type: &quot;GET&quot;,
				dataType: &quot;jsonp&quot;,
				cache: false,
				url: getImagesURL,
				success: function(data) {
					for(var i = 0; i &lt; limit ; i+=1) {
						if(setSize == &quot;small&quot;) {
							var size = data.data[i].images.thumbnail.url;
						} else if(setSize == &quot;medium&quot;) {
							var size = data.data[i].images.low_resolution.url;
						} else {
							var size = data.data[i].images.standard_resolution.url;
						}
						$(&quot;#instagram&quot;).append(&quot;&lt;li&gt;&lt;a target=&#039;_blank&#039; href=&#039;&quot; + data.data[i].link +&quot;&#039;&gt;&lt;img src=&#039;&quot; + size +&quot;&#039;/&gt;&lt;/a&gt;&quot;);
					}
				}
			});
		}
	}
}();

$(document).ready(function() {
    instagram.init();
});
</pre>
<p>Vocês podem ver <a href="http://www.pinceladasdaweb.com.br/blog/uploads/instagram/tags/" title="Instagr.am" rel="alternate">aqui um exemplo</a> funcionando do código acima.</p>
<p>Eu também posso buscar fotos por geolocalização, basta passar na requisição as coordenadas geográficas e ele busca todas as fotos em um raio máximo de 5 KM, como podem ver no código de exemplo abaixo:</p>
<pre class="brush: js">
var accessToken = &#039;seu_access_token&#039;;
var limit = 20; //Limite máximo de fotos
var setSize = &quot;small&quot;;

var instagram = function() {
	return {
		init: function() {
			instagram.loadImages();
		},
		loadImages: function() {
			var getImagesURL = &#039;https://api.instagram.com/v1/media/search?lat=52.370275&amp;lng=4.886055&amp;distance=5000?client_id=be52cb013dda4c47a03cdd5689896c37&amp;access_token=&#039;+ accessToken +&#039;&#039;;
			$.ajax({
				type: &quot;GET&quot;,
				dataType: &quot;jsonp&quot;,
				cache: false,
				url: getImagesURL,
				success: function(data) {
					for(var i = 0; i &lt; limit; i+=1) {
						if(setSize == &quot;small&quot;) {
							var size = data.data[i].images.thumbnail.url;
						} else if(setSize == &quot;medium&quot;) {
							var size = data.data[i].images.low_resolution.url;
						} else {
							var size = data.data[i].images.standard_resolution.url;
						}
						$(&quot;#instagram&quot;).append(&quot;&lt;li&gt;&lt;a target=&#039;_blank&#039; href=&#039;&quot; + data.data[i].link +&quot;&#039;&gt;&lt;img src=&#039;&quot; + size +&quot;&#039;/&gt;&lt;/a&gt;&quot;);
					}
				}
			});
		}
	}
}();

$(document).ready(function() {
    instagram.init();
});
</pre>
<p>Vocês podem ver <a href="http://www.pinceladasdaweb.com.br/blog/uploads/instagram/locations/" title="Instagr.am" rel="alternate">aqui um exemplo</a> funcionando do código acima.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/">Instagr.am API</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/12/19/ceplivre-api-de-ceps-para-formularios/" title="ceplivre &#8211; API de CEPs para formulários">ceplivre &#8211; API de CEPs para formulários</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/07/23/galeria-de-fotos-com-a-api-do-flickr-e-jquery/" title="Galeria de fotos com a API do Flickr e jQuery">Galeria de fotos com a API do Flickr e jQuery</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/" title="Aplicações dinâmicas com PHP e Ajax">Aplicações dinâmicas com PHP e Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/28/ajax-image-gallery/" title="Ajax Image Gallery">Ajax Image Gallery</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/11/grayscale-images-hover-com-html5-cross-browser/" title="Grayscale Images Hover com HTML5 Cross Browser">Grayscale Images Hover com HTML5 Cross Browser</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/DFWvEmfAJtZM7vjdAqrfcfcxHI8/0/da"><img src="http://feedads.g.doubleclick.net/~a/DFWvEmfAJtZM7vjdAqrfcfcxHI8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/DFWvEmfAJtZM7vjdAqrfcfcxHI8/1/da"><img src="http://feedads.g.doubleclick.net/~a/DFWvEmfAJtZM7vjdAqrfcfcxHI8/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=GsMlNzRVZIo:1uqN8wVaqFU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=GsMlNzRVZIo:1uqN8wVaqFU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=GsMlNzRVZIo:1uqN8wVaqFU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=GsMlNzRVZIo:1uqN8wVaqFU:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=GsMlNzRVZIo:1uqN8wVaqFU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=GsMlNzRVZIo:1uqN8wVaqFU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=GsMlNzRVZIo:1uqN8wVaqFU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=GsMlNzRVZIo:1uqN8wVaqFU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=GsMlNzRVZIo:1uqN8wVaqFU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=GsMlNzRVZIo:1uqN8wVaqFU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=GsMlNzRVZIo:1uqN8wVaqFU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/GsMlNzRVZIo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/</feedburner:origLink></item>
		<item>
		<title>Grayscale Images Hover com HTML5 Cross Browser</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/QpfTDloFF5g/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/11/11/grayscale-images-hover-com-html5-cross-browser/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 20:26:02 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5256</guid>
		<description><![CDATA[A um tempo atrás o blog Web Designer Wall fez mais um de seus interessantes posts mostrando como é possível criar imagens em escala cinza com JavaScript, mas especificamente com a utilização de HTML5 (Canvas). Só que como todos sabem, o Internet Explorer não tem suporte a esse tipo de feature, mas você pode contornar [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/11/11/grayscale-images-hover-com-html5-cross-browser/">Grayscale Images Hover com HTML5 Cross Browser</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/grayscale-images/grayscale-images.jpg" alt="Grayscale Images Hover com HTML5 Cross Browser" title="Grayscale Images Hover com HTML5 Cross Browser" /></div>
<p>A um tempo atrás o blog Web Designer Wall fez mais um de seus interessantes posts mostrando como é possível <a href="http://webdesignerwall.com/tutorials/html5-grayscale-image-hover" title="HTML5 Grayscale Image Hover" rel="external">criar imagens em escala cinza com JavaScript</a>, mas especificamente com a utilização de HTML5 (Canvas). Só que como todos sabem, o Internet Explorer não tem suporte a esse tipo de feature, mas você pode contornar isso facilmente com um código prorietário da Microsoft.</p>
<p><span id="more-5256"></span></p>
<p>Basicamente, o código é o seguinte:</p>
<pre class="brush: js">
element.style.filter = &#039;progid:DXImageTransform.Microsoft.BasicImage(grayScale=1)&#039;;
</pre>
<p>Com isso basta você fazer uma verificação e se o user agent no momento for o IE, use esse código, caso contrário, use HTML5.</p>
<ul>
<li><a href="http://www.pinceladasdaweb.com.br/blog/uploads/grayscale-images/" title="Grayscale Images Hover com HTML5 Cross Browser" rel="alternate">Exemplo</a></li>
<li><a href="http://www.pinceladasdaweb.com.br/blog/uploads/grayscale-images/grayscale-images.rar" title="Grayscale Images Hover com HTML5 Cross Browser" rel="alternate enclosure">Download</a></li>
</ul>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/11/11/grayscale-images-hover-com-html5-cross-browser/">Grayscale Images Hover com HTML5 Cross Browser</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/04/27/html5-canvas-o-basico/" title="HTML5 Canvas &#8211; O Básico">HTML5 Canvas &#8211; O Básico</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2010/09/01/svg-vs-canvas/" title="SVG vs Canvas">SVG vs Canvas</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2010/07/19/html5-canvas-o-futuro-dos-graficos-na-web/" title="HTML5 Canvas &#8211; O futuro dos gráficos na web">HTML5 Canvas &#8211; O futuro dos gráficos na web</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/" title="Aplicações dinâmicas com PHP e Ajax">Aplicações dinâmicas com PHP e Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/02/14/sorteio-livro-smashing-html5/" title="Sorteio: Livro Smashing HTML5">Sorteio: Livro Smashing HTML5</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/fTqfLq9dANc2R78r5dgvkVyZAdI/0/da"><img src="http://feedads.g.doubleclick.net/~a/fTqfLq9dANc2R78r5dgvkVyZAdI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/fTqfLq9dANc2R78r5dgvkVyZAdI/1/da"><img src="http://feedads.g.doubleclick.net/~a/fTqfLq9dANc2R78r5dgvkVyZAdI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=QpfTDloFF5g:xkNhhPVplm0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=QpfTDloFF5g:xkNhhPVplm0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=QpfTDloFF5g:xkNhhPVplm0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=QpfTDloFF5g:xkNhhPVplm0:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=QpfTDloFF5g:xkNhhPVplm0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=QpfTDloFF5g:xkNhhPVplm0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=QpfTDloFF5g:xkNhhPVplm0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=QpfTDloFF5g:xkNhhPVplm0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=QpfTDloFF5g:xkNhhPVplm0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=QpfTDloFF5g:xkNhhPVplm0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=QpfTDloFF5g:xkNhhPVplm0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/QpfTDloFF5g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/11/11/grayscale-images-hover-com-html5-cross-browser/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/11/11/grayscale-images-hover-com-html5-cross-browser/</feedburner:origLink></item>
		<item>
		<title>Como instalar o Windows 8 em uma máquina virtual</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/hqks1B3_MVA/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/10/27/como-instalar-o-windows-8-em-uma-maquina-virtual/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 16:24:40 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[Cotidiano]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5235</guid>
		<description><![CDATA[A idéia da Microsoft com a criação do Windows 8 é de criar um sistema operacional capaz de rodar em tablets, mercado praticamente dominado pela Apple, em telas sensíveis ao toque e em PCs. Recentemente eles disponibilizaram versões de teste do seu mais novo sistema operacional, e é isso que vou mostrar nesse post, a [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/27/como-instalar-o-windows-8-em-uma-maquina-virtual/">Como instalar o Windows 8 em uma máquina virtual</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/windows-8.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>A idéia da Microsoft com a criação do Windows 8 é de criar um sistema operacional capaz de rodar em tablets, mercado praticamente dominado pela Apple, em telas sensíveis ao toque e em PCs. Recentemente eles <a href="http://msdn.microsoft.com/en-us/windows/apps/br229516" title="Windows 8 Developer Preview downloads" rel="external">disponibilizaram versões de teste</a> do seu mais novo sistema operacional, e é isso que vou mostrar nesse post, a como instalar o Windows 8 em uma máquina virtual.</p>
<p><span id="more-5235"></span></p>
<p>Antes de tudo, tenha o <a href="https://www.virtualbox.org/" title="Virtual Box" rel="external">Virtual Box</a> instalado em seu PC, pois o tutorial foi desenvolvido com base nele. Após, vá até o site da Microsoft e <a href="http://msdn.microsoft.com/en-us/windows/apps/br229516" title="Windows 8 Download" rel="external">baixe a imagem do Windows 8</a>, nesse tutorial a utilizada é a seguinte: Windows 8 Developer Preview with developer tools English, 64-bit (x64).</p>
<p>Agora vamos aos passos de instalação, primeiro, abra o Virtual Box:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Após clique e Novo para criar uma nova máquina virtual, você verá a seguinte tela, basta então clicar em próximo:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm2.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Você irá para a tela onde deverá escolher o nome e tipo do sistema operacional, basta preencher como abaixo e clicar em próximo:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm3.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Nesse próximo passo, configure a memória para o quanto julgar necessário:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm4.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Basta deixar como na imagem abaixo:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm5.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Basta deixar como na imagem abaixo:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm6.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Aqui é onde você configura o quanto de seu HD será alocado para a máquina virtual e onde a mesma será salva, altere conforme necessário:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm7.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Agora basta clicar em criar:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm8.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Agora basta aguardar sua máquina virtual ser criada:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm9.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Basta clicar em criar novamente:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm10.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Com a máquina virtual criada, selecione a mesma e clique em configurações:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm11.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Depois vá até a aba Sistema > Processador e clique em Habilitar PAE/NX:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm12.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Próximo passo vá até a aba Armazenamento, aqui é onde você irá utilizar a ISO que baixou anteriormente, basta clicar no CD localizado ao lado de Drive de CD/DVD e selecionar a ISO do Windows 8:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm13.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Como podem ver agora, o drive de CD contém uma ISO, basta clicar em Ok:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm14.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Agora você voltará para a tela de gerenciamento das máquinas virtuais, basta clicar em iniciar e aguardar a instalação do Windows 8:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm15.jpg" alt="Windows 8" title="Windows 8"/></div>
<p>Basta agora seguir os passos de instalação que logo você terá o Windows 8 funcionando:</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/windows8/win-vm16.jpg" alt="Windows 8" title="Windows 8"/></div>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/27/como-instalar-o-windows-8-em-uma-maquina-virtual/">Como instalar o Windows 8 em uma máquina virtual</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<h3  class="related_post_title">Random Posts</h3><ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2007/08/20/como-evitar-o-resize-de-textareas-no-safari/" title="Como evitar o resize de textareas no Safari">Como evitar o resize de textareas no Safari</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2007/02/21/aprendendo-html-semanticamente-correto-2/" title="Aprendendo HTML Semanticamente Correto #2">Aprendendo HTML Semanticamente Correto #2</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2007/02/28/coloque-o-widget-do-pinceladas-da-web-em-seu-desktop/" title="Coloque o widget do pinceladas da web em seu desktop">Coloque o widget do pinceladas da web em seu desktop</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2007/10/11/mobile-firefox-browser-para-mobiles/" title="Mobile Firefox: Browser para mobiles">Mobile Firefox: Browser para mobiles</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2008/11/07/microsoft-interessada-em-usar-webkit/" title="Microsoft interessada em usar Webkit">Microsoft interessada em usar Webkit</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/5O_zp97GoNrahpGf3Z3ahRCT7EA/0/da"><img src="http://feedads.g.doubleclick.net/~a/5O_zp97GoNrahpGf3Z3ahRCT7EA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5O_zp97GoNrahpGf3Z3ahRCT7EA/1/da"><img src="http://feedads.g.doubleclick.net/~a/5O_zp97GoNrahpGf3Z3ahRCT7EA/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=hqks1B3_MVA:mZSmSSZph14:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=hqks1B3_MVA:mZSmSSZph14:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=hqks1B3_MVA:mZSmSSZph14:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=hqks1B3_MVA:mZSmSSZph14:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=hqks1B3_MVA:mZSmSSZph14:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=hqks1B3_MVA:mZSmSSZph14:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=hqks1B3_MVA:mZSmSSZph14:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=hqks1B3_MVA:mZSmSSZph14:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=hqks1B3_MVA:mZSmSSZph14:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=hqks1B3_MVA:mZSmSSZph14:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=hqks1B3_MVA:mZSmSSZph14:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/hqks1B3_MVA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/10/27/como-instalar-o-windows-8-em-uma-maquina-virtual/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/10/27/como-instalar-o-windows-8-em-uma-maquina-virtual/</feedburner:origLink></item>
		<item>
		<title>Ler Feeds com o Google JSAPI</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/Wlf0-3CflhU/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/10/10/ler-feeds-com-o-google-jsapi/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 10:46:00 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5212</guid>
		<description><![CDATA[O Google JSAPI é uma ferramenta muito poderosa. Ao invés de carregar uma biblioteca separada para cada API do Google você pode simplesmente carregar a JSAPI e através do google.load chamar a biblioteca de que precisa. Nesse tutorial vou carregar a biblioteca de Feeds para ler um Feed RSS externo. O que você deve simplesmente [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/10/ler-feeds-com-o-google-jsapi/">Ler Feeds com o Google JSAPI</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/jsapi/jsapi.jpg" alt="Google JSAPI" title="Google JSAPI" /></div>
<p>O <a href="http://code.google.com/intl/en/apis/loader/" title="Google JSAPI" rel="external">Google JSAPI</a> é uma ferramenta muito poderosa. Ao invés de carregar uma biblioteca separada para cada API do Google você pode simplesmente carregar a JSAPI e através do google.load chamar a biblioteca de que precisa.</p>
<p><span id="more-5212"></span></p>
<p>Nesse tutorial vou carregar a biblioteca de Feeds para ler um Feed RSS externo. O que você deve simplesmente é incluir a biblioteca do JSAPI na sua página:</p>
<pre class="brush: js">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	//Carrego a Google Ajax API Feed  (versão 1)
	google.load(&quot;feeds&quot;, &quot;1&quot;);
       //Feed.init é a função de Callback
	google.setOnLoadCallback(Feed.init);
&lt;/script&gt;
</pre>
<p>Após isso, vamos criar a função responsável por fazer o parser do feed:</p>
<pre class="brush: js">
//O endereço do Feed que desejo ler
var rss = &quot;http://feeds2.feedburner.com/pinceladasdaweb&quot;;
//Número de itens a serem mostrados
var itens = 8;

var Feed = function() {
	return {
		init: function() {
			var blog = new google.feeds.Feed(rss);
			blog.setNumEntries(itens);
			blog.load(function(data) {
				if (!data.error) {
					Feed.parser(data.feed.entries);
				}else{
					$(&quot;#feed&quot;).empty().html(&quot;&lt;p&gt;Ocorreu um erro ao ler o Feed&lt;/p&gt;&quot;);
				}
			});
		},
		parser: function(entries) {
			var view = [];
			view.push(&#039;&lt;ul&gt;&#039;);
			for (var i = 0; i &lt; entries.length; i+=1) {
				view.push(&#039;&lt;li&gt;&lt;h2&gt;&lt;a target=&quot;_blank&quot; title=&quot;&#039;+entries[i].title+&#039;&quot; href=&quot;&#039;+entries[i].link+&#039;&quot;&gt;&#039;+entries[i].title+&#039;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&#039;+entries[i].contentSnippet+&#039;&lt;/p&gt;&#039;);
			}
			view.push(&#039;&lt;/ul&gt;&#039;);
			$(&quot;#feed&quot;).empty().append(view.join(&#039;&#039;));
		}
	}
}();
</pre>
<p>E no HTML simplesmente adiciono uma div com o id &#8216;feed&#8217;, com uma imagem de loading que a removo assim que o Feed for carregado:</p>
<pre class="brush: html">
&lt;div id=&quot;feed&quot;&gt;&lt;img src=&quot;img/ajax-loader.gif&quot; alt=&quot;Carregando&quot; title=&quot;Carregando&quot; /&gt;&lt;/div&gt;
</pre>
<p>Aqui vocês podem ver um <a href="http://www.pinceladasdaweb.com.br/blog/uploads/jsapi/" title="Ler Feeds com o Google JSAPI" rel="alternate">exemplo</a>.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/10/ler-feeds-com-o-google-jsapi/">Ler Feeds com o Google JSAPI</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/12/19/ceplivre-api-de-ceps-para-formularios/" title="ceplivre &#8211; API de CEPs para formulários">ceplivre &#8211; API de CEPs para formulários</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/" title="Instagr.am API">Instagr.am API</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/10/08/aprenda-mais-sobre-o-console-do-firebug/" title="Aprenda mais sobre o console do Firebug">Aprenda mais sobre o console do Firebug</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/21/introducao-ao-yql-yahoo-query-language/" title="Introdução ao YQL &#8211; Yahoo Query Language">Introdução ao YQL &#8211; Yahoo Query Language</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/13/responsive-slideshows/" title="Responsive Slideshows">Responsive Slideshows</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/jSx0S5d7hx2yR8ilGMvMY6mm8Os/0/da"><img src="http://feedads.g.doubleclick.net/~a/jSx0S5d7hx2yR8ilGMvMY6mm8Os/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/jSx0S5d7hx2yR8ilGMvMY6mm8Os/1/da"><img src="http://feedads.g.doubleclick.net/~a/jSx0S5d7hx2yR8ilGMvMY6mm8Os/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=Wlf0-3CflhU:XtNKNZouG80:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=Wlf0-3CflhU:XtNKNZouG80:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=Wlf0-3CflhU:XtNKNZouG80:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=Wlf0-3CflhU:XtNKNZouG80:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=Wlf0-3CflhU:XtNKNZouG80:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=Wlf0-3CflhU:XtNKNZouG80:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=Wlf0-3CflhU:XtNKNZouG80:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=Wlf0-3CflhU:XtNKNZouG80:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=Wlf0-3CflhU:XtNKNZouG80:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=Wlf0-3CflhU:XtNKNZouG80:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=Wlf0-3CflhU:XtNKNZouG80:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/Wlf0-3CflhU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/10/10/ler-feeds-com-o-google-jsapi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/10/10/ler-feeds-com-o-google-jsapi/</feedburner:origLink></item>
		<item>
		<title>Aprenda mais sobre o console do Firebug</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/yvnl1dOmeiQ/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/10/08/aprenda-mais-sobre-o-console-do-firebug/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 14:08:15 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[console]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5206</guid>
		<description><![CDATA[A utilização do Firebug não é voltada somente a inspeção de CSS, existem várias outras coisas que você pode fazer com ele que podem facilitar e muito a vida do desenvolvedor web. Com base nisso, deixa aqui um link com 10 dicas para se tornar um melhor desenvolvedor com o Firebug. Já para o console [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/08/aprenda-mais-sobre-o-console-do-firebug/">Aprenda mais sobre o console do Firebug</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/firebug.jpg" alt="Firebug" title="Firebug" /></div>
<p>A utilização do Firebug não é voltada somente a inspeção de CSS, existem várias outras coisas que você pode fazer com ele que podem facilitar e muito a vida do desenvolvedor web. Com base nisso, deixa aqui um <a href="http://www.jquery4u.com/utilities/firebug-console-tips/">link</a> com 10 dicas para se tornar um melhor desenvolvedor com o Firebug.</p>
<p><span id="more-5206"></span></p>
<p>Já para o console do Chrome, deixo aqui um vídeo interessante criado por <a href="http://paulirish.com/" title="Paul Irish" rel="external">Paul Irish</a> com algumas dicas legais:</p>
<div class="aligncenter"><object width="610" height="458" type="application/x-shockwave-flash" data="http://www.youtube.com/v/4mf_yNLlgic&amp;hl=pt_BR&amp;fs=1&amp;"><param value="high" name="quality"></param><param name="allowScriptAccess" value="always"></param><param name="allowFullScreen" value="true"></param><param name="flashvars" value="fake=1"></param><param value="http://www.youtube.com/v/4mf_yNLlgic&amp;hl=pt_BR&amp;fs=1&amp;" name="movie"><img alt="Vídeo (Objeto multimídia)" src="http://www.pinceladasdaweb.com.br/blog/uploads/youtube/video.png"/></param></object></div>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/08/aprenda-mais-sobre-o-console-do-firebug/">Aprenda mais sobre o console do Firebug</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/10/10/ler-feeds-com-o-google-jsapi/" title="Ler Feeds com o Google JSAPI">Ler Feeds com o Google JSAPI</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/21/introducao-ao-yql-yahoo-query-language/" title="Introdução ao YQL &#8211; Yahoo Query Language">Introdução ao YQL &#8211; Yahoo Query Language</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/13/responsive-slideshows/" title="Responsive Slideshows">Responsive Slideshows</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/07/carregar-botao-do-google-plus-via-ajax/" title="Carregar botão do Google+ via Ajax">Carregar botão do Google+ via Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/24/endentacao-codigo-tab-espacos/" title="Endentação do código &#8211; TAB vs Espaços">Endentação do código &#8211; TAB vs Espaços</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/DisEqTJOWi-Jhxogw2ZWWcBzYqw/0/da"><img src="http://feedads.g.doubleclick.net/~a/DisEqTJOWi-Jhxogw2ZWWcBzYqw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/DisEqTJOWi-Jhxogw2ZWWcBzYqw/1/da"><img src="http://feedads.g.doubleclick.net/~a/DisEqTJOWi-Jhxogw2ZWWcBzYqw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=yvnl1dOmeiQ:3kyT4Ukr6QI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=yvnl1dOmeiQ:3kyT4Ukr6QI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=yvnl1dOmeiQ:3kyT4Ukr6QI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=yvnl1dOmeiQ:3kyT4Ukr6QI:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=yvnl1dOmeiQ:3kyT4Ukr6QI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=yvnl1dOmeiQ:3kyT4Ukr6QI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=yvnl1dOmeiQ:3kyT4Ukr6QI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=yvnl1dOmeiQ:3kyT4Ukr6QI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=yvnl1dOmeiQ:3kyT4Ukr6QI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=yvnl1dOmeiQ:3kyT4Ukr6QI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=yvnl1dOmeiQ:3kyT4Ukr6QI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/yvnl1dOmeiQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/10/08/aprenda-mais-sobre-o-console-do-firebug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/10/08/aprenda-mais-sobre-o-console-do-firebug/</feedburner:origLink></item>
		<item>
		<title>Ler feed de outros sites com SimplePie</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/weUQ6kQzIv4/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/10/07/ler-feed-de-outros-sites-com-simplepie/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 10:33:06 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5197</guid>
		<description><![CDATA[Para aqueles que não conhecem, o SimplePie é uma poderosa ferramenta para leitura de feeds RSS ou Atom escrita em PHP. Algumas pessoas podem estar se perguntando, mas não é possível ler um feed com JavaScript? Sim, é possível, como mostrei aqui com JavaScript + YQL, a desvantagem na utilização de JavaScript é que ele [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/07/ler-feed-de-outros-sites-com-simplepie/">Ler feed de outros sites com SimplePie</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/simplepie/simplepie.jpg" alt="SimplePie" title="SimplePie" /></div>
<p>Para aqueles que não conhecem, o <a href="http://simplepie.org/" title="SimplePie" rel="external">SimplePie</a> é uma poderosa ferramenta para leitura de feeds RSS ou Atom escrita em PHP. Algumas pessoas podem estar se perguntando, mas não é possível ler um feed com JavaScript? Sim, é possível, como mostrei aqui com <a href="http://www.pinceladasdaweb.com.br/blog/2011/09/21/introducao-ao-yql-yahoo-query-language/" title="Introdução ao YQL – Yahoo Query Language" rel="alternate">JavaScript + YQL</a>, a desvantagem na utilização de JavaScript é que ele não gera um cache, ou seja, a cada requisição na página, uma nova requisição é feita para a leitura do feed.</p>
<p><span id="more-5197"></span></p>
<p>Já com o SimplePie isso não acontece, ele cria um arquivo de cache e novas requisições são feitas somente se o conteúdo for atualizado. Para que vocês entendam melhor, vamos a um exemplo. Antes de tudo, vá até o site do <a href="http://simplepie.org/" title="SimplePie" rel="external">SimplePie</a> e faça o <a href="http://simplepie.org/" title="Download SimplePie" rel="external">download</a> da aplicação.</p>
<p>Descompacte o zip e pegue somente o arquivo simplepie.inc, por enquanto só vamos precisar dele.</p>
<p>Dentro do diretório de sua aplicação, onde você quer mostrar os feeds, cria uma pasta chamada <strong>cache</strong>, e tenha certeza que é permitida a gravação nessa pasta. Agora vamos ao nosso código PHP:</p>
<pre class="brush: php">
&lt; ?php
	include(&quot;simplepie.inc&quot;);
	$feed = new SimplePie(&#039;http://endereco_do_feed&#039;);
?&gt;
</pre>
<p>Como podem ver basta dar um include do simplepie na página e depois atribuir a uma variável o feed que eu quero ler.</p>
<pre class="brush: php">
&lt; ?php
    //5 é o número de itens que eu desejo mostrar
    $items = $feed-&gt;get_items(0, 5);
    foreach ($items as $item) :
        $title  = $item-&gt;get_title();
        $url 	 = $item-&gt;get_permalink();
        $desc = $item-&gt;get_description();

    // Pego as 30 primeiras palavras do nó description do Feed
    $desc_array = explode(&quot; &quot;, $desc);
    $desc_excerpt = array_slice($desc_array, 0, 30);
    $desc_output = implode(&#039; &#039;, $desc_excerpt);
?&gt;

&lt;h2&gt;&lt;a href=&quot;&lt;?php echo $url;?&gt;&quot;&gt;&lt; ?php echo $title;?&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt; ?php echo $desc_output;?&gt; ...&lt;/p&gt;

&lt; ?php endforeach; ?&gt;
</pre>
<p>Após uso um foreach para percorrer esse XML e mostrar os itens na tela como eu desejo.</p>
<p>Vejam aqui nesse <a href="http://www.pinceladasdaweb.com.br/blog/uploads/simplepie/" title="Ler Feed com SimplePie" rel="alternate">exemplo</a> onde mostro o Feed de 3 blogs. Criei esse layout com base <a href="http://jsfiddle.net/sl1dr/hshMK/" title="Pure CSS3 Ribbon" rel="external">nesse exemplo</a> somente para demonstração, portanto, teste em browsers modernos.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/07/ler-feed-de-outros-sites-com-simplepie/">Ler feed de outros sites com SimplePie</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/" title="Aplicações dinâmicas com PHP e Ajax">Aplicações dinâmicas com PHP e Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/" title="Webservice &#8211; Consulta de CEP diretamente ao site dos correios">Webservice &#8211; Consulta de CEP diretamente ao site dos correios</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/23/php-random-html/" title="PHP Random HTML">PHP Random HTML</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/24/endentacao-codigo-tab-espacos/" title="Endentação do código &#8211; TAB vs Espaços">Endentação do código &#8211; TAB vs Espaços</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/24/comecando-php-salvando/" title="Começando com PHP &#8211; Salvando o código">Começando com PHP &#8211; Salvando o código</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/_Exr6DI4gTidc88k1rXypNSBZgs/0/da"><img src="http://feedads.g.doubleclick.net/~a/_Exr6DI4gTidc88k1rXypNSBZgs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_Exr6DI4gTidc88k1rXypNSBZgs/1/da"><img src="http://feedads.g.doubleclick.net/~a/_Exr6DI4gTidc88k1rXypNSBZgs/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=weUQ6kQzIv4:7T7Dspd_pmU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=weUQ6kQzIv4:7T7Dspd_pmU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=weUQ6kQzIv4:7T7Dspd_pmU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=weUQ6kQzIv4:7T7Dspd_pmU:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=weUQ6kQzIv4:7T7Dspd_pmU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=weUQ6kQzIv4:7T7Dspd_pmU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=weUQ6kQzIv4:7T7Dspd_pmU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=weUQ6kQzIv4:7T7Dspd_pmU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=weUQ6kQzIv4:7T7Dspd_pmU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=weUQ6kQzIv4:7T7Dspd_pmU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=weUQ6kQzIv4:7T7Dspd_pmU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/weUQ6kQzIv4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/10/07/ler-feed-de-outros-sites-com-simplepie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/10/07/ler-feed-de-outros-sites-com-simplepie/</feedburner:origLink></item>
		<item>
		<title>Slideshow com jCarousel</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/UHYCILpyyQ8/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/10/03/slideshow-com-jcarousel/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 10:28:02 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5181</guid>
		<description><![CDATA[Ao contrário do muitos pensam, o plugin jCarousel não precisa ser utilizado somente no desenvolvimento de um Carousel, ele pode também ser utilzado na criação de um Slideshow, e como vou mostrar, ele também funciona perfeitamente para isso. A grande sacada do jCarousel é que ele possui suporte a controles externos, com isso basta então [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/03/slideshow-com-jcarousel/">Slideshow com jCarousel</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/jcarousel-slideshow/jcarousel-slideshow.jpg" alt="Slideshow com jCarousel" title="Slideshow com jCarousel" /></div>
<p>Ao contrário do muitos pensam, o plugin <a href="http://sorgalla.com/jcarousel/" title="jCarousel" rel="external">jCarousel</a> não precisa ser utilizado somente no desenvolvimento de um Carousel, ele pode também ser utilzado na criação de um Slideshow, e como vou mostrar, ele também funciona perfeitamente para isso.</p>
<p><span id="more-5181"></span></p>
<p>A grande sacada do jCarousel é que ele possui suporte a controles externos, com isso basta então criar uma função que gere dinamicamente aqueles bullets que ficam logo abaixo do Slideshow, fazendo com que cada link ao ser clicado vá para sua imagem em questão:</p>
<pre class="brush: js">
function carouselSlideshow(carousel) {
	carousel.clip.hover(function () {
		carousel.stopAuto();
	}, function () {
		carousel.startAuto();
	});

	$(&#039;&lt;div id=&quot;bullets&quot;&gt;&lt;/div&gt;&#039;).insertAfter(&#039;.jcarousel-container&#039;);

	$(&#039;#slideshow li&#039;).each(function(index) {
			var number = parseInt(index) + 1;
			$(&#039;#bullets&#039;).append(&#039;&lt;a href=&quot;#&quot;&gt;&lt;span&gt;&#039;+ number +&#039;&lt;/span&gt;&lt;/a&gt;&#039;);
	});

	$(&#039;#slideshow&#039;).delegate(&#039;#bullets a&#039;, &#039;click&#039;, function(){
		carousel.scroll($.jcarousel.intval($(this).text()));
		return false;
	});
};
</pre>
<p>Com a função pronta, basta chamá-la como um Callback dentro da chamada do jCarousel:</p>
<pre class="brush: js">
$(&#039;#slideshow ul&#039;).jcarousel({
	auto: 5,
	scroll: 1,
	wrap: &#039;last&#039;,
	initCallback: carouselSlideshow,
	itemVisibleInCallback: {
		onAfterAnimation: function(c, o, i, s) {
			--i;
			$(&#039;#bullets a&#039;).removeClass(&#039;active&#039;);
			$(&#039;#bullets a:eq(&#039;+i+&#039;)&#039;).addClass(&#039;active&#039;);
		}
	}
});
</pre>
<ul>
<li><a href="http://www.pinceladasdaweb.com.br/blog/uploads/jcarousel-slideshow/" title="Slideshow com jCarousel" rel="alternate">Ver Demo</a></li>
<li><a href="http://www.pinceladasdaweb.com.br/blog/uploads/jcarousel-slideshow/slideshow-jcarousel.rar" title="Download Slideshow com jCarousel" rel="alternate enclosure">Download</a></li>
</ul>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/10/03/slideshow-com-jcarousel/">Slideshow com jCarousel</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/" title="Aplicações dinâmicas com PHP e Ajax">Aplicações dinâmicas com PHP e Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/28/ajax-image-gallery/" title="Ajax Image Gallery">Ajax Image Gallery</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/14/instagram-api/" title="Instagr.am API">Instagr.am API</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/11/11/grayscale-images-hover-com-html5-cross-browser/" title="Grayscale Images Hover com HTML5 Cross Browser">Grayscale Images Hover com HTML5 Cross Browser</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/13/responsive-slideshows/" title="Responsive Slideshows">Responsive Slideshows</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/LBSjGFqYMW2qoz5CNzE8TFXML_w/0/da"><img src="http://feedads.g.doubleclick.net/~a/LBSjGFqYMW2qoz5CNzE8TFXML_w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/LBSjGFqYMW2qoz5CNzE8TFXML_w/1/da"><img src="http://feedads.g.doubleclick.net/~a/LBSjGFqYMW2qoz5CNzE8TFXML_w/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=UHYCILpyyQ8:AyqWh-n7xVA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=UHYCILpyyQ8:AyqWh-n7xVA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=UHYCILpyyQ8:AyqWh-n7xVA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=UHYCILpyyQ8:AyqWh-n7xVA:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=UHYCILpyyQ8:AyqWh-n7xVA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=UHYCILpyyQ8:AyqWh-n7xVA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=UHYCILpyyQ8:AyqWh-n7xVA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=UHYCILpyyQ8:AyqWh-n7xVA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=UHYCILpyyQ8:AyqWh-n7xVA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=UHYCILpyyQ8:AyqWh-n7xVA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=UHYCILpyyQ8:AyqWh-n7xVA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/UHYCILpyyQ8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/10/03/slideshow-com-jcarousel/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/10/03/slideshow-com-jcarousel/</feedburner:origLink></item>
		<item>
		<title>PHP Random HTML</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/zNh2m4zCAq4/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/09/23/php-random-html/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 07:13:59 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5168</guid>
		<description><![CDATA[Suponho que algum dia você precise de alguma forma mostrar alguns itens de forma randômica em sua página, sejam eles banners ou coisa do tipo, vou deixar aqui um código em PHP que pode resolver isso facilmente para você. &#60; ?php $a = array( &#039;Código HTML aqui&#039;, &#039;Código HTML aqui&#039;, &#039;Código HTML aqui&#039;, &#039;Código HTML [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/09/23/php-random-html/">PHP Random HTML</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/php-random-html/php-random-html.jpg" alt="PHP Random HTML" title="PHP Random HTML" /></div>
<p>Suponho que algum dia você precise de alguma forma mostrar alguns itens de forma randômica em sua página, sejam eles banners ou coisa do tipo, vou deixar aqui um código em PHP que pode resolver isso facilmente para você.</p>
<p><span id="more-5168"></span></p>
<pre class="brush: php">
&lt; ?php
	$a = array(
		&#039;Código HTML aqui&#039;,
		&#039;Código HTML aqui&#039;,
		&#039;Código HTML aqui&#039;,
		&#039;Código HTML aqui&#039;
	);
	shuffle($a);
	$na = array_slice($a, 0, 2);
	echo implode(&#039;&#039;, $na);
?&gt;
</pre>
<p>Uma rápida explicação para entender a funcionalidade desse código:</p>
<ul>
<li><strong>Linha 1</strong> &#8211; Crio um array com os meus elementos HTML.</li>
<li><strong>Linha 8</strong> &#8211; Embaralho os elementos do array.</li>
<li><strong>Linha 9</strong> &#8211; Crio uma nova variável onde vou extrair uma parte do array que criei anteriormente, ou seja, vou pegar alí 2 itens.</li>
<li><strong>Linha 10</strong> &#8211; Mostro os itens na tela de forma aleatória.</li>
</ul>
<p>Vejam aqui um exemplo <a href="http://www.pinceladasdaweb.com.br/blog/uploads/php-random-html/" title="PHP Random HTML" rel="alternate">funcionando</a>. Dê alguns refreshs na página e você verá que os itens são mostrados de forma aleatória. Você pode fazer o <a href="http://www.pinceladasdaweb.com.br/blog/uploads/php-random-html/php-random-html.rar" title="PHP Random HTML" rel="alternate enclosure">download do exemplo aqui</a>.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/09/23/php-random-html/">PHP Random HTML</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/02/16/aplicacoes-dinamicas-com-php-e-ajax/" title="Aplicações dinâmicas com PHP e Ajax">Aplicações dinâmicas com PHP e Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/" title="Webservice &#8211; Consulta de CEP diretamente ao site dos correios">Webservice &#8211; Consulta de CEP diretamente ao site dos correios</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/10/07/ler-feed-de-outros-sites-com-simplepie/" title="Ler feed de outros sites com SimplePie">Ler feed de outros sites com SimplePie</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/24/endentacao-codigo-tab-espacos/" title="Endentação do código &#8211; TAB vs Espaços">Endentação do código &#8211; TAB vs Espaços</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/24/comecando-php-salvando/" title="Começando com PHP &#8211; Salvando o código">Começando com PHP &#8211; Salvando o código</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/POijRif4afXH1zlcENZbDF-YkVk/0/da"><img src="http://feedads.g.doubleclick.net/~a/POijRif4afXH1zlcENZbDF-YkVk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/POijRif4afXH1zlcENZbDF-YkVk/1/da"><img src="http://feedads.g.doubleclick.net/~a/POijRif4afXH1zlcENZbDF-YkVk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zNh2m4zCAq4:sRn3agCk8Wg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=zNh2m4zCAq4:sRn3agCk8Wg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zNh2m4zCAq4:sRn3agCk8Wg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zNh2m4zCAq4:sRn3agCk8Wg:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zNh2m4zCAq4:sRn3agCk8Wg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zNh2m4zCAq4:sRn3agCk8Wg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=zNh2m4zCAq4:sRn3agCk8Wg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zNh2m4zCAq4:sRn3agCk8Wg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=zNh2m4zCAq4:sRn3agCk8Wg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=zNh2m4zCAq4:sRn3agCk8Wg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=zNh2m4zCAq4:sRn3agCk8Wg:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/zNh2m4zCAq4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/09/23/php-random-html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/09/23/php-random-html/</feedburner:origLink></item>
		<item>
		<title>Introdução ao YQL – Yahoo Query Language</title>
		<link>http://feedproxy.google.com/~r/PinceladasDaWeb/~3/RpQACgGMZHw/</link>
		<comments>http://www.pinceladasdaweb.com.br/blog/2011/09/21/introducao-ao-yql-yahoo-query-language/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 08:57:53 +0000</pubDate>
		<dc:creator>Pedro Rogério</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[YQL]]></category>

		<guid isPermaLink="false">http://www.pinceladasdaweb.com.br/blog/?p=5142</guid>
		<description><![CDATA[O YQL (Yahoo Query Language) é uma API do Yahoo criada para facilitar a vida dos desenvolvedores, onde ele reune milhares de serviços únicos. Essa API não é relativamente nova, já existe a um bom tempo, mas não vejo ninguém explorar seu potencial, por isso resolvi fazer esse post. O YQL funciona de maneira similar [...]<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/09/21/introducao-ao-yql-yahoo-query-language/">Introdução ao YQL &#8211; Yahoo Query Language</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/yql/img/yahoo-yql.jpg" alt="YQL - Yahoo Query Language" title="YQL - Yahoo Query Language" /></div>
<p>O <a href="http://developer.yahoo.com/yql/" title="YQL" rel="external">YQL</a> (Yahoo Query Language) é uma API do Yahoo criada para facilitar a vida dos desenvolvedores, onde ele reune milhares de serviços únicos. Essa API não é relativamente nova, já existe a um bom tempo, mas não vejo ninguém explorar seu potencial, por isso resolvi fazer esse post.</p>
<p>O YQL funciona de maneira similar a um banco de dados, onde os serviços são disponibilizados através de tabelas, onde podemos fazer consultas através de uma sintaxe semelhante a do SQL, sim, você poderá selecionar os dados a partir de uma simples select, ou combinando com subselects, e etc&#8230;</p>
<p><span id="more-5142"></span></p>
<p>Pelo <a href="http://developer.yahoo.com/yql/console/" title="YQL Console" rel="external">console</a>, quando selecionamos uma tabela, já é mostrado um exemplo de como seria sua consulta, o que facilita para quem não tem conhecimentos sólidos sobre SQL. Por padrão, são exibidas as tabelas referentes aos serviços do Yahoo!, mas qualquer um pode adicionar novos serviços desde que o mesmo seja proprietário das informações ou as mesmas sejam explicitamente de domínio público.</p>
<p>Para ter acesso as tabelas públicas, basta fazer o seguinte, acesse o <a href="http://developer.yahoo.com/yql/console/" title="YQL Console" rel="external">console</a>, logo a direita você verá o título DATA TABLES, basta clicar em: Show Community Tables</p>
<div class="aligncenter"><img src="http://www.pinceladasdaweb.com.br/blog/uploads/yql/yql-show-tables.png" alt="Introdução ao YQL - Yahoo Query Language" title="Introdução ao YQL - Yahoo Query Language" /></div>
<p>Agora você tem acesso a todas as tabelas comunitárias. A partir daqui você poderia, por exemplo, consultar a tabela do W3C e executar a seguinte query no console.</p>
<pre class="brush: sql">
select * from w3c.check where uri=&#039;www.yahoo.com&#039;
</pre>
<p>Essa query é responsável por verificar e validar o HTML, tudo através do YQL, e o retorno disso tudo é um XML ou JSON, a partir daí eu posso fazer o que quiser com essas informações.</p>
<p>Em um outro exemplo que fiz aqui, efetuo a seguinte consulta no console:</p>
<pre class="brush: sql">
select * from html where url=&#039;http://www.cssnolanche.com.br&#039; and xpath=&#039;//div[@class=&quot;shadow&quot;]//h2&#039;
</pre>
<p>Essa query é responsável por acessar meu <a href="http://www.cssnolanche.com.br" title="CSS no Lanche" rel="external me">outro blog</a>, ler todo o HTML, e com <a href="http://www.w3schools.com/XPath/default.asp" title="XPath" rel="external">XPath</a> pegar todo o conteúdo que está dentro da tag h2, que consequentemente está dentro de uma div com a class shadow. Vá até o <a href="http://developer.yahoo.com/yql/console/#h=select%20*%20from%20html%20where%20url%3D%22http%3A//www.cssnolanche.com.br%22%20and%20xpath%3D%27//div[@class%3D%22shadow%22]//h2%27">console</a>, escolha a opção XML ou JSON, clique em test e veja o resultado.</p>
<p>Após, eu posso pegar a <a href="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22http%3A%2F%2Fwww.cssnolanche.com.br%22%20and%20xpath%3D'%2F%2Fdiv%5B%40class%3D%22shadow%22%5D%2F%2Fh2'&#038;format=json&#038;diagnostics=true&#038;callback=" title="REST QUERY" rel="external">REST QUERY</a> gerada e fazer um <a href="http://www.pinceladasdaweb.com.br/blog/uploads/yql/" title="Yahoo Query Language + XPath" rel="alternate me">parser com jQuery</a>.</p>
<p>Em um outro exemplo também poderia pegar meu últimos Tweets, com a seguinte query:</p>
<pre class="brush: sql">
select * from twitter.user.timeline where screen_name=&#039;pinceladasdaweb&#039;
</pre>
<p>E depois fazer o <a href="http://www.pinceladasdaweb.com.br/blog/uploads/yql/twitter.html" title="Yahoo Query Language + Twitter" rel="alternate me">parser do JSON gerado</a>.</p>
<p>Em uma consulta mais complexa, poderia mesclar o feed dos meus 2 blogs e depois filtrar somente pelo título dos posts:</p>
<pre class="brush: sql">
select channel.item.title,channel.item.link, channel.item.pubDate
    from xml where url in(
      &#039;http://feeds.feedburner.com/pinceladasdaweb&#039;,
      &#039;http://feeds2.feedburner.com/CssNoLanche&#039;
    )
  | unique(field=&quot;channel.item.link&quot;)
  | sort(field=&quot;channel.item.pubDate&quot;, descending=&quot;true&quot;)
</pre>
<p>As possibilidades de uso do YQL são infinitas, mostrei aqui 3 exemplos básicos de uso, mas como você pode ver, o <a href="http://twitter.com/dirs" title="Twitter Dirceu">Dirceu</a> mostra em seu blog como é possível fazer um <a href="http://www.dirceupauka.com/widget-do-submarino-com-yql" title="Widget com os produtos do Submarino através do YQL e XPath" rel="external">Widget com os produtos do Submarino através do YQL e XPath</a>. Ou então o <a href="http://blog.talleye.com" title="Blog Luis Cipriani">Luis Cipriani</a> que criou um Mash up para saber a <a href="http://blog.talleye.com/2010/04/16/extracao-dados-publicos-com-yql-e-pipes-2/" title="Extração de dados públicos com YQL e Y!Pipes" rel="external">localização das feiras livres aos domingos</a> mais próximas de sua casa.</p>
<p><hr />
<a href="http://www.pinceladasdaweb.com.br/blog/2011/09/21/introducao-ao-yql-yahoo-query-language/">Introdução ao YQL &#8211; Yahoo Query Language</a>
<br />
<p>J&aacute; conhece o meu outro blog? O endere&ccedil;o &eacute; o: <a href="http://www.cssnolanche.com.br">CSS no Lanche</a></p>
<p>Voc&ecirc; ainda n&atilde;o est&aacute; me seguindo no <a href="http://twitter.com/pinceladasdaweb" title="Siga-me no Twitter" rel="external">Twitter</a>, o que est&aacute; esperando para fazer isso?</p></p>
<ul class="related_post"><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/10/10/ler-feeds-com-o-google-jsapi/" title="Ler Feeds com o Google JSAPI">Ler Feeds com o Google JSAPI</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/10/08/aprenda-mais-sobre-o-console-do-firebug/" title="Aprenda mais sobre o console do Firebug">Aprenda mais sobre o console do Firebug</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/13/responsive-slideshows/" title="Responsive Slideshows">Responsive Slideshows</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/09/07/carregar-botao-do-google-plus-via-ajax/" title="Carregar botão do Google+ via Ajax">Carregar botão do Google+ via Ajax</a></li><li><a href="http://www.pinceladasdaweb.com.br/blog/2011/08/24/endentacao-codigo-tab-espacos/" title="Endentação do código &#8211; TAB vs Espaços">Endentação do código &#8211; TAB vs Espaços</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/ymtE_SzRCcXrTNFgUd98rq1eooQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/ymtE_SzRCcXrTNFgUd98rq1eooQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ymtE_SzRCcXrTNFgUd98rq1eooQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/ymtE_SzRCcXrTNFgUd98rq1eooQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=RpQACgGMZHw:Lm-Vk3H_p80:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=RpQACgGMZHw:Lm-Vk3H_p80:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=RpQACgGMZHw:Lm-Vk3H_p80:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=RpQACgGMZHw:Lm-Vk3H_p80:tr8VpXobKIM"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=tr8VpXobKIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=RpQACgGMZHw:Lm-Vk3H_p80:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=RpQACgGMZHw:Lm-Vk3H_p80:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=RpQACgGMZHw:Lm-Vk3H_p80:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=RpQACgGMZHw:Lm-Vk3H_p80:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=RpQACgGMZHw:Lm-Vk3H_p80:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PinceladasDaWeb?a=RpQACgGMZHw:Lm-Vk3H_p80:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/PinceladasDaWeb?i=RpQACgGMZHw:Lm-Vk3H_p80:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PinceladasDaWeb/~4/RpQACgGMZHw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.pinceladasdaweb.com.br/blog/2011/09/21/introducao-ao-yql-yahoo-query-language/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.pinceladasdaweb.com.br/blog/2011/09/21/introducao-ao-yql-yahoo-query-language/</feedburner:origLink></item>
	</channel>
</rss>

