<?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>Zona J &#187; javascript</title>
	<atom:link href="http://www.zonaj.org/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zonaj.org</link>
	<description>Zona Java - Um blog português sobre java.</description>
	<lastBuildDate>Wed, 26 May 2010 17:23:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Como garantir Qualidade de Software?</title>
		<link>http://www.zonaj.org/2008/09/28/como-garantir-qualidade-de-software/</link>
		<comments>http://www.zonaj.org/2008/09/28/como-garantir-qualidade-de-software/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 09:42:05 +0000</pubDate>
		<dc:creator>Ruben Badaró</dc:creator>
				<category><![CDATA[evento]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[futurismo]]></category>
		<category><![CDATA[geral]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[qualidade]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=145</guid>
		<description><![CDATA[Definir qualidade de software é difícil pois são muitos os factores que influenciam os resultados.
Mais do que ser uma lista extensiva de soluções, este post tem como objectivo identificar a maioria dos pontos &#8211; são, aliás, perfeitamente lógicos e conhecidos &#8211; que têm de ser testados e validados, e apontar a direcção e algumas ferramentas.
É [...]]]></description>
			<content:encoded><![CDATA[<p>Definir qualidade de software é difícil pois são muitos os factores que influenciam os resultados.<br />
Mais do que ser uma lista extensiva de soluções, este post tem como objectivo identificar a maioria dos pontos &#8211; são, aliás, perfeitamente lógicos e conhecidos &#8211; que têm de ser testados e validados, e apontar a direcção e algumas ferramentas.<br />
É uma visão na perspectiva de QA (<em>Quality Assurance</em>), mais especificamente de testes. Posso dividir estes factores em dois grupos:</p>
<ul>
<li><strong>Organizacionais ou processuais</strong></li>
<p>Englobam o tipo de gestão de projecto, metodologia de desenvolvimento da equipa, qualidade e processo de recolha de requisitos.</p>
<li><strong>Técnicos</strong></li>
<p>Os artefactos de código e semelhantes produzidos pelos developers e os processos levados a cabo por testers.
</ul>
<p>Este post foca-se primordialmente nos factores técnicos, que passo a enumerar.</p>
<h3>Correcção do código produzido</h3>
<p>É importantíssima a exigência que cada programador coloca em si próprio para escrever código de qualidade: primeiramente, código o mais correcto possível.<br />
No entanto, não basta tentar escrever código correcto, é também necessário pensar nas implicações de performance do que se escreve (por exemplo, fazer um select completo a uma tabela grande sem necessidade), de thread safety, de segurança (caso mais comum, SQL injection para o qual PreparedStatements são uma grande ajuda), de documentação (comentários relevantes) e de estética do próprio código (definir e seguir convenções).</p>
<p>Este ponto depende também da própria qualidade das pessoas na equipa e a diferença além de se pagar nota-se!</p>
<h3>Testes Unitários</h3>
<p>Escrever testes unitários é a forma mais directa que a equipa tem de garantir correcção do código.<br />
Em TDD (<em>Test Driven Development</em>) o teste unitário é a unidade básica e o código é desenvolvido para satisfazer cada teste. Esta aproximação é altamente eficaz mas exige disciplina e considero que é difícil de ser usada pela maioria das equipas, especialmente portuguesas.<br />
No entanto, mesmo em ambientes não TDD este tipo de testes são essenciais, não só para garantir que o código está correcto, como para verificar que não se quebra código anterior cada vez que se alteram ou adicionam funcionalidades.<br />
Quanto maior for a percentagem de caminhos possíveis de código coberta por testes unitários &#8211; o chamado <em>code coverage</em> &#8211; maior é a indicação de garantia de qualidade do código como um todo.</p>
<p>Ferramentas:<br />
<a href="http://www.junit.org/">JUnit</a>, <a href="http://testng.org">TestNG</a>, <a href="http://dbunit.sourceforge.net/">DbUnit</a>, <a href="http://jakarta.apache.org/cactus/">Cactus</a>, <a href="http://www.atlassian.com/software/clover/">Atlassian Clover</a> (<em>code coverage</em>)</p>
<h3><em>Code Reviews</em></h3>
<p>Ainda dentro dos mecanismos de controle que a própria equipa pode usar durante o desenvolvimente encontram-se os <em>code reviews</em>.<br />
Devíamos existir sempre <em>code reviews</em>, embora seja aceitável que não tenhamos 100% do código revisto, apenas uma boa percentagem. E esta boa percentagem é um equilíbrio entre o esforço que a equipa tem a rever e a melhoria de qualidade percebida.<br />
Ter este tipo de controle cria um tipo de <em>peer pressure</em> na equipa. Ninguém é dono do seu pedaço de código, todos sabem que os outros colegas vão validar o que escrevem por isso vão ter um cuidado extra no que produzem.<br />
Desta forma más práticas e erros são detectados cedo no processo e toda a equipa ganha pois todos os membros da equipa aprendem com as correcções que lhes são feitas, especialmente os membros menos experientes que têm neste processo um <em>mentoring</em> por parte de toda a equipa.</p>
<p>Ferramentas:<br />
<a href="http://www.atlassian.com/software/crucible/">Atlassian Crucible</a></p>
<h3>Análise Estática</h3>
<p>Ferramentas de análise estática permitem detectar no erros e standards no código de forma simples. Alguns erros detectados por estas ferramentas poucos ou nenhums programadores conseguem detectar e não são apanhados na grande maioria dos outros testes por isso são uma grande adição.</p>
<p>Ferramentas:<br />
<a href="http://findbugs.sourceforge.net/">FindBugs</a> (obrigatório!), <a href="http://checkstyle.sourceforge.net/">Checkstyle</a></p>
<h3>Sistema de builds / integração contínua</h3>
<p>Builds automatizados é obrigatório! Muitos são os projectos hoje em dia em que cada developer tem o seu próprio processo de build separado no seu IDE.<br />
Seguindo a regra de ouro de que quanto mais cedo se detecta um erro melhor, o processo de builds pode e deve ser escalonado num motor de integração contínua que permite rapidamente detectar quando um membro da equipa quebra o build.<br />
Igualmente importante é adicionar ao processo de build meios adicionais de controlo de qualidade na forma de plugins ou tasks extra &#8211; correr testes unitários, gerar relatórios de code coverage, correr ferramentas de análise estática de código, etc.</p>
<p>Ferramentas:<br />
<a href="http://ant.apache.org/">Ant</a>, <a href="http://maven.apache.org/">Maven</a>, <a href="http://ant.apache.org/ivy/">Ivy</a>, <a href="http://cruisecontrol.sourceforge.net/">Cuise Control</a>, <a href="https://hudson.dev.java.net/">Hudson</a>, <a href="http://www.jetbrains.com/teamcity/">TeamCity</a>, <a href="http://www.atlassian.com/software/bamboo/">Atlassian Bamboo</a></p>
<h3>Equipa de testes / QA</h3>
<p>Este ponto não é técnico mas considero-o importante. Em todos os projectos que trabalhei em Portugal apenas uma vez trabalhei uma equipa de QA (<em>Quality Assurance</em>) organizada. Na maioria dos projectos os testes de &#8220;qualidade&#8221; resumiam-se a fazer deploy da aplicação para outro ambiente e ter alguém &#8211; muitas vezes da parte do cliente &#8211; testar ad-hoc a aplicação. E quem fazia estes testes era muitas vezes o interessado em passar a aplicação a produção &#8211; muitas vezes o próprio project manager da equipa.<br />
É muito importante ter uma equipa, ou mesmo apenas uma pessoa, de QA que tem responsabilidades de testes em determinadas fazes. É ainda mais importante que esses membros não façam parte da equipa de desenvolvimento, pois estariam com &#8220;maus hábitos&#8221;, nem da gestão de projectos, pois vai querer é satisfazer o cliente, nem do cliente, que simplesmente não vai testar devidamente e depois a culpa é da equipa. Grande parte dos projectos têm baixa qualidade porque o desenvolvimento para clientes envolve os tais &#8220;compromissos&#8221; entre qualidade e tempo/dinheiro que os PMs tanto falam.</p>
<h3>Testes funcionais</h3>
<p>Quer se tenha um processo de desenvolvimento em cascata ou iterativo, depois de cada release deve-se passar à fase de QA em que os testes funcionais são executados.<br />
Estes testes devem ser feitos com base num plano de testes já elaborado ou nos próprios requisitos do projecto &#8211; sejam eles use cases, user stories ou outra coisa qualquer.<br />
Nestes testes o carácter específico de um membro QA entram em cena: o espírito inquisitivo e a capacidade de interpretarem os requisitos do ponto de vista do utilizador.</p>
<h3>Testes de carga</h3>
<p>Num modelo de desenvolvimento iterativo os testes de carga não precisam de ser feitos no fim de cada iteração mas apenas em releases major.<br />
Duas perspectivas devem ser testadas: performance e escalabilidade.<br />
Algumas ferramentas podem ser usadas para testas as duas perspectivas &#8211; por exemplo, a aplicação que testa o tempo de invocação de algo pode lançar x threads para testar como escala.<br />
Para testar devidamente escalabilidade, devem ser tida em conta a infraestrutura do projecto. Não é necessário replicar um ambiente de produção, é aliás impossível a maioria das vezes devido aos custos, mas se em produção temos uma base de dados numa máquina e um aplication server noutra, vamos deixá-los separados também para testes para ter em conta todas as variáveis.</p>
<p>Ferramentas:<br />
<a href="http://www.webload.org/">WebLoad</a>, <a href="http://jakarta.apache.org/jmeter/">JMeter</a>, <a href="http://grinder.sourceforge.net/">Grinder</a></p>
<h3>Testes de segurança</h3>
<p>Uma das áreas menos testadas no desenvolvimento de aplicações web é a segurança, normalmente até acontecer algo de mau. Mesmo a maioria dos testers não sabem fazer testes de segurança nem o que é uma ataque de <em>Cross-Site Scripting</em> (XSS). E mesmo a maioria dos developers não têm grandes cuidados com segurança além dos típicos ataques de <em>SQL Injection</em>.<br />
A falta de ferramentas é um dos grandes problemas nesta área.</p>
<p>Ferramentas:<br />
<a href="http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project">WebScarab</a></p>
<h3>Testes de UI</h3>
<p>O teste mais básico de UI é ver se as coisas fazer <em>rendering</em> correcto nos diferentes browsers. Validar automaticamente o código gerado de acordo com standards é também importante.<br />
Para facilitar o trabalho, existem diversos projectos de automatização de testes de UI.</p>
<p>Ferramentas:<br />
<a href="http://selenium.openqa.org/">Selenium</a>, <a href="http://wtr.rubyforge.org/">Watir</a>, <a href="http://www.getwindmill.com/">Windmill</a> </p>
<p>Outros testes importantes são os de integração e de regressão mas não são áreas em que tenha muita experiência ou opinião formada por isso abstenho-me. </p>
<p>Todos estes pontos são bastante lógicos, penso eu. Tudo o que se possa fazer para aumentar a qualidade final do que se desenvolve é positivo e a qualidade deve estar na mente de todos e não ser uma moeda de troca, razão da mediocridade de grande parte das aplicações feitas para clientes que vi na minha vida profissional.<br />
Qualidade custa também dinheiro, sim, mas o retorno é grande, tenho a certeza.</p>
<p><strong>Update</strong>:<br />
A proposito de um comentário do <a href="http://www.mouseoverstudio.com/blog/">Diego Carrion</a>, fica uma referência para o <a href="http://jbehave.org/">JBehaviour2</a>, para testes funcionais numa aproximação BDD (<em>Behaviour-Driven Development</em>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2008/09/28/como-garantir-qualidade-de-software/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Validar e Comprimir Javascript com JSLint, YUICompressor e Maven</title>
		<link>http://www.zonaj.org/2008/03/18/validar-e-comprimir-javascript-com-jslint-yuicompressor-e-maven/</link>
		<comments>http://www.zonaj.org/2008/03/18/validar-e-comprimir-javascript-com-jslint-yuicompressor-e-maven/#comments</comments>
		<pubDate>Tue, 18 Mar 2008 11:01:30 +0000</pubDate>
		<dc:creator>Ruben Badaró</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=89</guid>
		<description><![CDATA[Quem já utilizou bibliotecas de javascript certamente verificou que é sempre disponibilizada uma versão comprimida e um versão normal. Isto acontece porque queremos poupar largura de banda, dado que as páginas têm cada vez mais javascript. Além disso, o javascript é carregado antes do render da página, como tal o download é &#8220;bloqueante&#8221; para o [...]]]></description>
			<content:encoded><![CDATA[<p>Quem já utilizou bibliotecas de javascript certamente verificou que é sempre disponibilizada uma versão comprimida e um versão normal. Isto acontece porque queremos poupar largura de banda, dado que as páginas têm cada vez mais javascript. Além disso, o javascript é carregado antes do render da página, como tal o download é &#8220;bloqueante&#8221; para o processamento da página.</p>
<p>No entanto, para o código javascript que nós próprios desenvolvemos ou que as frameworks que usamos usam ou geram raramente minimizamos os ficheiros javascript. Isto apenas seria feito para cenários de produção, mas rapidamente se tornaria demasiado trabalhoso.<br />
Se queremos minimizar apenas para determinados cenários e de forma totalmente automática, tem lógica incluir este processo nos nossos processos de build. </p>
<p>E é aqui que entra o <a href="http://alchim.sourceforge.net/yuicompressor-maven-plugin/overview.html">plugin</a> do <a href="http://developer.yahoo.com/yui/compressor/">YUICompressor</a> para o <a href="http://maven.apache.org/">Maven</a>.<br />
Este plugin permite processar os ficheiros javascript, minimizando-os. Também corre o <a href="http://www.jslint.com/">JSLint</a>, para verificar a correcção do código. Este último é uma forma de análise estática de código que ajudo muito a reduzir a probabilidade de erros não detectados.</p>
<p>Falo do YUICompressor como podia falar de outras ferramentas de compressão e obfuscação de javascript, como seja o <a href="http://javascript.crockford.com/jsmin.html">JSMin</a>, <a href="http://dojotoolkit.org/docs/shrinksafe">ShrinkSafe</a>, <a href="http://dean.edwards.name/packer/">Packer</a> ou outro. Não sei é sobre a existência de plugins para todos, embora não deve ser muito complexo de os desenvolver.</p>
<p>Desta forma conseguimos comprimir o nosso código para melhorar a performance e verificar estaticamente por erros no javascript (um erro javascript pode quebrar o build: bom!). Podemos ainda usar o <a href="http://www.dev.abiss.gr/mvn-jstools/index.html">plugin para gerar documentação javascript (JsTools)</a> ou mesmo para <a href="http://jsunit.berlios.de/maven2.html">efectuar testes unitários em javascript (JsUnit)</a>.</p>
<p>Poderíamos ainda melhor mais a performance, <em>gzipando</em> os nossos ficheiros a nível do servidor. Para esta e outras optimizações, é muito útil o <a href="http://developer.yahoo.com/yslow/">YSlow</a>, também da Yahoo que é um plugin para o <a href="http://www.getfirebug.com/">Firebug</a> que verifica determinados parâmetros de performance na página.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2008/03/18/validar-e-comprimir-javascript-com-jslint-yuicompressor-e-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript: 5 razões para usar e abusar</title>
		<link>http://www.zonaj.org/2008/03/04/javascript-e-assim-tao-mau/</link>
		<comments>http://www.zonaj.org/2008/03/04/javascript-e-assim-tao-mau/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 08:00:35 +0000</pubDate>
		<dc:creator>Ruben Badaró</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=81</guid>
		<description><![CDATA[Numa palavra: não.
Esta conversa já me surgiu em diversas ocasiões e voltou a despontar numa thread na mailing list do PTJUG, e confesso que tenho alguma dificuldade em compreender a enorme resistência que imensos programadores apresentam em aprender e utilizar javascript. Isto é, baterem código mesmo em javascript sem usar frameworks que gerem o código [...]]]></description>
			<content:encoded><![CDATA[<p>Numa palavra: não.</p>
<p>Esta conversa já me surgiu em diversas ocasiões e voltou a despontar numa thread na mailing list do PTJUG, e confesso que tenho alguma dificuldade em compreender a enorme resistência que imensos programadores apresentam em aprender e utilizar javascript. Isto é, baterem código mesmo em javascript sem usar frameworks que gerem o código todo &#8211; e.g. GWT, ou helpers de php, ruby, etc. -, mas usando obviamente bibliotecas como o prototype, jquery, etc. </p>
<p>Javascript é uma linguagem dinâmica, <em>weakly typed</em> e prototipada. Logo aqui, há diferenças para as linguagens que a maioria usa: C#, Java (<em>statically</em> e <em>strongly typed</em>) e python (<em>dynamically</em> mas <em>strongly typed</em>). O modelo de prototipagem é um pouco diferente do modelo de classes para definição de objectos, por isso percebo que possa introduzir confusão ou pelo menos dar origem a um novo processo de aprendizagem.</p>
<p>Mas não é assim tão complicado como isso&#8230; </p>
<h3>Razões para usar javascript directamente, não ter medo e assumi-lo com orgulho</h3>
<ol>
<li><strong>Desenvolvimento web = (X)HTML + CSS + Javascript + linguagem_server_side</strong></li>
<p>	Quer sejamos programadores java ou de uma outra tecnologia web, a probabilidade de termos de usar ou gerar html, css e javascript é muito elevada. Podemos inclusivamente usar geradores mas como facilitadores e não por sermos incapazes de produzir código de qualidade numa linguagem dinâmica ou, pelo menos, compreender o código que estamos a gerar. Devemos poder mudar de linguagem e continuar a dominar a parte de interface web, apenas tendo de aprender conceitos da outra linguagem/plataforma. </p>
<li><strong>jsFUD</strong></li>
<p>	Durante muito tempo, javascript foi muito pouco estudado e visto como uma linguagem de scripting básica que permitia escrever umas linhas de código. Não havia propriamente estruturação de código e muita gente entende que programar javascript é isso. É um pouco como aquelas aplicações java de alunos de primeiro ano que metem 2000 linhas de código num só ficheiro ao monte.<br />
Hoje em dia javascript não é isso, é uma linguagem madura, os problemas de interoperabilidade entre browsers são mitigados com as novas bibliotecas, estão a ser preparadas <a href="http://www.mozilla.org/projects/tamarin/">virtual machines</a> (compilação JIT incluída) que melhorarão imenso a performance de código no browser, há uma <a href="http://wiki.ecmascript.org/doku.php?id=proposals:proposals">proposta de uma nova versão</a> da linguagem (<a href="http://www.ecmascript.org/es4/spec/overview.pdf">resumo da nova especificação</a>) com possibilidades de verificação de tipos estática e outras features que fazem dela uma linguagem muito mais parecida com algo tipo java (ActionScript é a coisa mais parecida actualmente).</p>
<li><strong>Javascript não é só web</strong></li>
<p>	Nos últimos meses tenho desenvolvido aplicações com a suite de BPM Teamworks da Lombardi que utiliza javascript como linguagem de programação para as actividades dos BPMs. A utilização de javascript nestes moldes ou, melhor ainda, como linguagem para desenvolver plugins ou algo semelhante para aplicações, tirando partido das suas propriedades dinâmicas é altamente refrescante. Basta usar os jars que a Mozilla fornece com a implementação do <a href="http://www.mozilla.org/rhino/">projecto Rhino</a>.</p>
<li><strong>JSON</strong></li>
<p>	Poder estar a programar e definir as minhas estruturas de dados em formato JSON é magnífico. É menos verboso, simples e escrevo muito menos new&#8217;s.</p>
<li><strong>Abrir horizontes</strong></li>
<p>	<em>Last but not least</em>, não devemos ter receio de linguagens dinâmicas. Um programador java tem um trabalho confortável e laborioso: estamos protegidos com verificações estáticas em tempo de compilação, <em>checked exceptions</em> e outras demais coisas o que nos dá segurança e permite apanhar erros cedo; por outro lado, tudo isto nos dá mais trabalho sem muitas vezes nos garantir qualidade do software (para isso preferiria ter contratos estritos definidos entre os componentes com verificações em tempo de compilação e runtime, o que seria demais para a maioria nos sistemas).<br />
Trata-se pois, de uma questão de encontrar a chave de fendas que funcione melhor com o parafuso. Sejam linguagens dinâmicas ou não, o que interessa é a que produza melhor resultado final e isso pode nem sequer depender da linguagem mas de outros factores externos como a equipa, o tipo de requisitos, etc.</p>
</ol>
<p>Em termos de resumo, coisas como o GWT são excelentes paradigmas mas não se deve perder de vista o que se passa debaixo do capô. Experimentem desenvolver uma aplicação em javascript para testar o poder da linguagem. Repito, uma aplicação, não um bloco de script.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2008/03/04/javascript-e-assim-tao-mau/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>BreakDance na ZonaJ</title>
		<link>http://www.zonaj.org/2007/05/06/breakdance/</link>
		<comments>http://www.zonaj.org/2007/05/06/breakdance/#comments</comments>
		<pubDate>Sun, 06 May 2007 22:54:25 +0000</pubDate>
		<dc:creator>Ricardo Antunes</dc:creator>
				<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=33</guid>
		<description><![CDATA[Num blog em que o texto das várias entradas tende a ser extenso (como este), a página principal começa rapidamente a ter um comprimento considerável.
Quando se pretende consultar uma entrada mais antiga só temos duas hipóteses:      

seguimos o link permanente para a entrada (caixa &#8216;Posts Recentes&#8217;) e depois fazemos &#8216;back&#8217; [...]]]></description>
			<content:encoded><![CDATA[<p>Num blog em que o texto das várias entradas tende a ser extenso (como este), a página principal começa rapidamente a ter um comprimento considerável.<br />
Quando se pretende consultar uma entrada mais antiga só temos duas hipóteses:      </p>
<ul>
<li>seguimos o link permanente para a entrada (caixa &#8216;Posts Recentes&#8217;) e depois fazemos &#8216;back&#8217; no browser;</li>
<li>damos ao dedo a fazer scroll na página até que a entrada fique visível.</li>
</ul>
<p>Uma forma interessante de resolver este problema seria ter uma opção de <em>toggle</em> do texto das entradas, ou seja, ter uma opção para mostrar ou esconder o texto dos posts por escolha do utilizador.</p>
<p>Estava a matutar sobre isto enquanto admirava os <a href="http://www.zonaj.org/?p=28">tons campestres</a> desta página  e pensei que não era má ideia pôr a solução em prática. </p>
<p>Um requisito importante é que o teria de fazer sem alterar efectivamente a página (só para não estar a  chatear o Administrador do blog durante o fim-de-semana <img src='http://www.zonaj.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ).</p>
<p>Outro é que o código teria de ser suficiente pequeno para poder ser postado aqui.</p>
<p>Era definitivamente um bom desafio para por à prova o <a href="http://jquery.com">jQuery</a>.</p>
<p>Precisava de quatro operações para concretizar as alterações:</p>
<ol>
<li>esconder inicialmente o texto das entradas e os links para tags e comentários mas não o titulo ou a informação dos autores;</li>
<li>acrescentar à frente do nome do autor um link para permitir mostrar ou esconder o texto;</li>
<li>associar ao evento <em>click</em> do link uma função para concretizar a opção do utilizador;</li>
<li>desenvolver a função;</li>
</ol>
<p>Usei o <a href="http://www.getfirebug.com/">Firebug</a> para analisar a estrutura do DOM da página.<br />
Cada entrada tem uma estrutura fixa: </p>
<ol>
<li>um <code>&lt;h2&gt;</code> com o link para o titulo;</li>
<li>um <code>&lt;h4&gt;</code> com a data do post e a identificação do autor;</li>
<li>um <code>&lt;div&gt;</code> com a class &#8216;entry&#8217; com o texto;</li>
<li>um <code>&lt;p&gt;</code> com a class &#8216;tagged&#8217; com links para as tags e comentários</li>
</ol>
<p>Portanto, para concretizar a primeira operação só precisava de esconder os elementos com as classes &#8216;entry&#8217; e &#8216;tagged&#8217; que em jQuery se traduz como:<br />
<code class="prettyprint">$('.entry, .tagged').hide();</code></p>
<p>Para a concretizar segunda operação acrescentei um link à frente do nome do autor, ou seja, de todos os <code>&lt;h4&gt;</code>s precedidos por <code>&lt;h2&gt;</code>s, ou em jQuery:<br />
<code class="prettyprint">$('h2 ~ h4').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');</code></p>
<p>Para a terceira opção e visto que associei os links criados à class <em>entryTogger</em>, basta associar uma função ao evento <em>onclick</em> de todos os elementos com esta classe ou em jQuery:<br />
<code class="prettyprint">$('.entryToggler').click(toggleEntry);</code></p>
<p>Falta só desenvolver a função <em>toggleEntry</em>.</p>
<p>Uma vez que esta função tem acesso ao elemento <em>anchor</em>  seleccionado pelo utilizador (<code>this</code>), podia usá-lo como referência para:</p>
<ol>
<li>verificar o estado da entrada a partir do texto:<br />
<code class="prettyprint">var isHidden = $(this).text().search('Mostrar')!=-1;</code></li>
<li>seleccionar os elementos correspondentes ao texto e aos links para as tags e comentários:<br />
<code class="prettyprint">var x=$(this).parent().next(); x = x.add(x.next());</code></li>
<li>mostrar ou esconder os elementos seleccionados:<br />
	<code class="prettyprint">isHidden ? x.slideDown('slow') : x.slideUp('slow');</code></li>
<li>alterar o texto do link para ficar de acordo com a operação:<br />
<code class="prettyprint">isHidden ? $(this).text('(Esconder)') : $(this).text('(Mostrar)');</code>	</li>
</ol>
<p>e estava feito!</p>
<p>Como podem testar o código? É fácil:<br />
abram a <a href="http://www.zonaj.org/">página principal</a> do blog. (pessoal do rss, tem <strong>mesmo</strong> que ser na página principal)</p>
<p>Se estiverem a usar o Firebug podem copiar o código completo para a consola e executarem-no:</p>
<pre class="prettyprint">
var toggleEntry = function(){
	var isHidden = $(this).text().search('Mostrar')!=-1;
	var x=$(this).parent().next();
	x = x.add(x.next());
	isHidden ? x.slideDown('slow') : x.slideUp('slow');
	isHidden ? $(this).text('(Esconder)') : $(this).text('(Mostrar)');
};
$('.entry, .tagged').hide();
$('h2 ~ h4').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');
$('.entryToggler').click(toggleEntry);
</pre>
<p>Para os outros casos, escrevi o código todo numa só linha que podem copiar para a caixa de endereço do browser (substituindo o http://www.zonaj.org):<br />
<code><br />
javascript:var toggleEntry = function(){var isHidden = $(this).text().search('Mostrar')!=-1;var x=$(this).parent().next();x = x.add(x.next());isHidden ? x.slideDown('slow') : x.slideUp('slow');isHidden ? $(this).text('(Esconder)') : $(this).text('(Mostrar)');};$('.entry, .tagged').hide();$('h2 ~ h4').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');$('.entryToggler').click(toggleEntry);void(0);<br />
</code><br />
Testado com FF2, IE7 e Opera9.</p>
<p>É claro que tive a vantagem de não me ter de preocupar em importar o script de jQuery porque a própria página já o faz.<br />
Caso estivesse a alterar o DOM de uma página que não use jQuery, podia fazer o mesmo tipo de alterações usando o <a href="http://www.learningjquery.com/2006/12/jquerify-bookmarklet">jQuerify</a>.</p>
<p>Nota 1:<br />
Para deixar a primeira entrada sem alterações basta alterar a linha<br />
<code class="prettyprint">$('.entry, .tagged').hide();</code><br />
para<br />
<code class="prettyprint">$('.entry, .tagged').not(':first').hide();</code><br />
e a linha<br />
<code class="prettyprint">$('h2 ~ h4').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');</code><br />
para<br />
<code class="prettyprint">$('h2 ~ h4').not(':first').append('&lt;a href="javascript:void(0)" class="entryToggler"&gt;(Mostrar)&lt;/a&gt;');</code></p>
<p>Nota 2:<br />
Para remover a irritante &#8216;caixa picotada&#8217; à volta do link quando este fica activo, acrescentar como ultima linha da função:<br />
<code class="prettyprint">$(this).blur();</code> </p>
<p>Nota 3:<br />
O código final tem cerca de 10 (!) linhas e repeti-o 3 vezes neste post.</p>
<p>Nota 4:<br />
Para ter de volta a página original basta fazer reload no browser (mesmo tendo alterado a linha de endereço).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2007/05/06/breakdance/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Forms com poucos Enters</title>
		<link>http://www.zonaj.org/2007/05/04/forms-com-poucos-enters/</link>
		<comments>http://www.zonaj.org/2007/05/04/forms-com-poucos-enters/#comments</comments>
		<pubDate>Fri, 04 May 2007 20:27:37 +0000</pubDate>
		<dc:creator>Bruno Braz Gonçalves</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jsf]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=31</guid>
		<description><![CDATA[
Num projecto em JSF implementar o seguinte requisito : o formulário só deve ser submetido ao escolher umas das acções (botões/links) disponíveis..



Isto é o contrário de: se um campo de texto estiver seleccionado o formulário é submetido se carregarmos a tecla enter. Isto acontece para campos com a tag input; não acontece por exemplo para [...]]]></description>
			<content:encoded><![CDATA[<p>
Num projecto em JSF implementar o seguinte requisito : <em>o formulário só deve ser submetido ao escolher umas das acções (botões/links) disponíveis.</code></em>.
</p>
</p>
<p>
Isto é o contrário de: se um campo de texto estiver seleccionado o formulário é submetido se carregarmos a tecla <code>enter</code>. <br />Isto acontece para campos com a tag <code>input</code>; não acontece por exemplo para a <code>textarea</code>.
</p>
<p>
Um requisito óbvio (<em>usabilidade</em>) é que o site continue a ser navegável com teclas. Logo, <code>inputs</code> do tipo <code>submit</code> e <code>button</code>, bem como todas as outras <code>tags</code>, deveriam continuar a processar o <code>enter</code>.
</p>
<p>
Eis a solução final, testada em FF2 e IE6:
</p>
<pre class="prettyprint" id="html">
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;This form doesn't submit with Enter key&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;form id="formID" .../&gt;
       ...
    &lt;/form&gt;

    &lt;script type="text/javascript"&gt;&lt;!--

/* Checks if enter key was pressed and this is allowed.
 * This functions tries to solve issue : "If a text field has focus, the
 * form will submit upon hitting the enter (or return) key."
 * @param e the event
 * @return true if enter key is pressed for input fields (input tags not of
 * type 'button' or 'submit') ; false otrhewise
 */
function disableEnterKeyForInputs(e){

  // next lines suport multibrowser
  var key = (window.event) ? event.keyCode : e.which;
  var srcElement = (window.event) ? event.srcElement : e.target;

  if (key == 13) {
    var tagName = srcElement.tagName.toUpperCase();
    if ( tagName == 'INPUT' ) {
       // only inputTags have enter issue
       // and buttons and submit should respond to enter
       switch ( srcElement.type.toUpperCase() ){
         case 'BUTTON' :
         case 'SUBMIT' :
            return true;
          break;
         default :
            return false;
       }
    }
  }
  return true;
}

if ( (theForm = document.getElementById("formID") ) != null)
  theForm.onkeypress=disableEnterKeyForInputs;

// --&gt;
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>
<em>tanx to Ricardo Antunes, Lurdes Spínola</em>
</p>
<p><b>Leituras</b></p>
<ul>
<li>[1] Nabble Forums : Form Submit On Enter (<a target="_blank" href="http://www.nabble.com/Form-Submit-On-Enter-t1320364.html">http://www.nabble.com/Form-Submit-On-Enter-t1320364.html</a>)
  </li>
<li>[2] http://www.jsftutorials.net/defaultActionTag.html (<a target="_blank" href="http://www.jsftutorials.net/defaultActionTag.html">http://www.jsftutorials.net/defaultActionTag.html</a>)
  </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2007/05/04/forms-com-poucos-enters/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
