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

<channel>
	<title>Chris B. - idéias e pensamentos &#187; javascript</title>
	<atom:link href="http://www.chrisb.com.br/blog/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.chrisb.com.br/blog</link>
	<description>Misturando ideias e pensamentos: tecnologia (PHP, Wordpress, javascript, programação), web 2.0 (javascript, ajax, prototype, jQuery) e experiências de vida</description>
	<lastBuildDate>Tue, 18 May 2010 19:32:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Upload de arquivos do file system direto pela interface web</title>
		<link>http://www.chrisb.com.br/blog/upload-de-arquivos-do-file-system-direto-pela-interface-web/</link>
		<comments>http://www.chrisb.com.br/blog/upload-de-arquivos-do-file-system-direto-pela-interface-web/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 21:39:46 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=2286</guid>
		<description><![CDATA[Certa vez, anos atrás, pesquisei como seria possível fazer upload de arquivos do desktop direto para uma aplicação web, arrastando-e-colando. Não era. A única coisa que achei seria implementando um java applet ou alguma solução proprietária &#8211; a Microsoft tem um lance desses no Sharepoint, o CMS deles. Desencanei. Ai, semana passada saiu uma notícia [...]]]></description>
			<content:encoded><![CDATA[<p>Certa vez, anos atrás, pesquisei como seria possível fazer upload de arquivos do desktop direto para uma aplicação web, arrastando-e-colando. Não era.<br />
A única coisa que achei seria implementando um <em>java applet</em> ou alguma solução proprietária &#8211; a <strong>Microsoft</strong> tem um lance desses no <em>Sharepoint</em>, o CMS deles. Desencanei.</p>
<p>Ai, semana passada saiu uma notícia que era possível fazer isso pelo <strong>Gmail</strong>. Acredito que a solução a qual eles chegaram não é a mesma que eu encontrei na web, mas acredito que seja algo do gênero. Basicamente, dá pra fazer isso com <strong>HTML5</strong> se você estiver usando um <em>browser</em> adequado. Adequado, nesse contexto, é o <strong>Chrome 2.0+</strong> ou <strong>Firefox 3.6</strong></p>
<p><span style="color: #ff0000;">Não vou me dar ao trabalho de fazer uma explicação muito didática; se você chegou até aqui, acredito que tenha experiência em desenvolvimento de interfaces web e vai entender o que estou falando. Se não, dê alguns passos para trás antes de continuar.</span></p>
<p>Com o HTML5, muita coisa diferente em javascript foi implementada. Para o usuário poder arrastar-e-colar arquivos do file system para uma interface web, são usadas 2 funcionalidades (desculpem o nome, não achei um mais adequado):</p>
<ul>
<li><strong>File API</strong></li>
<li><strong>XMLHttpRequest 2</strong></li>
</ul>
<p>Com o primeiro (File API), você consegue manipular arquivos que são &#8220;arrastados-e-colados&#8221; para uma certa área da sua página. Manipular, nesse caso, pode ser muita coisa, mas você consegue saber o nome, file syze, content type, conteúdo do mesmo (em binário, por exemplo), etc&#8230;<br />
Com o XMLHttpRequest versão 2 é possível fazer o envio de dados nas suas requisições em formato binário. E bacana é que existem métodos nativos para saber o status e a porcentagem da mesma &#8211; ou seja, você consegue criar uma progress bar, por exemplo.</p>
<p>Vou colar logo abaixo o conteúdo da página de teste, que possui comentários. Sei que o post ficou meio superficial, mas ele serve mais como referência para vocês saberem mais uma coisa do que é possível ser feito com HTML5!</p>
<p>Url de teste: <a href="http://www.chrisb.com.br/teste.html">http://www.chrisb.com.br/teste.html</a><br />
*no caso, arraste arquivos do file system para a caixa com bordas pretas.</p>
<p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;script&gt;</em></p>
<p><em>function dodrop(event) {<br />
//retorna os arquivos que estão sendo transferidos<br />
var dt = event.dataTransfer;<br />
var files = dt.files;<br />
//percorre os arquivos<br />
var count = files.length;<br />
output(&#8220;File Count: &#8221; + count + &#8220;\n&#8221;);<br />
for (var i = 0; i &lt; files.length; i++) {<br />
//escreve infotmações do arquivos<br />
output(&#8221; File &#8221; + i + &#8220;:\n(&#8221; + (typeof files[i]) + &#8220;) : &lt;&#8221; + files[i] + &#8221; &gt; &#8221; +<br />
files[i].name + &#8221; &#8221; + files[i].size + &#8220;\n&#8221;);<br />
new FileUpload(files[i]); //instancia objeto dessa classe, passando o arquivo para o construtor</em></p>
<p><em>}<br />
}</em></p>
<p><em>function output(text) {<br />
document.getElementById(&#8220;output&#8221;).textContent += text;<br />
dump(text);<br />
}</em></p>
<p><em>function FileUpload(file) {</em></p>
<p><em>//cria objeto para requisições assíncronas<br />
var xhr = new XMLHttpRequest();</em></p>
<p><em>//cria listeners para o upload (que é quando o xmlhttprequest está enviando o arquivo):</em></p>
<p><em>//para o durante o processo<br />
xhr.upload.onprogress = function(e) {<br />
if (e.lengthComputable) {<br />
var percentage = Math.round((e.loaded * 100) / e.total);<br />
document.getElementById(&#8220;p&#8221;).innerHTML = percentage;<br />
}<br />
}</em></p>
<p><em>//caso ocorra algum erro<br />
xhr.upload.onerror = function(e){<br />
alert(&#8220;Erro&#8221;);<br />
}</em></p>
<p><em>//quando finalizar o upload<br />
xhr.upload.onload = function(event){<br />
document.getElementById(&#8220;p&#8221;).innerHTML = 100;<br />
}</em></p>
<p><em>//abre a conexão; o segundo parâmetro é da url a ser requisitada, que recebe o arquovo<br />
xhr.open(&#8220;POST&#8221;, &#8220;http://www.chrisb.com.br/up.php&#8221;);<br />
xhr.overrideMimeType(&#8216;text/plain; charset=x-user-defined-binary&#8217;);</em></p>
<p><em>//cria objeto FileReader para ler o arquivo<br />
var reader = new FileReader();<br />
//quando acabar de ler o arquivo&#8230;<br />
reader.onload = function(e) {<br />
//pega o retorno da função, que é um dado binário<br />
var bin = e.target.result;<br />
//e faz o xmlhttprequest enviar como binário<br />
xhr.sendAsBinary(bin);<br />
};<br />
reader.readAsBinaryString(file); //lê o arquivo como binário</em></p>
<p><em>}</em></p>
<p><em>window.onload = function() {<br />
var output = document.getElementById(&#8220;output&#8221;);<br />
output.ondragenter = function(event) {<br />
document.getElementById(&#8216;output&#8217;).textContent = &#8221;; event.stopPropagation(); event.preventDefault();<br />
}<br />
output.ondragover = function(event) {<br />
event.stopPropagation(); event.preventDefault();<br />
}<br />
output.ondrop = function(event) {<br />
event.stopPropagation(); event.preventDefault();<br />
dodrop(event);<br />
}<br />
}</em></p>
<p><em>&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;</em></p>
<p><em>&lt;div id=&#8221;output&#8221; style=&#8221;min-height: 100px; white-space: pre; border: 1px solid black;&#8221;&gt;&lt;/div&gt;<br />
&lt;span id=&#8221;p&#8221;&gt;&lt;/span&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p>
<p><em> </em></p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-18/" title="O POG nosso de cada dia #18">O POG nosso de cada dia #18</a> (10)</li><li><a href="http://www.chrisb.com.br/blog/plugin-jquery-para-criar-janela-modal/" title="Plugin jQuery para criar janela modal">Plugin jQuery para criar janela modal</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/iui-framework-para-desenvolvimento-de-interfaces-para-iphone/" title="iui &#8211; framework para desenvolvimento de interfaces para iPhone">iui &#8211; framework para desenvolvimento de interfaces para iPhone</a> (1)</li><li><a href="http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/" title="Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2">Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-16/" title="O POG nosso de cada dia #16">O POG nosso de cada dia #16</a> (8)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/upload-de-arquivos-do-file-system-direto-pela-interface-web/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Plugin para estilizar selects com jQuery</title>
		<link>http://www.chrisb.com.br/blog/plugin-para-estilizar-selects-com-jquery/</link>
		<comments>http://www.chrisb.com.br/blog/plugin-para-estilizar-selects-com-jquery/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 11:56:53 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=2165</guid>
		<description><![CDATA[Uma grande dificuldade que se tem em termos de interfaces para web é estilizar os selects (também conhecidos como combo boxes, desde a época do desenvolvimento de aplicativos com VB, Delphi e afins) nas páginas. Eles devem ser, até onde me lembro, os que menos possuem formas de ter o look &#38; feel alterados. Se [...]]]></description>
			<content:encoded><![CDATA[<p>Uma grande dificuldade que se tem em termos de interfaces para web é estilizar os selects (também conhecidos como combo boxes, desde a época do desenvolvimento de aplicativos com VB, Delphi e afins) nas páginas. Eles devem ser, até onde me lembro, os que menos possuem formas de ter o <em>look &amp; feel</em> alterados.</p>
<p>Se você usa a <em>jQuery UI</em> no seu projeto, pode tentar esse plugin:</p>
<p><a href="http://www.filamentgroup.com/lab/jquery_ui_selectmenu_an_aria_accessible_plugin_for_styling_a_html_select/">http://www.filamentgroup.com/lab/jquery_ui_selectmenu_an_aria_accessible_plugin_for_styling_a_html_select/</a></p>
<p>Ele foi disponibilizado na área do <a href="http://jquery-ui.googlecode.com/svn/branches/labs/">jQuery UI Labs</a>, que é uma área experimental, para a qual qualquer pessoa pode enviar sua contribuição e, quem sabe, tê-la incorporada ao projeto. O bacana desse plugin?<br />
Você consegue estilizar os selects, colocando cores, fundo, ícones, hierarquia. Tudo de uma forma muito simples:</p>
<blockquote><p><em>$(&#8216;select&#8217;).selectmenu();</em></p></blockquote>
<p>O bacana é que ele já foi desenhado dentro dos temas pré-definidos da <em>jQuery UI</em>, então você pode aproveitar muito do <em>look &amp; feel</em> criado, e ter alguns selects com essa cara abaixo!</p>
<p><img class="alignnone" src="http://www.tripwiremagazine.com/wp-content/uploads/images/stories/Articles/jquery-div/selectmenu.jpg" alt="" width="625" height="250" /></p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-17/" title="O POG nosso de cada dia #17">O POG nosso de cada dia #17</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/atualizacao-na-pagina-de-jobs/" title="Atualização na página de jobs">Atualização na página de jobs</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/links-bacanas-sobre-progressive-enhancement-e-graceful-degradation/" title="Links bacanas sobre Progressive Enhancement e Graceful Degradation">Links bacanas sobre Progressive Enhancement e Graceful Degradation</a> (3)</li><li><a href="http://www.chrisb.com.br/blog/plugin-jquery-para-criar-janela-modal/" title="Plugin jQuery para criar janela modal">Plugin jQuery para criar janela modal</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/" title="Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2">Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/plugin-para-estilizar-selects-com-jquery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O POG nosso de cada dia #17</title>
		<link>http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-17/</link>
		<comments>http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-17/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 14:02:06 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[POG]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[gambiarra]]></category>
		<category><![CDATA[ie6]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=2174</guid>
		<description><![CDATA[Mais um POG que só o IE 6 nos faz conceber&#8230; O problema Comecei a usar a jQuery UI em uma implementação, mais precisamente para ter elementos (divs) de três colunas podendo ser rearranjados (dentro das colunas e entre elas) por drag&#8217;n drop. Tudo indo bem, suave, com o Sortable da UI. Nenhum bug, impressionante. [...]]]></description>
			<content:encoded><![CDATA[<p>Mais um <strong>POG</strong> que só o IE 6 nos faz conceber&#8230;</p>
<h2>O problema</h2>
<p>Comecei a usar a <a href="http://jqueryui.com/">jQuery UI</a> em uma implementação, mais precisamente para ter elementos (divs) de três colunas podendo ser rearranjados (dentro das colunas e entre elas) por <em>drag&#8217;n drop</em>. Tudo indo bem, suave, com o <em>Sortable</em> da UI. Nenhum bug, impressionante. Mas aí, o cliente reporta um erro: dentro de uma div, tem uns campos input checkbox que perdem a seleção quando a div é arrastada.</p>
<p>Na hora, já quase comecei a chorar, pois me parecia ser um daqueles bugs sem <span style="text-decoration: line-through;">sentido</span> solução, do IE.</p>
<h2>O POG</h2>
<p>Nada que o Google não resolva&#8230; uma pequena busca, e me deparo com esses posts:</p>
<ul>
<li><a href="http://webbugtrack.blogspot.com/2007/11/bug-299-setattribute-checked-does-not.html">http://webbugtrack.blogspot.com/2007/11/bug-299-setattribute-checked-does-not.html</a></li>
<li><a href="http://groups.google.com/group/jquery-ui/browse_thread/thread/918fc66cf264d3da/ac1bc0633ed97900?show_docid=ac1bc0633ed97900&amp;pli=1">http://groups.google.com/group/jquery-ui/browse_thread/thread/918fc66cf264d3da/ac1bc0633ed97900?show_docid=ac1bc0633ed97900&amp;pli=1</a></li>
</ul>
<p>O que eles falam? Que você só precisa colocar um atributo mágico chamado <em>defaultChecked</em> com valor <em>defaultChecked</em> nos inputs para ele não perder a seleção. Segue exemplo abaixo:</p>
<p><em>$(&#8220;input&#8221;).attr({checked: &#8220;checked&#8221;, defaultChecked:&#8221;defaultChecked&#8221;});</em></p>
<p>Em mais de 5 anos trabalhando &#8211; muito &#8211; com web, nunca tinha visto esse atributo, nem precisado usar. O porque setar ele? Nem fui atrás de saber, mas certamente não faz sentido! Muito bom, IE6, contribuindo para os blogs que falam sobre <em>gambiarras</em>!</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/plugin-para-estilizar-selects-com-jquery/" title="Plugin para estilizar selects com jQuery">Plugin para estilizar selects com jQuery</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/boas-referencias-e-divertidas-sobre-pog/" title="Boas referências (e divertidas) sobre POG">Boas referências (e divertidas) sobre POG</a> (6)</li><li><a href="http://www.chrisb.com.br/blog/plugin-jquery-para-criar-janela-modal/" title="Plugin jQuery para criar janela modal">Plugin jQuery para criar janela modal</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/" title="Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2">Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-16/" title="O POG nosso de cada dia #16">O POG nosso de cada dia #16</a> (8)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-17/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Plugin jQuery para criar janela modal</title>
		<link>http://www.chrisb.com.br/blog/plugin-jquery-para-criar-janela-modal/</link>
		<comments>http://www.chrisb.com.br/blog/plugin-jquery-para-criar-janela-modal/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 00:07:04 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[modal]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=2167</guid>
		<description><![CDATA[Passando rapidinho aqui para fazer um jabá do plugin para fazer janelas modais com jQuery que o Tidbits disponibilizou. O plugin foi feito pelo Danilo e mais alguns colegas, depois de terem procurado alguns plugins desse tipo e não terem encontrado nenhum que se adequasse ao que eles precisavam. O jabá é porque ese plugin [...]]]></description>
			<content:encoded><![CDATA[<p>Passando rapidinho aqui para fazer um jabá do <a href="http://www.tidbits.com.br/click-modal-plugin-de-jquery-para-fazer-modal-lightbox">plugin para fazer janelas modais com jQuery</a> que o <a href="http://www.tidbits.com.br">Tidbits</a> disponibilizou.<br />
O plugin foi feito pelo <a href="http://www.daniloaugusto.com.br/">Danilo</a> e mais alguns colegas, depois de terem procurado alguns plugins desse tipo e não terem encontrado nenhum que se adequasse ao que eles precisavam.</p>
<p>O jabá é porque ese plugin acabou me salvando em dois projetos na última semana.</p>
<p>O uso é simples: qualquer elemento ganha um método <em>modal</em>(). Se for um link, automaticamente é usado o <em>href</em> dele &#8211; mas você pode passar qualquer url como parâmetro. Será feito um request assíncrono e o resultado dele, jogado no modal.</p>
<p>O bom desse plugin é que ele é leve e muito fácil de usar, e precisa de muito pouca coisa &#8211; vê lá os exemplos de uso!</p>
<p>Uma coisa que eu acho que falta &#8211; e espero conseguir ter um tempo pra dedicar a fazer essa funcionalidade &#8211; é poder passar uma função de <em>callback</em> como parâmetro para ser executada assim que o request terminar. Isso pode ser contornado colocando <em>javascript</em> dentro do conteúdo do retorno, o que não é algo tão ruim se for um projeto pequeno &#8211; mas pode gerar uma bagunça em projetos maiores.</p>
<p>Então, o que falta? Você ir visitar a página do plugin: <a href="http://www.tidbits.com.br/click-modal-plugin-de-jquery-para-fazer-modal-lightbox">http://www.tidbits.com.br/click-modal-plugin-de-jquery-para-fazer-modal-lightbox</a></p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/" title="Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2">Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/" title="8++ perguntas para o Julio Greff">8++ perguntas para o Julio Greff</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/como-pegar-dimensoes-da-janela-e-da-barra-de-rolagem-por-javascript/" title="Como pegar dimensões da janela e da barra de rolagem por javascript">Como pegar dimensões da janela e da barra de rolagem por javascript</a> (1)</li><li><a href="http://www.chrisb.com.br/blog/javascript-cheat-sheet/" title="Javascript Cheat Sheet">Javascript Cheat Sheet</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/atualizacao-na-pagina-de-jobs/" title="Atualização na página de jobs">Atualização na página de jobs</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/plugin-jquery-para-criar-janela-modal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</title>
		<link>http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/</link>
		<comments>http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 00:04:31 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[scripty2]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=2113</guid>
		<description><![CDATA[Passou meio que batido &#8211; infelizmente &#8211; o lançamento de uma nova versão da Prototype, a 1.6.1, no começo de Setembro. Faça download aqui! Preciso fazer a minha mea culpa: tenho utilizado em praticamente 100% dos meus projetos a jQuery, e tem sobrado pouco tempo para no mínimo ler as atualizações no blog e fórum [...]]]></description>
			<content:encoded><![CDATA[<p>Passou meio que batido &#8211; infelizmente &#8211; o lançamento de uma nova versão da <strong>Prototype</strong>, a 1.6.1, no começo de Setembro.</p>
<p><a href="http://www.prototypejs.org/download">Faça download aqui!</a></p>
<p>Preciso fazer a minha <em>mea culpa</em>: tenho utilizado em praticamente 100% dos meus projetos a <em>jQuery</em>, e tem sobrado pouco tempo para no mínimo ler as atualizações no blog e fórum da <em>Prototype</em>.</p>
<p>Mas, vamos ao que interessa: <a href="http://www.prototypejs.org/2009/9/1/prototype-1-6-1-released">as novidades</a>.<br />
Além de ganho de performance &#8211; algo que sempre foi criticado na <strong>Prototype</strong> &#8211; agora há compatibilidade com o Google Chrome 1 e o IE8, além de novos eventos de mouse suportados e uma forma de associar chaves/valores a elementos do DOM.<br />
Ao mesmo tempo, foram feitas modificações na forma de distribuicão da biblioteca (com o uso do <a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=3&amp;ved=0CB4QFjAC&amp;url=http%3A%2F%2Fgetsprockets.org%2F&amp;ei=_wbZSp6MOcjf8Ab4voW3BQ&amp;usg=AFQjCNFq7bdzGv1LbpIcKRDwMHi6Ru3odw&amp;sig2=cDRbAqqFFdErIVgI4FyZ4g">Sprockets</a>) e a documentação segue o formato <em>PDoc</em>.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.prototypejs.org/images/logo-home.gif" alt="" width="127" height="64" /></p>
<p>Para quem vê apenas essas alterações, pode achar que é pouca coisa, mas a <em>Prototype</em> sempre foi uma biblioteca bem madura, com uma clareza que poucas outras têm. Me parece que o time de desenvolvedores tentou se ater mais a ganhos de performance e documentação para esse release.</p>
<p>Além do que, a <em>Prototype</em>, como já disse outras vezes, é ideal para se construir outras coisas em cima dela &#8211; se você quer fazer componentes ricos javascript, eu indico a <em>Prototype</em> como base. E é isso que a antiga <strong>script.aculo.us</strong> era: um framework com efeitos e manipulação de elementos DOM por javascript, com interações do usuário. Usei o verbo no passado pois o framework está passando por uma bela reformulação, inclusive mudando de nome, para <a href="http://scripty2.com/">scripty2</a>.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://scripty2.com/images/logo.png" alt="" width="400" /></p>
<p>Ainda está em versão alpha, mas muito me agradou o que eu vi, e a forma como o código pode ser escrito. Pouco foi mostrado, mas eu acho que finalmente pode haver uma chance da <em>Prototype</em> voltar a respirar caso o <strong>scripty2</strong> venha a conseguir bater de frente com a <em>jQuery UI</em> ou os inúmeros plugins de efeitos escritos para a <em>jQuery</em> (deixando claro novamente que não quero fomentar nenhuma briga entre fanboys de bibliotecas javascript!).</p>
<p>Para aqueles que já usaram, fica a dica. Para aqueles que nunca viram a <strong>Prototype</strong>, fica a sugestão: faça download e veja o que ela tem de bom, e como ela tem um enfoque diferente de outras bibliotecas.</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/como-pegar-dimensoes-da-janela-e-da-barra-de-rolagem-por-javascript/" title="Como pegar dimensões da janela e da barra de rolagem por javascript">Como pegar dimensões da janela e da barra de rolagem por javascript</a> (1)</li><li><a href="http://www.chrisb.com.br/blog/javascript-cheat-sheet/" title="Javascript Cheat Sheet">Javascript Cheat Sheet</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/reportagem-sobre-frameworks-javascript-na-revista-ti-digital/" title="Reportagem sobre frameworks javascript na Revista TIdigital">Reportagem sobre frameworks javascript na Revista TIdigital</a> (10)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/" title="Mostrando o potencial da JS Calls PHP #1">Mostrando o potencial da JS Calls PHP #1</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-3/" title="O POG nosso de cada dia #3">O POG nosso de cada dia #3</a> (27)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Plugin para criar elementos DOM com a jQuery</title>
		<link>http://www.chrisb.com.br/blog/plugin-para-criar-elementos-dom-com-a-jquery/</link>
		<comments>http://www.chrisb.com.br/blog/plugin-para-criar-elementos-dom-com-a-jquery/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 20:34:45 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=2014</guid>
		<description><![CDATA[Algo que sempre senti falta no core da jQuery foi a possibilidade de criar elementos DOM de uma forma mais simples &#8211; até porque estava acostumado a fazer isso com o Element() da Prototype, e não queria voltar a usar todos aqueles document.createElement() novamente. Dei uma procurada e encontrei a jQuery DOM Elements Creator (Domec). [...]]]></description>
			<content:encoded><![CDATA[<p>Algo que sempre senti falta no core da <strong>jQuery</strong> foi a possibilidade de criar elementos <em>DOM</em> de uma forma mais simples &#8211; até porque estava acostumado a fazer isso com o <a href="http://www.prototypejs.org/api/element">Element() da Prototype</a>, e não queria voltar a usar todos aqueles document.createElement() novamente.</p>
<p>Dei uma procurada e encontrei a <a href="http://code.google.com/p/jquery-domec">jQuery DOM Elements Creator</a> (<strong>Domec</strong>). Testei e funcionou bem, no IE6, 7 e Firefox. A sintaxe é bem simples, e  para criar uma div, por exemplo, é:</p>
<p><em>$.create(&#8216;div&#8217;, {&#8216;id&#8217;: &#8216;myId&#8217;}, &#8216;myText&#8217;)</em></p>
<p>Vou colocar abaixo uma implementação completa que fiz, criando vários elementos e adicionando-os uns aos outros:</p>
<pre class="brush: php;">var div = $.create("div",{id: this.htmlId, className: this.htmlClass}, "");
$.create("input",{type: "hidden", className: "widget_type", value: this.type}).appendTo(div);
var divHandler = $.create("div",{className: "widget_handler"});
$.create("h3").appendTo(divHandler);
$.create("a", {href:"#", className: "widget_edit"}, "edit").appendTo(divHandler);
$.create("a", {href:"#", className: "widget_delete"}, "X").appendTo(divHandler);
$.create("br").css({clear: "both"}).appendTo(divHandler);
divHandler.appendTo(div);
$.create("div",{className: "widget_edit_area"}).appendTo(div);
$.create("div",{className: "widget_container"}).appendTo(div);</pre>
<p>Veja a <a href="http://code.google.com/p/jquery-domec/wiki/DocumentationExamples">documentação</a> do plugin para ver todas as possibilidades.</p>
<p><strong>Observação</strong>: testei a performance e foi mais lento, quase o dobro do tempo, para criar elementos do que com <em>document.createElement().</em> Imagino que num projeto muito grande, isso possa ser um problema, mas em projetos menores não deve ter tanto impacto.</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/plugin-para-estilizar-selects-com-jquery/" title="Plugin para estilizar selects com jQuery">Plugin para estilizar selects com jQuery</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-17/" title="O POG nosso de cada dia #17">O POG nosso de cada dia #17</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/plugin-jquery-para-criar-janela-modal/" title="Plugin jQuery para criar janela modal">Plugin jQuery para criar janela modal</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/" title="Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2">Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/" title="8++ perguntas para o Julio Greff">8++ perguntas para o Julio Greff</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/plugin-para-criar-elementos-dom-com-a-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 novos blogs que tenho seguido #2</title>
		<link>http://www.chrisb.com.br/blog/5-novos-blogs-que-tenho-seguido-2/</link>
		<comments>http://www.chrisb.com.br/blog/5-novos-blogs-que-tenho-seguido-2/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 13:42:02 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Diversos]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1991</guid>
		<description><![CDATA[Mais outros 5 blogs que tenho acompanhado. Fica a dica! eualexandre.com.br (site/blog do @kurko, com portfolio e muita coisa sobre PHP e gerIencia de projetos) Igor Escobar (PHP, javascript e mais) IO Tecnologia (variado, sobre tecnologia) Análise Blogueira (o nome fala por si só!) Blog da Webroom (a Webroom é uma agência web, e o [...]]]></description>
			<content:encoded><![CDATA[<p>Mais outros 5 blogs que tenho acompanhado. Fica a dica!</p>
<ul>
<li><a href="http://www.eualexandre.com.br/blog/">eualexandre.com.br</a> (site/blog do @kurko, com portfolio e muita coisa sobre PHP e gerIencia de projetos)</li>
<li><a href="http://www.igorescobar.com">Igor Escobar</a> (PHP, javascript e mais)</li>
<li><a href="http://www.iotecnologia.com.br/">IO Tecnologia</a> (variado, sobre tecnologia)</li>
<li><a href="http://www.analiseblogueira.com">Análise Blogueira</a> (o nome fala por si só!)</li>
<li><a href="http://www.blogdawebroom.com.br">Blog da Webroom</a> (a Webroom é uma agência web, e o blog é bem divertido e tem muita coisa interessante!)</li>
</ul>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/novos-blogs-bacanas-desenvolvimento-web/" title="Novos blogs bacanas de desenvolvimento web">Novos blogs bacanas de desenvolvimento web</a> (6)</li><li><a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/" title="8++ perguntas para o Julio Greff">8++ perguntas para o Julio Greff</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/qual-o-melhor-pog-ate-agora/" title="Qual o melhor POG até agora?">Qual o melhor POG até agora?</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/pagina-de-debug-na-js-calls-php/" title="Página de debug na JS Calls PHP">Página de debug na JS Calls PHP</a> (1)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-2/" title="Mostrando o potencial da JS Calls PHP #2">Mostrando o potencial da JS Calls PHP #2</a> (6)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/5-novos-blogs-que-tenho-seguido-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>8++ perguntas para o Julio Greff</title>
		<link>http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/</link>
		<comments>http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 14:32:53 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Pensamentos]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[spaghetti]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1983</guid>
		<description><![CDATA[Conheci o Julio através dessa vida de procurar referências no Google sobre PHP e javascript! Quando vi, estava no blog dele, vendo posts sobre (as bibliotecas javascript) Mootools e jQuery e, depois, me deparei com o framework MVC de autoria dele, chamado Spaghetti! Já troquei muitas idéias com ele a respeito de diversos assuntos relacionados [...]]]></description>
			<content:encoded><![CDATA[<p>Conheci o Julio através dessa vida de procurar referências no Google sobre <strong>PHP</strong> e <strong>javascript</strong>! Quando vi, estava no blog dele, vendo posts sobre (as bibliotecas javascript) <em>Mootools</em> e <em>jQuery</em> e, depois, me deparei com o <em>framework</em> MVC de autoria dele, chamado <a href="http://spaghettiphp.org/">Spaghetti</a>!<br />
Já troquei muitas idéias com ele a respeito de diversos assuntos relacionados ao mundo de desenvolvimento web, desde implementações como a vida de trabalhar fazendo <em>freela</em>. Ainda, por coincidência, fomos convidados para <a href="http://www.chrisb.com.br/blog/reportagem-sobre-frameworks-javascript-na-revista-ti-digital/">escrever sobre bibliotecas javascript numa matéria da (revista) TI Digital</a>.</p>
<p>Lá vão as perguntas!</p>
<p><strong>1- Como você entrou no mundo da web, e como veio a se tornar um profissional da área?</strong><br />
Eu comecei na área da web de uma maneira bem boba. Lá por 2003 eu comecei a me interessar um pouco mais sobre informática, e quis expandir meus conhecimentos com algo mais do que Windows/Office. Procurei na internet muitas coisas que me pareceram muito interessantes: Photoshop, Corel Draw, Visual Basic, Delphi, coisas do gênero. Mas como eu não tinha acesso aos softwares, fiquei com a única coisa que eu havia encontrado e que eu podia aprender sem precisar de software algum: HTML. A partir daí comecei a pesquisar bastante sobre o assunto, lendo várias apostilas e vários sites, e descobrindo coisas novas como XHTML, CSS, PHP, JavaScript, até a minha descoberta do Ajax. Por algum motivo eu percebi que era isso que eu queria fazer, e passei a levar a sério. Com isso criei <a href="http://juliogreff.net/" target="_blank">meu blog</a> em 2006, onde comecei a postar sobre o que eu ia aprendendo. A partir daí comecei a fazer contatos, freelances começaram a aparecer aos poucos&#8230;</p>
<p><strong>2 &#8211; Qual a importância dos webstandards?</strong><br />
Sem eles, não teríamos a web como conhecemos hoje. Embora ainda não tenhamos uma adoção completa, a coisa seria muito pior se os padrões não existissem. Eles nos permitem que tenhamos informação em vários dispositivos, e eles dão um pouco de significado à nossa informação. SEO, web semântica, scripts, todos eles se beneficiam dos standards.</p>
<p><strong>3 &#8211; Quais as ferramentas que você utiliza no dia-a-dia (editores de texto, imagens, até mesmo o Sistema Operacional, etc&#8230;)?</strong><br />
Sou um usuário de Windows. Gosto muito de Linux, mas ele não gosta muito do meu hardware (e também não se dá bem com a Adobe). Já trabalhei em Mac, e foi uma experiêcia maravilhosa, mas meu bolso não gosta muito de maçãs. Nos editores, foi Komodo Edit no qual eu melhor me adaptei até agora. Multi-plataforma, leve, extensível, gratuito, tudo o que eu queria! Pra trabalhar com layouts, não troco meu Fireworks por Photoshop nenhum, por mais que insistam pra que eu faça isso. Sou tão fiel que uso o Fireworks até pra algumas edições de imagem. Também não abro mão de algumas outras ferramentas que vem me ajudando muito no quesito produtividade: Cygwin+Console2, Git, Launchy, VirtuaWin, MediaMonkey+SongBird (porque desenvolvedor nenhum sobrevive sem música!) e o Spaghetti* =D</p>
<p><strong>4- Qual o impacto do Twitter no seu dia-a-dia online?</strong><br />
Eu sou um viciado em twitter. #fato. Desde que eu passei a utilizá-lo, ele virou parte do meu dia-a-dia. Uma das primeiras coisas que faço ao chegar no computador é abrir o TweetDeck e checar os últimos tweets do pessoal. Isso já me rendeu boas risadas, vários amigos, muita informação útil que dificilmente eu teria encontrado em blogs, e também uma boa quantidade de cultura inútil e tempo não-tão-bem-aproveitado&#8230;</p>
<p><strong>5- Como você vê a diferença entre trabalhar em uma agência de web e como freelancer? Como é lidar com a liberdade de ser um freelancer mas não ter a &#8220;certeza&#8221; que um emprego fixo proporciona?</strong><br />
Se o meu dia tivesse 48 horas, eu diria que ser freelancer e trabalhar em uma agência seria a combinação perfeita: segurança e liberdade ao mesmo tempo. Mas a escolha vai da personalidade de cada um: ser um freelancer é assumir riscos, é ter disciplina, é trabalhar sempre sozinho. Trabalhar em uma agência é mais seguro, é geralmente mais divertido, aprende-se muito mais, mas pode-se aplicar com muito menos liberdades o que se aprende fora da agência. Eu ainda não escolhi qual dos dois caminhos pretendo seguir, por enquanto me mantenho nos dois, ainda não tenho a disciplina pra ser freelancer, ainda não me sinto seguro pra assumir certos riscos, mas muitas coisas na vida de agência ainda me incomodam.</p>
<p><strong>6- Você é um dos que concebeu o Spaghetti. Fale mais a respeito dele (como ele surgiu, porque fazer um framework para &#8220;concorrer&#8221; com outros, etc&#8230;)</strong> ?<br />
O Spaghetti* surgiu da nossa discordância com o framework que usávamos, o CakePHP. Ele era grande demais, pesado demais, e algumas coisas não se encaixavam na nossa maneira de escrever aplicações. O Spaghetti* surgiu, e se mantém até agora, totalmente sem pretensão de &#8220;concorrer&#8221; com outros frameworks, embora a gente goste de pensar que, se serviu pra gente, pode servir pra mais alguém também. Nossa filosofia é mantê-lo simples, sem encher de features sem que precisemos (basicamente, tudo que há no Spaghetti* surgiu da necessidade), e incentivar as boas práticas (embora algumas delas ainda não sejam facilitadas, como TDD, por exemplo). Hoje, além de me ajudar na maior parte dos meus projetos, o Spaghetti* também tem servido para MUITO aprendizado, pois nunca teria aprendido muita coisa do que sei hoje se não fosse na construção do Spaghetti*. E sei que há ainda muito mais a aprender, o que me mantém motivado a continuar a desenvolver. E, se a gente conseguir ajudar alguém no caminho, melhor!<br />
<strong><br />
7- Você utilizava muito Mootools, mas hoje em dia usa a jQuery (e em posts antigos do seu blog, você deixa claro que não era muito fã da jQuery). Hoje em dia, você utiliza muito a jQuery, não? Como se deu essa mudança? Foi uma imposicão do próprio mercado, onde jQuery é predominante, ou tem mais por trás disso?</strong><br />
Pra mim, em termos de frameworks JavaScript, não existe muito isso de mercado. Se você precisar, você aprende uma nova, pra mim é simples assim. Não aprendi jQuery por necessidade nem por imposição, foi apenas pra experimentar alguma coisa nova, por diversão. Foi aí que acabei gostando (e descobrindo que algumas coisas eu ainda não gosto). Não foi bem uma mudança, e sim mais alguma coisa pra minha caixa de ferramentas: utilizo em alguns projetos, mas Mootools ainda faz parte da maioria dos meus projetos, cada uma tem lugares em que se encaixam melhor. E, pra não permanecer sempre na mesma, logo aprendo Prototype também.<br />
<strong><br />
8- Você vê o PHP perdendo, em termos práticos, espaço para outras linguagens como Ruby e Python, ou acha que PHP ainda vai se manter por um bom tempo na frente das aplicações web do seu nicho?</strong><br />
Embora ainda esteja longe de ser significativo, acho que o PHP vem perdendo um pouco de espaço sim. Entretanto, por algumas de suas facilidades, ele ainda deve continuar na frente por mais alugm tempo. Só acredito que o PHP poderia ainda evoluir, o que não parece que vai acontecer tão cedo, já que a versão 6 não traz nada de muito interessante para algumas coisas que me incomodam nele. De qualquer maneira, o boom dos frameworks depois do Rails, apesar de diminuirem um pouco o uso do PHP, trouxe bastante evolução indiretamente. Eu também passei a prestar mais atenção no que eu escrevia só após o Rails!</p>
<p><strong>Plus- Para onde você acha que a web vai, de uma forma bem ampla (tanto no que diz respeito a tecnologia, como formas de comunicação e aplicações)?</strong><br />
Eu acredito que a web caminhe muito para a plataforma móvel, com a integração de vários dispositivos, como câmeras, GPS, acelerômetro, tudo isso que já temos disponível e sabe-se lá mais o que vem por aí. Nem preciso falar no caminho que as aplicações desktop já estão tomando em direção a web. Também acredito, talvez em um futuro um pouco mais distante, na web semântica, uso mais inteligente da informação pelas aplicações. E, como não podia deixar de ser, acredito que o IE6 vai deixar de existir, e teremos somente browsers 100% standard-compliant =D</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/reportagem-sobre-frameworks-javascript-na-revista-ti-digital/" title="Reportagem sobre frameworks javascript na Revista TIdigital">Reportagem sobre frameworks javascript na Revista TIdigital</a> (10)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/" title="Mostrando o potencial da JS Calls PHP #1">Mostrando o potencial da JS Calls PHP #1</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/plugin-jquery-para-criar-janela-modal/" title="Plugin jQuery para criar janela modal">Plugin jQuery para criar janela modal</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/" title="Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2">Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/5-novos-blogs-que-tenho-seguido-2/" title="5 novos blogs que tenho seguido #2">5 novos blogs que tenho seguido #2</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>XMLHttpRequest cross-site: mais uma vez o IE fora do padrão</title>
		<link>http://www.chrisb.com.br/blog/xmlhttprequest-cross-site-mais-uma-vez-o-ie-fora-do-padrao/</link>
		<comments>http://www.chrisb.com.br/blog/xmlhttprequest-cross-site-mais-uma-vez-o-ie-fora-do-padrao/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 21:31:32 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1934</guid>
		<description><![CDATA[Uma questão fortemente levantada para quem implementa interfaces web é a das requisições assíncronas feitas por javascript não poder ser feitas de um domínio para o outro (por exemplo, um javascript hospedado em http://minhaurl.com não consegue acessar nenhuma outra url em outro domínio, como http://aquelaurl.com) Tem há algum tempo a especificação 2 do XMLHttpRequest que [...]]]></description>
			<content:encoded><![CDATA[<p>Uma questão fortemente levantada para quem implementa interfaces web é a das requisições assíncronas feitas por <em>javascript</em> não poder ser feitas de um domínio para o outro (por exemplo, um <em>javascript</em> hospedado em <strong>http://minhaurl.com</strong> não consegue acessar nenhuma outra url em outro domínio, como<strong> http://aquelaurl.com</strong>)</p>
<p>Tem há algum tempo a<a href="http://www.w3.org/TR/2009/WD-XMLHttpRequest2-20090820/"> especificação 2 do XMLHttpRequest</a> que possibilita essa funcionalidade, chamada de <strong>CORS</strong>: <em>Cross-Origin Resource Sharing</em><br />
Basicamente, é uma troca de headers específicos entre cliente e servidor para formalizar e garantir a origem da requisição.</p>
<p><strong>Ulá-lá, isso é uma mão na roda!</strong></p>
<p>E é mesmo! Abrem-se muitas portas: muitos <em>mashups</em> podem ser feitos, muitas coisas que antes necessitavam de backend podem ser resolvidas apenas na camada de interface, dentro outras &#8211; claro, sempre levando em conta questões de segurança, como tomar muito cuidado em como você vai expor seus dados por aí pela web, e tomar<em> extra-care</em> quando se tratar de requisições que podem alterar dados persistidos na sua aplicação.<br />
A essa funcionalidade, de fazer requisições entre servidores, é dado o apelido <strong>XDR</strong> (X de cross, D de domain, R de request).</p>
<p>O foco desse post, no entanto, não é falar da implementação em si, até porque eu não conseguiri escrever nada melhor <a href="http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/">do que foi escrito pelo hacks.mozilla</a>, mas sim falar que novamente <span style="color: #000000;"><strong>a Microsoft atrapalha os padrões</strong></span> (aliás, vejam com cuidado esse post no hacks.mozilla: completíssimo, com exemplos de implementação, notas, dicas e poréms).</p>
<p>Os browsers Firefox 3.5 e Safari 4 implementam já essa especificação 2 do <em>XMLHttpRequest</em>, mas o recém-lançado IE8 implementa &#8220;uma parte&#8221; apenas. E para isso, criaram um novo objeto, o <em>XDomainRequest</em></p>
<p>Veja um exemplo de como fazer a instanciação correta de um objeto para ser utilizado, que pode fazer <strong>XDR</strong>:</p>
<pre class="brush: php;">var url = "http://bar.other/publicNotaries/"
if(XMLHttpRequest) {
var request = new XMLHttpRequest();
if("withCredentials" in request) {
// Firefox 3.5 and Safari 4
request.open('GET', url, true);
request.onreadystatechange = handler;
request.send();
} else if (XDomainRequest) {
// IE8
var xdr = new XDomainRequest();
xdr.open("get", url);
xdr.send();
// handle XDR responses -- not shown here
}
// This version of XHR does not support CORS
// Handle accordingly
}</pre>
<p>*nesse código, é usado o atributo withCredentials para verificar se é um objeto que pode fazer o cross-site (ele é específico do <strong>CORS</strong>)</p>
<p>Agora, note que novamente é preciso fazer uma verificação de qual é o objeto ao qual o browser tem acesso, que nem se faz tradicionalmente, só que dessa vez checando se possui o <em>XDomainRequest</em> ao invés do <em>ActiveXObject(&#8216;Msxml2.XMLHTTP&#8217;)</em></p>
<p>Porque raios a <em>Microsoft</em> não implementa esse objeto na <strong>engine</strong> do browser e segue um padrão, inclusive definido pela <strong>W3C</strong>, e facilita a vida? Não vejo um só motivo para continuar com essa coisa de sempre tentar usar um objeto diferente, único e próprio. Ainda mais agora que estão numa campanha pró-adoção do IE8 por parte inclusive dos desenvolvedores&#8230;</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/comprimento-maximo-de-uma-url/" title="Comprimento máximo de uma url">Comprimento máximo de uma url</a> (11)</li><li><a href="http://www.chrisb.com.br/blog/nomenclatura-das-engines-dos-browsers/" title="Nomenclatura das engines dos browsers">Nomenclatura das engines dos browsers</a> (12)</li><li><a href="http://www.chrisb.com.br/blog/acessos-por-browser-estatisticas-do-meu-blog/" title="Acessos por browser &#8211; estatísticas do meu blog">Acessos por browser &#8211; estatísticas do meu blog</a> (8)</li><li><a href="http://www.chrisb.com.br/blog/sem-som-no-flash-ao-atualizar-o-firefox-3-6-no-ubuntu/" title="Sem som no flash ao atualizar o Firefox 3.6 no Ubuntu">Sem som no flash ao atualizar o Firefox 3.6 no Ubuntu</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/upload-de-arquivos-do-file-system-direto-pela-interface-web/" title="Upload de arquivos do file system direto pela interface web">Upload de arquivos do file system direto pela interface web</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/xmlhttprequest-cross-site-mais-uma-vez-o-ie-fora-do-padrao/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Como pegar dimensões da janela e da barra de rolagem por javascript</title>
		<link>http://www.chrisb.com.br/blog/como-pegar-dimensoes-da-janela-e-da-barra-de-rolagem-por-javascript/</link>
		<comments>http://www.chrisb.com.br/blog/como-pegar-dimensoes-da-janela-e-da-barra-de-rolagem-por-javascript/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 16:03:11 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1916</guid>
		<description><![CDATA[Isso seria efetivamente fácil, se todos os browsers seguissem o padrão da ECMA&#8230; mas não é assim que funciona, e ontem um dos meninos que trabalha aqui comigo estava tentando implementar um código javascript que utiliza tanto a altura útil da tela, como a altura visível da janela (window) e a posição das scrollbars. Papo [...]]]></description>
			<content:encoded><![CDATA[<p>Isso seria efetivamente fácil, se todos os browsers seguissem o padrão da <strong>ECMA</strong>&#8230; mas não é assim que funciona, e ontem um dos meninos que trabalha aqui comigo estava tentando implementar um código javascript que utiliza tanto a altura útil da tela, como a altura visível da janela (<em>window</em>) e a posição das scrollbars.</p>
<p>Papo vai, papo vem, procura na API da <strong>Prototype</strong> aqui, da <strong>jQuery</strong> ali, abre o Google acolá&#8230; e me deparo com uma página muito completa, que lista os <em>browsers</em> (inclusive por sistema operacional) e qual é o objeto e atributo que está disponível nele.</p>
<table border="1" cellspacing="0" cellpadding="4">
<tbody>
<tr>
<th>browser</th>
<th>platform</th>
<th>mode</th>
<th>window.innerWidth<br />
window.innerHeight<br />
window.pageXOffset<br />
window.pageYOffset</th>
<th>document.documentElement.clientWidth<br />
document.documentElement.clientHeight<br />
document.documentElement.scrollLeft<br />
document.documentElement.scrollTop</th>
<th>document.body.clientWidth<br />
document.body.clientHeight<br />
document.body.scrollLeft<br />
document.body.scrollTop</th>
</tr>
<tr>
<td>IE</td>
<td>Win32</td>
<td>w. DTD</td>
<td>undef<br />
undef<br />
undef<br />
undef</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
<td>doc. width<br />
doc. height<br />
0<br />
0</td>
</tr>
<tr>
<td>IE</td>
<td>Win32</td>
<td>w/o. DTD</td>
<td>undef<br />
undef<br />
undef<br />
undef</td>
<td>0<br />
0<br />
0<br />
0</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
</tr>
<tr>
<td>IE</td>
<td>Mac</td>
<td>all</td>
<td>undef<br />
undef<br />
undef<br />
undef</td>
<td>undef<br />
undef<br />
undef<br />
undef</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
</tr>
<tr>
<td>Firefox</td>
<td>Win32/Mac</td>
<td>w. DTD</td>
<td>+scroller<br />
+scroller<br />
ok<br />
ok</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
<td>ok<br />
doc. height.<br />
ok<br />
ok</td>
</tr>
<tr>
<td>Firefox</td>
<td>Win32/Mac</td>
<td>w/o. DTD</td>
<td>+ scroller<br />
+scroller<br />
ok<br />
ok</td>
<td>doc.width<br />
doc.height<br />
0<br />
0</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
</tr>
<tr>
<td>Netscape</td>
<td>Win32</td>
<td>w. DTD</td>
<td>+ scroller<br />
+scroller<br />
ok<br />
ok</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
<td>ok<br />
doc. height.<br />
ok<br />
ok</td>
</tr>
<tr>
<td>Netscape</td>
<td>Win32</td>
<td>w/o. DTD</td>
<td>+ scroller<br />
+scroller<br />
ok<br />
ok</td>
<td>0<br />
0<br />
0<br />
0</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
</tr>
<tr>
<td>Opera</td>
<td>Win32/Mac</td>
<td>all</td>
<td>+ scroller<br />
+scroller<br />
ok<br />
ok</td>
<td>ok<br />
doc.height<br />
ok<br />
ok</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
</tr>
<tr>
<td>Safari</td>
<td>Mac</td>
<td>all</td>
<td>ok<br />
ok<br />
ok<br />
ok</td>
<td>ok<br />
doc.height<br />
0<br />
0</td>
<td>ok<br />
doc.height<br />
ok<br />
ok</td>
</tr>
</tbody>
</table>
<p>Ou seja, não existe um método que funcione para todos os browser&#8230; <img src='http://www.chrisb.com.br/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Mas, o autor criou uma implementação <em>cross-browser</em> que funciona para calcular todos esses atributos (altura e largura da janela, posição da scrollbar horizontal e vertical). Fica a dica!</p>
<pre class="brush: php;">function f_clientWidth() {
	return f_filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}
function f_clientHeight() {
	return f_filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}
function f_scrollLeft() {
	return f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
function f_scrollTop() {
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel &amp;&amp; (!n_result || (n_result &gt; n_docel)))
		n_result = n_docel;
	return n_body &amp;&amp; (!n_result || (n_result &gt; n_body)) ? n_body : n_result;
}
</pre>
<p>Segue o link da página, para referência:<a href="http://www.softcomplex.com/docs/get_window_size_and_scrollbar_position.html"> http://www.softcomplex.com/docs/get_window_size_and_scrollbar_position.html</a></p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/" title="Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2">Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/javascript-cheat-sheet/" title="Javascript Cheat Sheet">Javascript Cheat Sheet</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/reportagem-sobre-frameworks-javascript-na-revista-ti-digital/" title="Reportagem sobre frameworks javascript na Revista TIdigital">Reportagem sobre frameworks javascript na Revista TIdigital</a> (10)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/" title="Mostrando o potencial da JS Calls PHP #1">Mostrando o potencial da JS Calls PHP #1</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-3/" title="O POG nosso de cada dia #3">O POG nosso de cada dia #3</a> (27)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/como-pegar-dimensoes-da-janela-e-da-barra-de-rolagem-por-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->