<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="http://feedproxy.google.com/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feedproxy.google.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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>O Básico da web</title>
	
	<link>http://www.obasicodaweb.com</link>
	<description>Na web, sobre a web, para a web</description>
	<pubDate>Thu, 11 Oct 2007 06:00:08 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://obasicodaweb.com/feed/" type="application/rss+xml" /><feedburner:emailServiceId>obasicodaweb</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Como selecionar elementos HTML via JavaScript/DOM</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/nKi7mHXjwfo/como-selecionar-elementos-html-via-javascriptdom</link>
		<comments>http://www.obasicodaweb.com/como-selecionar-elementos-html-via-javascriptdom#comments</comments>
		<pubDate>Thu, 11 Oct 2007 06:00:07 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[DOM]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.obasicodaweb.com/como-selecionar-elementos-html-via-javascriptdom</guid>
		<description><![CDATA[Algumas pessoas me escreveram e-mails com dúvidas sobre seleção de elementos HTML em JavaScript, a maioria delas com dúvidas relacionadas ao artigo sobre títulos editáveis, que publiquei por aqui há algum tempo atrás. Por isso resolvi escrever este artigo sobre esse tema tão simples, mas ao mesmo tempo tão vital para o desenvolvedor JavaScript.
Os &#8220;ganchos&#8221;
Para [...]]]></description>
			<content:encoded><![CDATA[<p>Algumas pessoas me escreveram e-mails com dúvidas sobre seleção de elementos HTML em JavaScript, a maioria delas com dúvidas relacionadas ao <a href="http://www.obasicodaweb.com/titulo-editavel-exemplo-de-javascriptdom">artigo sobre títulos editáveis</a>, que publiquei por aqui há algum tempo atrás. Por isso resolvi escrever este artigo sobre esse tema tão simples, mas ao mesmo tempo tão vital para o desenvolvedor JavaScript.</p>
<h3>Os &#8220;ganchos&#8221;</h3>
<p>Para selecionar um elemento HTML e poder manipulá-lo via JavaScript/DOM você precisa primeiro ter algo que identifique esse elemento. Um &#8220;gancho&#8221; (em inglês, <em>hook</em>).</p>
<p>Este gancho pode ser:</p>
<ul>
<li>o ID do elemento</li>
<li>um nome de classe</li>
<li>um nome de tag (DIV, SPAN, P, A, etc)</li>
<li>Um atributo ou valor de atributo específico</li>
</ul>
<p>Dependendo do tipo de gancho usado, seu trabalho pode ser mais simples ou mais complexo. Vamos ver caso a caso.</p>
<h3>Um elemento ou vários elementos?</h3>
<p>Quando &#8220;pescamos&#8221; elementos HTML via JavaScript/DOM, o que temos como retorno pode ser um elemento específico ou um conjunto de elementos (um <em>Array</em> de elementos, pra ser mais específico).</p>
<p>Na verdade, o que manipulamos via JavaScript são referências a elementos HTML. Ou seja, uma variável que &#8220;aponta&#8221; para o elemento e que, uma vez modificada, reflete as modificações no elemento em si. Mas não se preocupe com isso agora. Trate as referências como elementos de fato caso isso torne as coisas mais simples de abstrair pra você.</p>
<h3>Selecionando elementos pelo ID</h3>
<p>A única forma de selecionar um elemento específico sem nenhum esforço extra é usando o ID do elemento como gancho. Para isso usamos o método <code>document.getElementById()</code>.</p>
<p>A sintaxe deste método é simples: <code>var elemento = document.getElementById("id_do_elemento");</code></p>
<p>Exemplo:</p>
<pre>
<code>
HTML:
&lt;span id="preco"&gt;R$ 1500,00&lt;/span&gt;
JavaScript:
var preco = document.getElementById('preco');
</code>
</pre>
<p>Feito isso, você pode, por exemplo, exibir um alerta com o conteúdo do elemento, assim: <code>alert(preco.innerHTML)</code>.</p>
<p>E é isso. Selecionar um elemento pelo ID é muito simples. Mas nem sempre temos um ID disponível, por isso vamos ver como selecionar elementos usando outros tipos de ganchos.</p>
<h3>Selecionando vários elementos: o processo básico</h3>
<p>Quando você não tem um ID disponível para selecionar um elemento específico, a única opção é selecionar diversos elementos e depois &#8220;pescar&#8221; aquele ou aqueles que te interessam.</p>
<p>Basicamente, tudo começa com o método <code>document.getElementsByTagName()</code>. Como o nome já diz, este método seleciona elementos por nomes de tags.</p>
<p>Feito isso, basta <em>iterar</em> pelos elementos, usando <em>loops</em> (em geral, <code>for</code>) e, de acordo com determinadas condições, separar os elementos com os quais você precisa trabalhar. Vamos ver os exemplos mais comuns.</p>
<h3>Seleção por nome de classe</h3>
<p>Imagine que você quer selecionar todos os elementos que tenham a classe &#8220;preco&#8221;. Não importa se o elemento é um DIV, um SPAN ou qualquer outro, desde que tenha a classe &#8220;preco&#8221;, ele te interessa.</p>
<p>Para isso você vai precisar, antes de qualquer outra coisa, selecionar todos os elementos da página de uma só vez. Isto é muito simples, veja:</p>
<pre>
<code>
var todos_elementos = document.getElementsByTagName('*');
</code>
</pre>
<p>Neste caso, <code>todos_elementos</code> é um Array contendo todos os elementos da página. Não vou entrar em detalhes sobre Arrays por aqui. Se você já programou, em praticamente qualquer linguagem, já deve conhecê-los. Caso contrário, continue lendo que acho que vai dar pra entender mesmo assim.</p>
<p>Agora vamos fazer um <code>for</code> para percorrer todos os elementos do nosso array e selecionar apenas aqueles que têm a classe que nos interessa. Vamos assumir, para simplificar os exemplos, que você quer os elementos que tenham <strong>apenas</strong> a classe &#8220;preco&#8221;. Elementos com mais de uma classe ficam de fora.</p>
<pre>
<code>
var precos = Array();
for (var i=0; i&lt;todos_elementos.length; i++){
&#160;&#160;var el = todos_elementos[i];
&#160;&#160;if (el.className == 'preco'){
&#160;&#160;&#160;&#160;precos.push(el);
&#160;&#160;}
}
</code>
</pre>
<p>O código acima pega todos os elementos com a classe &#8220;preco&#8221; e joga dentro de um outro Array, &#8220;precos&#8221;. Agora você pode iterar por este Array e fazer o que quiser com seus elementos.</p>
<h3>Seleção por nome de tag</h3>
<p>Para selecionar elementos pelo nome da tag, o método usado é o mesmo <code>document.getElementsByTagName()</code> e o processo é exatamente igual ao descrito acima.</p>
<p>Por exemplo, vamos selecionar todos os DIVs da nossa página:</p>
<pre>
<code>
var divs = document.getElementsByTagName('div');
</code>
</pre>
<p>Simples assim.</p>
<p>Se você quiser selecionar diretamente, por exemplo, o primeiro DIV da página, use o seguinte:</p>
<pre>
<code>
var div = document.getElementsByTagName('div')[0];
</code>
</pre>
<h3>Seleção por um atributo específico</h3>
<p>Aqui a coisa funciona da mesma maneira que a seleção por classe. Vamos selecionar, por exemplo, todos os links (tag A) com o atributo rel=&#8221;nofollow&#8221;:</p>
<pre>
<code>
var links = document.getElementsByTagName('a');
for (var i=0; i&lt;links.length; i++){
&#160;&#160;var link = links[i];
&#160;&#160;var rel = link.getAttribute('rel');
&#160;&#160;if (rel &#038;&#038; rel == 'nofollow'){
&#160;&#160; link.className = 'nofollow';
&#160;&#160;}
}
</code>
</pre>
<p>O código acima atribui a classe &#8220;nofollow&#8221; a todos os links com rel=&#8221;nofollow&#8221;. Com isso podemos, por CSS, aplicar uma cor diferente nesses links, por exemplo.</p>
<p>Como vocês podem ver, selecionar elementos via JavaScript/DOM não é nada complicado. Espero que a explicação tenha sido clara e aguardo as opiniões &#8212; e, mais importante, as dúvidas &#8212; de vocês.</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=Myxzif3h"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=9YJuqTRR"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=NwG8IVDw"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=NwG8IVDw" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=fcrLJknp"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=fPdYiuWy"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=hwS0gRHQ"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=8Tu5Cfyq"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=aQB3UwLe"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/nKi7mHXjwfo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/como-selecionar-elementos-html-via-javascriptdom/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/como-selecionar-elementos-html-via-javascriptdom</feedburner:origLink></item>
		<item>
		<title>Tudo sobre Image Replacement</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/W6U2FtPv9e0/tudo-sobre-image-replacement</link>
		<comments>http://www.obasicodaweb.com/tudo-sobre-image-replacement#comments</comments>
		<pubDate>Tue, 09 Oct 2007 04:54:11 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[image replacement]]></category>

		<guid isPermaLink="false">http://www.obasicodaweb.com/tudo-sobre-image-replacement</guid>
		<description><![CDATA[Image Replacement (em português, algo como substituição por imagem), como já disse em alguns artigos por aqui, são técnicas empregadas para substituir texto por imagem, usando algumas artimanhas de CSS.
Existem diversas maneiras diferentes de se fazer Image Replacement e eu vou explicar para vocês algumas das mais famosas e interessantes, começando pela minha favorita. Além [...]]]></description>
			<content:encoded><![CDATA[<p><span lang="en">Image Replacement</span> (em português, algo como substituição por imagem), como já disse em alguns artigos por aqui, são técnicas empregadas para substituir texto por imagem, usando algumas artimanhas de CSS.</p>
<p>Existem diversas maneiras diferentes de se fazer Image Replacement e eu vou explicar para vocês algumas das mais famosas e interessantes, começando pela minha favorita. Além disso, vou mostrar as vantagens e desvantagens e  quando devemos usar ou evitar o uso de image replacement.</p>
<h3>A motivação</h3>
<p>A motivação básica para o uso de image replacement é simples. Produzir texto &#8212; geralmente, mas não apenas, títulos &#8212; mais agradáveis visualmente, usando fontes mais bonitas, que componham melhor o layout da página, sem, com isso, ferir a semântica ou diminuir as chances de aparecer bem em sites de busca.</p>
<p>Alguns de vocês devem se perguntar: por que usar image replacement quando uma simples IMG em HTML resolveria o problema?</p>
<p>Posso dar duas respostas a essa pergunta:</p>
<ol>
<li>Porque o elemento IMG deve ser usado apenas para imagens que carreguem um significado único, que só pode ser expressado totalmente pela imagem em si. Por melhor que seja, uma descrição textual é apenas isso, uma descrição. Imagine uma foto do seu filho jogando um beijo. Agora me diga se qualquer descrição textual no mundo poderia substituir a imagem. Então, é disso que estou falando. <img src='http://www.obasicodaweb.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li>Porque os mecanismos de busca dão mais valor para o conteúdo de elementos textuais &#8212; como títulos, parágrafos ou listas &#8212; do que para o conteúdo de uma imagem.</li>
</ol>
<p>Ou seja, a primeira motivação é semântica e a segunda, marketeira. Ambas se completam e trazem benefícios tanto para o usuário quanto para o desenvolvedor.</p>
<p>Para entendermos melhor as motivações, vamos ao segundo ponto.</p>
<h3>O uso</h3>
<p>Como já vimos acima, image replacement é usada, em geral, para substituir um texto por uma imagem contendo o próprio texto, alterando apenas sua estética, sem alterar seu significado.</p>
<p>Um exemplo:</p>
<p><strong>Texto normal:</strong><br />
<span style="display:block;margin-left:1.2em; font-size:1.8em; color:#900;">Ao vencedor, as batatas</span></p>
<p><strong>Texto em imagem:</strong><br />
<img src="/exemplos/image-replacement/i/ao-vencedor.gif" alt="Ao vencedor, as batatas" style="display:block;margin-left:1.2em;"></p>
<p>Por mais que você não goste da fonte usada na imagem, é difícil não concordar que o visual é bem mais agradável que o texto puro, renderizado pelo browser.</p>
<p>Esse é o uso normal para image replacement. Não há problemas em decorar a imagem com bordas, sombras, cor de fundo ou qualquer outro efeito visual desejado. Mas a imagem deve conter <strong>sempre</strong> o mesmo texto que o elemento a ser substituído. Se não for esse o caso, simplesmente não use image replacement.</p>
<p>Por quê? Bem, por dois motivos:</p>
<ol>
<li>Você estaria alterando o significado da página para um ou mais grupos de usuários. Estaria entregando versões diferentes de um mesmo conteúdo baseado apenas na capacidade do usuário (na verdade, de seu <a href="http://www.obasicodaweb.com/termos-e-definicoes#termo-useragent">user-agent</a>) de interpretar CSS e exibir imagens. Dessa forma, você estaria ferindo a semântica (a geral, não a do HTML) de forma mortal, algo que você não quer, não é mesmo?</li>
<li>Os buscadores poderiam entender esta &#8220;entrega diferenciada de conteúdo&#8221; como <a href="http://en.wikipedia.org/wiki/Cloaking">cloaking</a>, uma técnica suja de otimização usada por spammers e outros tipos de desenvolvedores cuja figura materna exerce a profissão mais antiga do mundo, o que poderia lhe proporcionar uma penalização ou até mesmo, em casos extremos, fazer com que seja banido dos resultados de busca. E isso, com certeza, mais do que ferir a semântica, ninguém quer.</li>
</ol>
<p>Portanto, resumindo, image replacement deve ser usado apenas para tornar uma página mais bonita, nunca para alterar seu conteúdo. Sugiro que você leia o meu <a href="http://www.obasicodaweb.com/padroes-web-desenvolvimento-em-camadas">artigo sobre desenvolvimento em camadas</a>, para ajudar a entender melhor essas questões.</p>
<p>Image replacement é muito legal, muito bonito, mas, como não poderia deixar de ser, nem tudo são flores, continue lendo.</p>
<h3>Os problemas</h3>
<p>Para começar, nenhuma técnica de image replacement é perfeita. Cada uma delas tem seus prós e contras e escolher uma pra chamar de sua se resume a escolher a que te traz maior benefício com o menor custo.</p>
<p>Em geral, há dois problemas (isso está parecendo <a href="http://br.youtube.com/watch?v=tfvfPJX0Zaw">aquela propaganda do Discovery Channel</a>, mas vamos lá):</p>
<ol>
<li>A técnica exclui algum grupo de usuários, geralmente aqueles que navegam, por algum motivo, com suporte a CSS mas sem suporte a imagens</li>
<li>A técnica traz algum &#8220;lixo semântico&#8221;, algum elemento HTML que não precisaria estar ali se você não quisesse embelezar sua página.</li>
</ol>
<p>Nenhuma técnica resolve os dois problemas de uma vez só, mas algumas têm os dois.</p>
<p>Mas, um problema &#8212; e um grande problema, diga-se de passagem &#8212; é comum a todas as técnicas de image replacement: a forma do texto não pode ser modificada pelo usuário. Ou seja, nada de redimensionamento ou mudança de cores para aumentar contraste.</p>
<p>Isso é algo que vai contra a acessibilidade e pode fazer com que, por exemplo, pessoas com baixa visão não consigam ler seu texto. Infelizmente, se você quiser usar image replacement, vai ter que conviver com isso. Ou melhor, seus usuários vão ter que conviver com isso. A escolha é sua.</p>
<h3>Onde não usar</h3>
<p>Em <a href="http://www.obasicodaweb.com/image-replacement-use-com-sabedoria">meu último artigo</a>, apresentei um exemplo onde image replacement foi usado de maneira inadequada. No exemplo em questão, uma empresa estava apresentando seus produtos na home page do site e as fotos dos produtos eram inseridas na página via CSS, usando image replacement.</p>
<p>Como já vimos lá em cima, devemos usar image replacement apenas quando queremos substituir um texto por uma imagem contendo este mesmo texto. Qualquer outro uso deve ser evitado. Porém, há um caso clássico e muito comum de uso de image replacement que, na minha opinião, é totalmente equivocado: <strong>O logotipo do site/produto/empresa</strong>.</p>
<p>A princípio é tentador usar image replacement para colocar a imagem do seu logo em uma página web, já que, dessa forma, é possível colocar o seu nome e, em alguns casos, seu slogan, em um elemento com alta relevância para sites de busca (como H1, por exemplo), ajudando seu site a se posicionar melhor nas páginas de resultado.</p>
<p>Isto seria muito bom, se não fosse por um simples motivo: O seu logo é uma informação visual importantíssima e deve estar presente em sua forma completa, inalterada, sempre que possível.</p>
<p>Convenhamos, em alguns casos &#8212; provavelmente na maior parte deles &#8212; um logo é muito mais importante que o próprio nome da empresa. Imagine que você entra em um site e vê, no topo, em letras garrafais, o texto &#8220;Elma Chips&#8221;, mas não vê, em lugar algum, a carinha sorridente, presente em todos os pacotes de biscoitos desta marca? Seria, no mínimo, estranho, não?</p>
<p>Portanto, leve isso em conta. Se a imagem transmite, por si só, um significado único, use IMG. Dessa forma qualquer usuário que possa exibir imagens poderá ver esta imagem e os que não puderem, verão o texto contido no atributo ALT.</p>
<p>E agora, o momento que todos esperavam.</p>
<h3>Técnicas de Image Replacement</h3>
<p>Antes de mostrar as técnicas, devo dizer a vocês que estas e outras técnicas podem ser achadas facilmente pela web. Particularmente gosto dos artigos do Dave Shea (<a href="http://www.mezzoblue.com/tests/revised-image-replacement/">Revised Image Replacement</a>, em inglês) e do Maujor (<a href="http://www.maujor.com/tutorial/image-replacement.php">Técnicas CSS para image replacement</a>, em português), tanto que vou me basear neles.</p>
<p>Primeiro, minha técnica favorita e a que uso sempre que necessário:</p>
<h3>Técnica de Gilder/Levin</h3>
<p>Criada por Tom Gilder e <a href="http://levin.grundeis.net/files/20030809/alternatefir.html">Levin Alexander</a>, esta técnica usa um SPAN vazio para conter a imagem e, usando posicionamento absoluto, sobrepõe o texto com a imagem.</p>
<p>Esta técnica tem dois problemas (dois, de novo? Fala sério&#8230;)</p>
<ol>
<li><strong>Usa um SPAN vazio</strong>. Isto pode ou não ser considerado um problema. Um elemento vazio é, de certa forma, algo que não deveria ser usado nunca. Porém isto não traz nenhum problema prático, portanto eu acredito que não devamos nos preocupar. Se você for um purista (xiita para os íntimos) e os pêlos do seu braço se arrepiarem só de pensar em usar um elemento vazio, pule para a próxima técnica. Caso contrário, continue lendo e veja o benefício trazido por esse SPAN vazio e decida-se por usar ou não.</li>
<li><strong>Impossibilita o uso de imagens transparentes</strong>. Portanto, se você precisa usá-las, essa técnica não vai te servir, infelizmente.</li>
</ol>
<p>Porém tem um grande benefício: <strong>funciona perfeitamente</strong> para usuários com <strong>CSS habilitado e imagens desabilitadas</strong>.</p>
<p>Vejamos a técnica:</p>
<pre>
<code>
HTML:
&lt;h1 id="titulo"&gt;&lt;span&gt;&lt;/span&gt;Ao vencedor, as batatas&lt;/h1&gt;

CSS:
#titulo{
&#160;&#160;width:238px;
&#160;&#160;height:26px;
&#160;&#160;position:relative;
&#160;&#160;overflow:hidden;
}
#titulo span{
&#160;&#160;position:absolute;
&#160;&#160;width:100%;
&#160;&#160;height:100%;
&#160;&#160;background:#fff url(/i/ao-vencedor.gif) no-repeat;
}
</code>
</pre>
<p>Resultado:</p>
<p><strong>Imagem com fundo branco:</strong></p>
<p style="width: 238px; height: 26px; position: relative;">
		<span style="background: url(/exemplos/image-replacement/i/ao-vencedor.gif) no-repeat; position: absolute; width: 100%; height: 100%;"></span>Ao vencedor, as batatas
	</p>
<p><strong>Imagem com fundo transparente:</strong></p>
<p style="width: 238px; height: 26px; position: relative;">
		<span style="background: url(/exemplos/image-replacement/i/ao-vencedor-transp.gif) no-repeat; position: absolute; width: 100%; height: 100%;"></span>Ao vencedor, as batatas
	</p>
<p>O que a técnica faz é estabelecer as dimensões do &#8220;container&#8221;, no caso o H1, exatamente iguais às da imagem, posicioná-la com posicionamento relativo (leia meu <a href="http://brunotorres.net/posicionamento-com-css">artigo sobre posicionamento</a>, no brunotorres.net) e definir overflow hidden, para que o texto não extrapole os limites, caso o usuário o redimensione pelo browser. Depois coloca o SPAN com posicionamento absoluto e com as mesmas dimensões do &#8220;container&#8221;, com a imagem de fundo.</p>
<p>Note que o SPAN fica acima do H1, por causa do posicionamento absoluto. Não é necessário usar z-index.</p>
<p>Acho essa técnica genial e vou usá-la até que apareça algo melhor.</p>
<h3>FIR - Fahrner Image Replacement</h3>
<p>Esta foi a primeira técnica de image replacement, criada por Todd Fahrner, famoso desenvolvedor e membro do W3C.</p>
<p>Esta técnica também usa um elemento a mais, um SPAN, porém não vazio, mas seu maior problema é o uso de display:none, que pode impossibilitar que alguns leitores de tela leiam o conteúdo do elemento (Aparentemente <a href="http://brunotorres.net/quem-disse-que-displaynone-esconde-conteudo-do-jaws">há solução para isso</a>, mas eu não testei com todos os leitores de tela e gente muito mais esperta que eu continua dizendo que o problema acontece, então é melhor não usá-la). Mostro-a aqui apenas por sua importância histórica.</p>
<p>A técnica:</p>
<pre>
<code>
HTML:
&lt;h1 id="titulo"&gt;&lt;span&gt;Ao vencedor, as batatas&lt;/span&gt;&lt;/h1&gt;

CSS:
#titulo{
&#160;&#160;width:238px;
&#160;&#160;height:26px;
&#160;&#160;position:relative;
&#160;&#160;background:url(/i/ao-vencedor.gif) no-repeat;
}
#titulo span{
&#160;&#160;display:none;
}
</code>
</pre>
<p>Resultado:</p>
<p style="width: 238px; height: 26px; background-image: url(/exemplos/image-replacement/i/ao-vencedor.gif);">
		<span style="display: none;">Ao vencedor, as batatas</span></p>
<h3>Técnica Phark</h3>
<p>Esta é uma técnica bastante interessante, simples e criativa, usando text-indent muito grande e negativo para joga o texto &#8220;para fora da tela&#8221;.</p>
<p>Tem a vantagem de ser muito simples e não requerer nenhuma marcação HTML extra e a desvantagem de não funcionar com CSS habilitado e imagens desabilitadas.</p>
<p>A técnica:</p>
<pre>
<code>
HTML:
&lt;h1 id="titulo"&gt;Ao vencedor, as batatas&lt;/h1&gt;

CSS:
#titulo{
&#160;&#160;width:236px;
&#160;&#160;height:26px;
&#160;&#160;text-indent:-9999px;
&#160;&#160;overflow:hidden;
&#160;&#160;background:url(/i/ao-vencedor.gif) no-repeat;
}
</code>
</pre>
<p>Resultado:</p>
<p style="width: 236px; height: 26px; text-indent: -9999px; overflow: hidden; background: url(/exemplos/image-replacement/i/ao-vencedor.gif);">
		Ao vencedor, as batatas
	</p>
<p>Se não existisse a técnica de Gilder/Levin, esta seria a minha escolha, com certeza. Inclusive já a usei em diversos projetos.</p>
<p>Existem algumas outras técnicas (você pode encontrá-las nos artigos linkados no início desta seção), porém, embora o título deste texto seja &#8220;<strong>Tudo</strong> sobre image replacement&#8221;, não vou mostrá-las pois acredito que estas mostradas acima são essencialmente as mais importantes. Se vocês, no entando, encherem meu saco nos comentários, posso incluir as outras aqui.</p>
<p>Além das técnicas puramente de HTML/CSS, existem outras que usam PHP, Flash e JavaScript. Prefiro deixá-las para um futuro artigo, pois pertencem a uma classe diferente de image replacement.</p>
<h3>Conclusão</h3>
<p>Image replacement não é a panacéia do desenvolvimento web, mas pode ajudar a tornar suas páginas mais bonitas, sem afetar o conteúdo do site, embora cause alguns problemas de acessibilidade e semântica.</p>
<p>Use por sua conta e risco, pese os prós e contras antes de usar e nunca esqueça: seu bom senso é mais importante que qualquer regra.</p>
<p>Qualquer dúvida, a caixa de comentários está aí pra isso.</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=zLH48ekw"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=5LkXsSUD"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=dPegg5UJ"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=dPegg5UJ" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=DzXmz1DZ"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=fQ6FU3e0"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=vq5XMtB4"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=bhQIGwbo"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=IKKcEKL4"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/W6U2FtPv9e0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/tudo-sobre-image-replacement/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/tudo-sobre-image-replacement</feedburner:origLink></item>
		<item>
		<title>Image Replacement: use com sabedoria</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/3DeJPFEwiBo/image-replacement-use-com-sabedoria</link>
		<comments>http://www.obasicodaweb.com/image-replacement-use-com-sabedoria#comments</comments>
		<pubDate>Sun, 07 Oct 2007 23:28:34 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.obasicodaweb.com/image-replacement-use-com-sabedoria</guid>
		<description><![CDATA[Image Replacement é uma técnica que permite substituir texto por imagem usando CSS. Existem diversas formas de se fazer isso, umas melhores que outras e cada uma delas com seus prós e contras. Eu já usei uma dessas técnicas por aqui em um artigo sobre menus com imagens e rollover (que, a propósito, precisa de [...]]]></description>
			<content:encoded><![CDATA[<p>Image Replacement é uma técnica que permite substituir texto por imagem usando CSS. Existem diversas formas de se fazer isso, umas melhores que outras e cada uma delas com seus prós e contras. Eu já usei uma dessas técnicas por aqui em um artigo sobre <a href="http://www.obasicodaweb.com/menu-imagens-rollover-exemplo">menus com imagens e rollover</a> (que, a propósito, precisa de algumas atualizações e correções).</p>
<p>Estas técnicas têm um apelo muito forte com relação à otimização para sites de busca mas, como tudo nessa vida, têm os lugares e situações certas para ser usadas.</p>
<p>A regra de ouro sobre imagens na web é: se a imagem é apenas decorativa, insira via CSS; se ela transmite algum significado não visual, ou seja, se é importante como conteúdo, insira via tag IMG no HTML.</p>
<p>Entrei agora há pouco no <a href="http://www.blackberry.com/">site da BlackBerry</a>, famosa por seus smartphones, e me deparei, logo na home page, com uma situação onde uma técnica de image replacement foi usada de maneira equivocada.</p>
<p>A página mostra três aparelhos e, creio eu, quando queremos mostrar um produto, uma foto deste produto é algo extremamente importante, que devemos sempre tentar mostrar, não importa onde nem quando.</p>
<p>Se você for até a página e desabilitar o suporte a CSS vai ver apenas uma lista não ordenada com os nomes dos produtos em links para suas respectivas páginas. Limpo, leve e simples, mas, na minha opinião, errado.</p>
<p>Pelo menos eles não cometem o erro de usar image replacement no logo da empresa, que é um dos exemplos mais importantes de onde não se deve usá-lo. E nas páginas de cada produto, as imagens estão lá, no HTML, do jeito correto. Mas, sendo a home, geralmente, a página mais importante de um site, creio eu que deveriam dar um pouco mais de atenção à importância de mostrar seus produtos sempre, chova ou faça sol, calor ou frio, com ou sem CSS.</p>
<p>O que vocês acham? Alguém tem mais algum exemplo de mau uso de image replacement?</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=UQmmDVNA"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=FGPWtGY7"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=h1GX2j7j"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=h1GX2j7j" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=TzXguJfb"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=Ldl6g5kO"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=8ASlsBQU"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=fEnc9aOj"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=eJerun8X"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/3DeJPFEwiBo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/image-replacement-use-com-sabedoria/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/image-replacement-use-com-sabedoria</feedburner:origLink></item>
		<item>
		<title>window.open() no Firefox: problemas com width</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/3MyqAPdD0tY/windowopen-no-firefox-problemas-com-width</link>
		<comments>http://www.obasicodaweb.com/windowopen-no-firefox-problemas-com-width#comments</comments>
		<pubDate>Sat, 19 May 2007 02:51:02 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/windowopen-no-firefox-problemas-com-width</guid>
		<description><![CDATA[Hoje à tarde meu amigo Jânio me apareceu no MSN com um problema interessante: ele estava fazendo um JavaScript que deveria abrir uma nova janela, com uma determinada largura e uma determinada altura. Nada mais simples, você pode pensar. Eu também pensei e ele também.
Acontece que no firefox a janela abria com uma largura mais [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje à tarde meu amigo <a href="http://sarmento.org/janio/">Jânio</a> me apareceu no MSN com um problema interessante: ele estava fazendo um JavaScript que deveria abrir uma nova janela, com uma determinada largura e uma determinada altura. Nada mais simples, você pode pensar. Eu também pensei e ele também.</p>
<p>Acontece que no firefox a janela abria com uma largura mais ou menos igual à metade do valor que ele tinha colocado no parâmetro width do método window.open(). Estranho, não?</p>
<p>Pra quem não conhece, window.open() é um método que simplesmente serve para abrir uma nova janela. O uso é assim:</p>
<p><code>//window.open(URL, nome_da_janela, parâmetros);<br />
//ex:<br />
window.open('teste.html', 'janela1', 'width=500,height=400');</code></p>
<p>Tem mais parâmetros, mas isso não vem ao caso agora. O fato é que eu fiz diversos testes e realmente a janela nunca abria com a largura certa no Firefox.</p>
<p>Então, procura daqui, procura dali, dando uma olhada na r<a href="http://developer.mozilla.org/en/docs/Gecko_DOM_Reference">eferência de DOM</a> do <a href="http://developer.mozilla.org/">Mozilla Developer Center</a>, mais precisamente nos <a href="http://developer.mozilla.org/en/docs/DOM:window#Methods">métodos do objeto window</a>, achei a solução.</p>
<p>Há três parâmetros referentes à largura da janela:</p>
<dl>
<dt>outerWidth</dt>
<dd>Define a largura da janela inteira do browser, incluindo barras de rolagem, etc e tal. só é suportada por browsers gecko (família Mozilla e Netscape)</dd>
<dt>width</dt>
<dd>Define a largura do viewport, ou seja, da área útil do browser, a área onde é exibido o conteúdo da página.</dd>
<dt>innerWidth</dt>
<dd>A mesma coisa que width, mas só é suportada por browsers gecko.</dd>
</dl>
<p>Esses parâmetros são aplicados na ordem de precedência acima. O outerWidth é o mais &#8220;forte&#8221;, ou seja, seu valor &#8220;ganha&#8221; dos outros dois. width vem logo depois, seguido de innerWidth.</p>
<p>A solução para o problema em questão era usar o outerWidth que, por algum motivo que eu não sei exatamente explicar, funciona direitinho, ao contrário do width. Porém, como outerWidth só funciona nos browsers gecko, temos que usar width também, para agradar ao IE, opera e, creio eu, safari. Nosso código ficou assim:</p>
<p><code>window.open('teste.html', 'janela1', 'width=500,outerWidth=500,height=400');</code></p>
<p>Note que, caso a janela a abrir tenha barra de rolagem vertical, vai ser necessário setar outerWidth para um valor ligeiramente maior que width, para obter o mesmo resultado em todos os browsers. Mas, em geral, 10 pixels mais ou menos, não matam ninguém.</p>
<p>Fica a dica, caso algum de vocês venha a ter o mesmo problema.</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=gqR6Fmyp"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=NaaAHqud"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=2teJgRX8"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=2teJgRX8" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=LJoplHCS"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=7SW9m7wW"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=U9fp3vfv"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=2U9ish0l"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=S1XT6qVf"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/3MyqAPdD0tY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/windowopen-no-firefox-problemas-com-width/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/windowopen-no-firefox-problemas-com-width</feedburner:origLink></item>
		<item>
		<title>Crie formulários que submetam com um ENTER</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/KQKdpFWisYA/crie-formularios-que-submetam-com-um-enter</link>
		<comments>http://www.obasicodaweb.com/crie-formularios-que-submetam-com-um-enter#comments</comments>
		<pubDate>Tue, 01 May 2007 07:56:41 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/crie-formularios-que-submetam-com-um-enter</guid>
		<description><![CDATA[Parece óbvio, não? Mas infelizmente não é tão óbvio quanto parece. Muitos sites por aí estão regredindo vários passos na escala evolutiva da web e criando formulários que só submetem com um clique do mouse em um botão ou um ENTER quando o mesmo botão tem o foco.
Esse tipo de problema é devido, praticamente sempre, [...]]]></description>
			<content:encoded><![CDATA[<p>Parece óbvio, não? Mas infelizmente <a href="http://brunotorres.net/formularios-web-20ish-aperte-enter-nada-acontece">não é tão óbvio quanto parece</a>. Muitos sites por aí estão regredindo vários passos na escala evolutiva da web e criando formulários que só submetem com um clique do mouse em um botão ou um ENTER quando o mesmo botão tem o foco.</p>
<p>Esse tipo de problema é devido, praticamente sempre, ao desejo de fazer alguma coisa &#8220;legal&#8221; com o formulário, sempre usando JavaScript e AJAX.</p>
<p>E a solução é tão simples: coloque um botão de submissão comum em seus formulários.</p>
<p>Exemplos comuns desse tipo de formulário são campos de busca e formulários onde você deve entrar apenas seu email, por exemplo, para se inscrever em algum tipo de serviço.</p>
<p>Nesse tipo de formulário, o comportamento padrão do usuário é digitar e apertar ENTER. Veja como é fácil fazer isso funcionar:</p>
<p><code>&lt;input type="text" name="email" size="50"&gt;<br/>&lt;input type=&#8221;submit&#8221; value=&#8221;Enviar&#8221;&gt;</code></p>
<p>Simples assim. A não ser que o campo onde os dados devem ser digitados seja uma TEXTAREA, um ENTER dentro do campo de texto vai submeter o formulário, enviar os dados para o servidor e, com sorte, trazer uma resposta para o usuário.</p>
<p>Se você quiser fazer algo bonito, com AJAX e tudo mais, faça <a href="http://obasicodaweb.com/arquivo/padroes-web-desenvolvimento-em-camadas">em outra camada</a>. Na <a href="http://obasicodaweb.com/arquivo/padroes-web-desenvolvimento-em-camadas-camada-de-comportamento">camada de comportamento</a>. Já falei sobre isso aqui em alguns posts então não vale a pena gastar espaço falando de novo.</p>
<p>A moral da história é: não torne o que é simples complicado. Até porque acaba sendo mais complicado pra você também.</p>
<p><br/></p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=TsGgjufS"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=NPeqYwRm"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=rYm0H0Xo"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=rYm0H0Xo" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=5o5j0QsR"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=seIv8o2x"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=Aw5tchbp"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=34tCgwD2"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=V1d66S0P"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/KQKdpFWisYA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/crie-formularios-que-submetam-com-um-enter/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/crie-formularios-que-submetam-com-um-enter</feedburner:origLink></item>
		<item>
		<title>Como criar elementos HTML via JavaScript/DOM</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/83SbBRYon3g/como-criar-elementos-html-via-javascriptdom</link>
		<comments>http://www.obasicodaweb.com/como-criar-elementos-html-via-javascriptdom#comments</comments>
		<pubDate>Mon, 23 Apr 2007 04:23:21 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[DOM]]></category>

		<category><![CDATA[ECMAScript]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/como-criar-elementos-html-via-javascriptdom</guid>
		<description><![CDATA[Em alguns casos precisamos usar alguns elementos HTML que só têm função quando há suporte a javascript, nas página que estamos desenvolvendo.
Nesse caso, o mais sensato a se fazer é criar esses elementos via JavaScript. Dessa forma eles só estarão disponíveis para o usuário caso o browser que ele estiver usando tenha suporte a javascript, [...]]]></description>
			<content:encoded><![CDATA[<p>Em alguns casos precisamos usar alguns elementos HTML que só têm função quando há suporte a javascript, nas página que estamos desenvolvendo.</p>
<p>Nesse caso, o mais sensato a se fazer é criar esses elementos <strong>via JavaScript</strong>. Dessa forma eles só estarão disponíveis para o usuário caso o browser que ele estiver usando tenha suporte a javascript, ficando fora do caminho caso contrário. Assim, não criamos <em>expectativas frustradas</em> no usuário e temos uma página cujas funcionalidades são <em>coerentes</em> com o ambiente onde ela está sendo exibida.</p>
<p>Criar elementos via javascript não é nenhum bicho de sete cabeças. Há duas maneiras interessantes (e algumas outras não interessantes) de se fazer isso:</p>
<ol>
<li>Adicionando conteúdo ao innerHTML do elemento em questão</li>
<li>Criando um objeto DOM e inserindo dentro da página via DOM API</li>
</ol>
<p>A primeira é mais fácil e, segundo alguns testes (cujos links não tenho agora, mas vou procurar), mais rápido que o segundo. Porém não faz parte de nenhum padrão DOM e pode causar problemas em alguns casos raros, como por exemplo se você estiver usando XHTML e enviando ao browser como uma aplicação de XML. Como ninguém em sã consciência, que esteja pretendendo fazer um site com o máximo de compatibilidade faria isso, não precisa se preocupar.</p>
<p>A segunda segue padrões mais rígidos e vai funcionar sempre que houver um suporte decente ao DOM. Grosso modo, é menos compatível que a primeira, e devemos sempre testar a presença dos métodos necessários a sua execução antes de criar os elementos.</p>
<p>Vamos então aos códigos:</p>
<p>Usaremos o seguinte exemplo: Imagine que você tenha em sua página um botão cuja função é esconder ou mostrar um determinado conteúdo. Digamos que esta funcionalidade esteja implementada apenas por meio de JavaScript. Você não vai querer que os usuários que não tenham suporte a javascript vejam o botão e sintam-se frustrados ao clicar e nada acontecer, vai?</p>
<p>Portanto é importante que esse botão seja criado via JavaScript.</p>
<h3>Criando elementos via innerHTML</h3>
<p>innerHTML é uma propriedade que permite ler ou modificar o conteúdo HTML de um elemento HTML. Exemplo:</p>
<p><code>&lt;p&gt;Site do &lt;a href=http://w3.org/&gt;W3C&lt;/a&gt;&lt;/p&gt;</code></p>
<p>No caso acima, o innerHTML do elemento P é &#8220;<code>Site do &lt;a href=http://w3.org/&gt;W3C&lt;/a&gt;</code>&#8220;. Entendeu? Simples, não é?</p>
<p>No nosso exemplo, precisamos criar algo do tipo:</p>
<p><code>&lt;button type="button" id="toggle"&gt;Esconder/Mostrar&lt;/button&gt;</code></p>
<p>E depois adicionar a esse botão, via JavaScript, a funcionalidade desejada.</p>
<p>Antes de criar o elemento precisamos definir onde o elemento deve ser colocado. Ou seja, precisamos decidir qual será o elemento &#8220;pai&#8221; deste nosso botão.</p>
<p>Digamos que você tenha um DIV e que este DIV tenha o ID &#8220;conteudo&#8221;. Dentro deste DIV está o conteúdo que deve ser exibido ou escondido, dependendo do caso. O botão entraria, então, ao fim deste DIV.</p>
<p>Este é o código HTML do DIV conteudo:</p>
<p><code>&lt;div id="conteudo"&gt;<br/>&lt;div class=&#8221;texto&#8221;&gt;<br/>&lt;p&gt;Aqui entra o texto.&lt;/p&gt;<br/>&lt;p&gt;Poderíamos ter um DIV apenas, mas optei por usar dois para facilitar o exemplo.&lt;/p&gt;<br/>&lt;/div&gt; &lt;!&#8211; /texto &#8211;&gt;<br/>&lt;/div&gt; &lt;!&#8211; /conteudo &#8211;&gt;</code></p>
<p>Vamos lá. O primeiro passo é acessar o DIV pelo JavaScript:</p>
<p><code>var conteudo = document.getElementById('conteudo');</code></p>
<p>Jogamos uma referência ao elemento cujo ID é conteúdo para uma variável criativamente nomeada &#8220;conteudo&#8221;. Isso significa que tudo que fizermos com esta variável será aplicado de fato ao elemento referenciado.</p>
<p>O passo seguinte é criar o código do nosso elemento. Vamos colocá-lo em uma variável também:</p>
<p><code>var button = '&lt;button type="button" id="toggle"&gt;Esconder/Mostrar&lt;/button&gt;';</code></p>
<p>A variável button é uma string que contém o código do nosso botão. Agora basta colocar esse código dentro do DIV conteudo:</p>
<p><code>conteudo.innerHTML += button;</code></p>
<p>O operador <code>+=</code> tem o efeito de adição. No caso acima é o mesmo que <code>conteudo.innerHTML = conteudo.innerHTML + button</code>.</p>
<p>Agora só falta adicionar a função javascript desejada, o que faremos ao fim do texto.</p>
<h3>Criando elementos via DOM API</h3>
<p>Criar elementos via DOM API não é tão simples quanto via innerHTML. Primeiro precisamos criar o elemento, depois adicionar suas propriedades e atributos e, por fim, adicioná-lo ao conteúdo da página. Acompanhe comigo.</p>
<p>Criando o elemento:</p>
<p><code>var button = document.createElement('button');</code></p>
<p>A linha acima cria o elemento e associa este elemento à variável button. Note que, embora tenha sido criado, o elemento ainda não está visível no documento. Continuemos.</p>
<p>Precisamos, agora, adicionar os atributos TYPE e ID ao botão:</p>
<p><code>button.setAttribute('type', 'button');<br/>button.setAttribute(&#8217;id&#8217;, &#8216;toggle&#8217;);</code></p>
<p>Agora vamos adicionar o texto &#8220;Esconder/Mostrar&#8221; ao botão. Primeiro precisamos criar este texto no documento em uma variável e depois adicioná-lo ao botão. Assim:</p>
<p><code>var btntext = document.createTextNode('Esconder/Mostrar');<br/>button.appendChild(btntext);</code></p>
<p>Como no outro exemplo, precisamos criar uma variável que referencie o elemento &#8220;pai&#8221;, ou seja, o DIV conteudo:</p>
<p><code>var conteudo = document.getElementById('conteudo');</code></p>
<p>E, por fim, adicionar o botão ao elemento pai:</p>
<p><code>conteudo.appendChild(button);</code></p>
<p>Ou seja, adicionamos um &#8220;filho&#8221; ao &#8220;pai&#8221; conteudo. O filho é o nosso famoso botão.</p>
<p>Claro que podemos adicionar elementos em outros lugares além do fim de um outro elemento, mas isso é um pouco mais avançado e fica para um outro post.</p>
<p>Adicionando funcionalidade ao elemento</p>
<p>O elemento que criamos é, até então, inútil. Vamos adicionar funcionalidade a ele. Para isso vamos usar a seguinte função:</p>
<p><code>function toggle(el) {<br/>if ( el.style.display != &#8216;none&#8217; ) {<br/>el.style.display = &#8216;none&#8217;;<br/>}<br/>else {<br/>el.style.display = &#8221;;<br/>}<br/>}</code></p>
<p>Esta função pega uma referência a um elemento como parâmetro e exibe ou esconde este elemento, dependendo do seu estado atual.</p>
<p>Antes de aplicar a função, vamos criar uma variável que referencie o conteúdo que será escondido ou exibido que é, no nosso caso, o DIV cuja classe é &#8220;texto&#8221; e que está dentro do DIV conteudo:</p>
<p><code>var texto = conteudo.getElementsByTagName('div')[0];</code></p>
<p>A função <code>getElementsByTagName</code> vai pegar todos os elementos dentro de &#8220;conteudo&#8221; que sejam definidos pela tag &lt;div&gt;. Essa função retorna um Array, que terá tantas posições quantos elementos existam. O <code>[0]</code> significa que queremos a primeira posição que, no nosso caso, é a única. (Preciso explicar melhor Arrays e <code>getElementsByTagName</code>. Mais uma promessa&#8230;)</p>
<p>Primeiro vamos adicionar esta função ao evento onclick &#8212; que é executado quando o elemento é clicado com o mouse &#8212; do botão:</p>
<p><code>button.onclick = function(){ toggle(texto); }</code></p>
<p>Depois, vamos adicioná-la ao evento onkeypress &#8212; que é executado quando o usuário digita alguma tecla enquanto tem o elemento em foco &#8211;, checando antes se a tecla pressionada foi ENTER:</p>
<p><code>button.onkeypress = function(e){<br/>var keynum;<br/>if(window.event) // para o IE<br/>keynum = window.event.keyCode;<br/>else if(e.keyCode) // Netscape/Firefox/Opera<br/>keynum = e.keyCode;<br/>if (keynum == 13) {<br/>toggle(texto);<br/>}<br/>}</code></p>
<p>E assim temos o nosso elemento criado e funcionando.</p>
<p>Fazer um texto deste tamanho sobre o assunto pode fazer com que pareça mais difícil do que é, por isso veja os exemplos abaixo, com os códigos consolidados, para entender melhor como funciona e ver que não é nenhum bicho de sete cabeças:</p>
<ul>
<li><a href="http://obasicodaweb.com/exemplos/criar-elementos/ex-criar-elemento-innerhtml.html">Exemplo de criação de elemento com innerHTML</a></li>
<li><a href="http://obasicodaweb.com/exemplos/criar-elementos/ex-criar-elemento-dom-api.html">Exemplo de criação de elemento via DOM API</a></li>
</ul>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=sU8lrIg8"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=lYd8nDlY"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=RqEnVKy8"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=RqEnVKy8" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=SbbnKXGl"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=X9sTTjpx"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=m98mG3RP"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=SwNnuldU"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=26RW2AN4"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/83SbBRYon3g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/como-criar-elementos-html-via-javascriptdom/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/como-criar-elementos-html-via-javascriptdom</feedburner:origLink></item>
		<item>
		<title>Como fazer links que funcionem com e sem JavaScript</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/7S1pt8HVwRY/como-fazer-links-que-funcionem-com-e-sem-javascript</link>
		<comments>http://www.obasicodaweb.com/como-fazer-links-que-funcionem-com-e-sem-javascript#comments</comments>
		<pubDate>Fri, 20 Apr 2007 04:54:18 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[HTTP]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/arquivo/como-fazer-links-que-funcionem-com-e-sem-javascript</guid>
		<description><![CDATA[Podemos fazer maravilhas com JavaScript e, com a popularização das chamadas HTTP via JavaScript (mais conhecidas como AJAX) e posteriormente do que chamam de web 2.0, essa linguagem de scripts, tão mal falada e quase esquecida em um passado não muito distante, voltou à tona e é usada, hoje, por 9,9 entre 10 desenvolvedores web.
O [...]]]></description>
			<content:encoded><![CDATA[<p>Podemos fazer maravilhas com JavaScript e, com a popularização das chamadas HTTP via JavaScript (mais conhecidas como <a href="http://www.adaptivepath.com/publications/essays/archives/000385.php" title="Artigo que cunhou o termo AJAX">AJAX</a>) e posteriormente do que chamam de web 2.0, essa linguagem de scripts, tão mal falada e quase esquecida em um passado não muito distante, voltou à tona e é usada, hoje, por 9,9 entre 10 desenvolvedores web.</p>
<p>O problema é que, na maioria dos casos, os desenvolvedores não se limitam a <em>usar</em> o JavaScript onde ele é realmente necessário e traz realmente algum ganho de produtividade e usabilidade <em>para o usuário</em>, e acabam abusando da linguagem e, pior ainda, fazendo com que funcionalidades e conteúdo estejam acessíveis apenas quando houver suporte a JavaScript.</p>
<p>A idéia desse texto não é falar mal do JavaScript e sim mostrar a vocês como fazer com que ele não fique no caminho do usuário, ou seja, fazer com que o que funciona com JavaScript também funcione sem JavaScript.</p>
<p>Na verdade, é o contrário, a idéia é usar sempre o conceito de <a href="http://en.wikipedia.org/wiki/Progressive_enhancement">progressive enhancement</a> (explico melhor em outro post, se vocês acharem necessário), que é, basicamente, o uso racional e correto do <a href="http://obasicodaweb.com/arquivo/padroes-web-desenvolvimento-em-camadas">desenvolvimento em camadas</a>. Algo tão simples quanto começar do começo, dar um passo de cada vez para chegar a um resultado satisfatório.</p>
<p>Tenha em mente que, por mais que existam poucos usuários que navegam sem JavaScript, um desses usuários pode ser um grande cliente em potencial navegando de um PDA ou o <a href="http://www.google.com/">Google</a>.</p>
<p>Enfim, vamos ao que interessa. Comecemos pelo exemplo mais simples.</p>
<h3>Não existe protocolo javascript, portanto não é certo usar javascript:</h3>
<p>Isso mesmo. Atire a primeira pedra aquele que nunca fez isso:</p>
<p><code>&lt;a href="javascript:fazAlgumaCoisa();"&gt;Clique aqui para fazer alguma coisa&lt;/a&gt;</code></p>
<p>O atributo <a href="http://www.w3.org/TR/html401/struct/links.html#adef-href">HREF</a> do elemento <a href="http://www.w3.org/TR/html401/struct/links.html#edef-A">A</a> (o popular anchor, ou link para os íntimos) foi feito especificamente para definir uma <a href="http://www.w3.org/TR/html401/types.html#type-uri">URI</a>. Uma URI é composta por algumas partes e a primeira delas é o protocolo (na verdade, um esquema, mas vamos chamar de protocolo porque é o nome mais comum. Prometo explicar isso melhor outro dia também), que deve ser algo como http:, ftp:, mailto:, etc e tal. javascript: não faz parte dessa lista. Não é um esquema, não é um protocolo. Não use sob hipótese alguma.</p>
<p>Outra coisa importante é: só use links se realmente tiver algum lugar para apontar usando HREF. Se o propósito é totalmente outro, use outro elemento. Veremos isso mais a frente no texto.</p>
<h4>Tá bom, eu não uso, mas como eu faço então, tio?</h4>
<p>Há varias maneiras. Algumas melhores, outras piores. Vejamos:</p>
<p><code>&lt;a href=http://meusite.com/teste.html onclick="fazAlgumaCoisa();return false;"&gt;Link de teste&lt;/a&gt;</code></p>
<p>O que estamos fazendo na linha acima é um link para uma URL que existe e, caso haja suporte a JavaScript, ao ser clicado, esse link vai executar a função fazAlgumaCoisa(), definida em algum outro lugar.</p>
<p>Notem o <code>return false</code> depois da chamada da função. Ele serve para que o clique seja cancelado após executar a função. Se esquecer dele, o usuário será levado à URL em questão depois de executar a tal função e, em geral, não é isso que você quer, não é?</p>
<p>Mas esse modo tem alguns problemas:</p>
<ol>
<li>Não separa o <a href="http://obasicodaweb.com/arquivo/padroes-web-desenvolvimento-em-camadas" title="Padrões web: Desenvolvimento em camadas">comportamento do conteúdo</a>. Ou seja, você está misturando as camadas, o que não é bom por diversos motivos.</li>
<li>Só funciona para o evento de clique do mouse. Usuários que sigam o link via teclado não vão ter a funcionalidade do script, o que pode ser o efeito desejado, mas, em geral, não é.</li>
</ol>
<h4>Como resolver isso então?</h4>
<p>Separando o JavaScript do HTML. Para isso, você precisa definir algo para identificar esse link em específico e poder acessá-lo pelo JavaScript. Vamos usar um ID para o nosso exemplo:</p>
<p><code>&lt;a href=http://meusite.com/teste.html id="linkteste"&gt;Link de teste&lt;/a&gt;</code></p>
<p>Um link simples. Vamos agora adicionar a funcionalidade em um JavaScript externo:</p>
<p><code>function powerLinks(){<br/>var link = document.getElementById(&#8217;linkteste&#8217;);<br/>link.onclick = function(){<br/>fazAlgumaCoisa();<br/>return false;<br/>}<br/>}<br/><br/>window.onload = powerLinks;</code></p>
<p>Ou seja, redefinimos o evento <code>onclick</code> do link e adicionamos o nosso código nele. Simples, não? A última linha faz com que a função seja executada ao carregar a página (existem formas melhores de fazer isso, mais uma promessa para um outro post. Me cobrem, por favor).</p>
<p>Mas ainda temos o problema do mouse. Precisamos fazer com que o script funcione também para quem está navegando via teclado.</p>
<p>Fazemos isso usando o evento onkeypress, que é ativado quando o usuário aperta alguma tecla, e checando se a tecla pressionada foi o ENTER. Veja como:</p>
<p><code>function powerLinks(){<br/>//aqui entra o codigo anterior do script<br/>link.onkeypress = function(e){<br/>var keynum;<br/>if(window.event) // para o IE<br/>keynum = window.event.keyCode;<br/>else if(e.keyCode) // Netscape/Firefox/Opera<br/>keynum = e.keyCode;<br/>if (keynum == 13) {<br/>fazAlgumaCoisa();<br/>return false;<br/>}<br/>}<br/>}</code></p>
<p>Como vocês podem perceber, o IE trata o evento onkeypress um pouquinho diferente dos outros browsers, mas nada ultra complicado. 13 é o número de tecla correspondente ao ENTER. Ou seja, quando o usuário pressionar ENTER, o script será executado.</p>
<h3>E quando não houver URL pra usar no HREF?</h3>
<p>Bem, nesse caso então você não tem um link e, claro, não deve usar o elemento A. Use qualquer outra coisa e, via CSS, faça com que essa coisa se pareça com um link e, de preferência, <a href="http://obasicodaweb.com/?p=23">crie essa coisa com JavaScript</a>, para que aqueles que não têm suporte a JavaScript nem vejam a tal coisa.</p>
<p>Infelizmente, não é qualquer elemento que pode receber o foco via teclado, portanto se a sua idéia é que esse elemento seja acessível via teclado, não há outro jeito senão usar um A. Porém, como esse A será criado na página via JavaScript, ele não vai incomodar ninguém que não tenha suporte a scripts. Exemplo:</p>
<p><code>function criaPseudoLink(){<br/>var paiPseudoLink = document.getElementById(&#8217;pai&#8217;) //o elemento que conterá o pseudo link<br/>paiPseudoLink.innerHTML += &#8216;&lt;a href=&#8221;#&#8221; id=&#8221;linkteste&#8221;&gt;Faz Alguma coisa&lt;/a&gt;&#8217;;<br/>}</code></p>
<p>Ou seja, o conteúdo do elemento &#8220;pai&#8221; do pseudo link , cujo ID é &#8220;pai&#8221; será acrescido do HTML correspondente ao A. O resto é igualzinho ao que foi descrito anteriormente.</p>
<p>Por hoje é só. Ficou claro? Alguma dúvida? Esqueci de algo? Falei alguma besteira? A caixa de comentários é toda de vocês. <img src='http://www.obasicodaweb.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para não deixar o post ainda mais longo, vou abordar outros tipos de abusos de JavaScript em outro post. E, como já disse, me cobrem, por favor.</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=2wrTVPHV"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=HrcraLI8"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=ubuCLCDy"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=ubuCLCDy" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=A6snJR84"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=nBKH8S9W"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=iO89CHjG"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=7FV1ku8b"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=7BGCKnRg"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/7S1pt8HVwRY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/como-fazer-links-que-funcionem-com-e-sem-javascript/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/como-fazer-links-que-funcionem-com-e-sem-javascript</feedburner:origLink></item>
		<item>
		<title>Voltando à ativa: sugestões?</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/ZGc4sSwr75A/voltando-a-ativa-sugestoes</link>
		<comments>http://www.obasicodaweb.com/voltando-a-ativa-sugestoes#comments</comments>
		<pubDate>Fri, 13 Apr 2007 03:11:43 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/arquivo/voltando-a-ativa-sugestoes</guid>
		<description><![CDATA[Depois de um longo inverno, estou pretendendo voltar a escrever por aqui. Como o meu blog principal, Bruno Torres ponto net vem mudando de foco com o tempo (e acredito que vá mudar muito ainda, de acordo com as mudanças na minha vida, tanto pessoal quanto profissional) acho que esse aqui é o espaço ideal [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de um longo inverno, estou pretendendo voltar a escrever por aqui. Como o meu blog principal, Bruno Torres ponto net vem mudando de foco com o tempo (e acredito que vá mudar muito ainda, de acordo com as mudanças na minha vida, tanto pessoal quanto profissional) acho que esse aqui é o espaço ideal para voltar a escrever textos sobre desenvolvimento web.</p>
<p>O meu maior problema em voltar a escrever aqui é que acho que esse nome &#8220;O básico da web&#8221; tem me feito sentir um pouco engessado sobre os temas que devo abordar.</p>
<p>Além disso, comecei a fazer posts em série, no estilo curso de html, e isso acabou não me agradando, e a vontade de continuar escrevendo foi diminuindo.</p>
<p>Porém, este blog tem hoje incríveis 900 assinantes, o que é muito para um blog tão pequeno, com tão pouco conteúdo. Imagino que boa parte desses assinantes (ou seja, vocês, que estão lendo isso agora) vieram do outro blog e isso me faz pensar mais duas vezes antes de escrever. E aí acabo não escrevendo.</p>
<p>A minha idéia com esse post é tentar entender o que vocês esperam encontrar por aqui. Eu acho que devo abandonar esse esquema de posts sequenciais sobre um mesmo tema e escrever sobre o que me der na telha, ou o que estiver em foco ou, melhor ainda, o que vocês quiserem.</p>
<p>Sendo assim, peço àqueles que estiverem afim de ajudar, que usem o <a href="http://obasicodaweb.com/contato/">formulário de contato</a>, ou me escrevam um email diretamente, ou façam comentários, sugerindo temas, me ajudando a definir qual o futuro do conteúdo desse espaço.</p>
<p>E então. Alguém afim de ajudar? Não precisa fazer trackback nem pingback (aliás, se não souberem o que é isso, me avisem ;)). Só quero idéias e sugestões para fazer desse espaço um lugar melhor para aqueles que querem aprender mais sobre a web.</p>
<p>Conto com vocês!</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=E0SafMve"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=r7JePsef"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=ZDgzzzsW"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=ZDgzzzsW" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=aRMhtUro"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=gB0HIEZM"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=izYEPmnq"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=AruTK2o1"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=gGymLRfe"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/ZGc4sSwr75A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/voltando-a-ativa-sugestoes/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/voltando-a-ativa-sugestoes</feedburner:origLink></item>
		<item>
		<title>HTML - Esqueleto de um documento HTML - Parte 3: Outros elementos do HEAD</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/fzCPkVxIGuI/html-esqueleto-de-um-documento-html-parte-3-outros-elementos-do-head</link>
		<comments>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-3-outros-elementos-do-head#comments</comments>
		<pubDate>Sun, 29 Oct 2006 03:43:05 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/arquivo/html-esqueleto-de-um-documento-html-parte-3-outros-elementos-do-head</guid>
		<description><![CDATA[Vamos continuar a falar sobre os elementos que compõem o HEAD de um documento HTML.
Elemento STYLE
O elemento STYLE serve para aplicar estilos diretamente dentro do documento HTML. É importante notar que para reforçar a questão da separação em camadas, devemos evitar ter estilos aplicados desta forma.
Vejamos um exemplo:
&#60;style type="text/css" media="screen"&#62;body{ font: normal 1em verdana, helvetica, [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos continuar a falar sobre os elementos que compõem o HEAD de um documento HTML.</p>
<h3>Elemento STYLE</h3>
<p>O elemento STYLE serve para aplicar estilos diretamente dentro do documento HTML. É importante notar que para reforçar a questão da <a href="http://obasicodaweb.com/arquivo/padroes-web-desenvolvimento-em-camadas">separação em camadas</a>, devemos evitar ter estilos aplicados desta forma.</p>
<p>Vejamos um exemplo:</p>
<p><code>&lt;style type="text/css" media="screen"&gt;<br/>body{ font: normal 1em verdana, helvetica, sans-serif;}<br/>div{ width: 750px; padding:10px; }<br/>&lt;/style&gt;</code></p>
<p>O elemento STYLE também pode ser usado para referenciar um documento CSS externo. Isso já foi muito usado para &#8220;esconder&#8221; os estilos de browsers antigos (como o Netscape 4), porém tome cuidado pois pode causa um efeito chamado <a href="http://www.bluerobot.com/web/css/fouc.asp">FOUC</a>, que faz com que, por um pequeno espaço de tempo, o conteúdo apareça sem nenhum estilo. Este problema é resolvido incluindo um ou mais elementos SCRIPT ou LINK dentro do HEAD do seu documento.</p>
<p><code>&lt;style type="text/css" media="screen"&gt;<br/>@import url(estilo.css);<br/>&lt;/style&gt;</code></p>
<p>Hoje esta forma já não é a única forma simples de se esconder estilos de browsers antigos. Usar um LINK com duas ou mais mídias, separadas por uma vírgula e um espaço, no atributo <code>media</code>, tem o mesmo efeito:</p>
<p><code>&lt;link rel="stylesheet" type="text/css" href="estilo.css" media="screen, projection"&gt;</code></p>
<h3>Elemento SCRIPT</h3>
<p>O elemento SCRIPT serve tanto para conter scripts inteiros quanto para referenciar um script externo. Geralmente esses scripts são escritos na linguagem JavaScript. Exemplo:</p>
<p><code>&lt;script type="text/javascript"&gt;<br/>window.onload = function() { alert(&#8217;Olá, mundo!&#8217;) }<br/>&lt;/script&gt;</code></p>
<p>Desta forma, o script inteiro está contido no elemento SCRIPT.</p>
<p>Apesar de ser, em geral, melhor colocar todos os elementos SCRIPT de uma página dentro do HEAD, isso não é mandatório. Algumas vezes pode ser necessário que o script esteja localizado dentro do corpo (BODY) do documento e não há grandes problemas nisso. Falaremos desse assunto em breve, mas você pode ver algumas coisas sobre JavaScript no meu artigo sobre a <a href="http://obasicodaweb.com/arquivo/padroes-web-desenvolvimento-em-camadas-camada-de-comportamento">camada de comportamento</a>.</p>
<p>A outra forma de se usar o elemento SCRIPT é com o atributo src contendo a localização (URL) de um arquivo de script externo:</p>
<p><code>&lt;script type="text/javascript" src="/js/script.js"&gt;&lt;/script&gt;</code></p>
<p>Desta forma o script contido no arquivo script.js será executado logo que o elemento SCRIPT for interpretado pelo browser.</p>
<p>É importante notar que, de todos os elementos contidos no HEAD, apenas o SCRIPT precisa de uma tag de fechamento. E é vital que você nunca esqueça dessa tag de fechamento, pois pode fazer com que sua página apareça totalmente em branco em alguns browsers. Já já vamos entender porque alguns elementos precisam ser fechados e outros não e porque alguns tem conteúdo e outros não. Sejam pacientes.</p>
<h3>Elemento NOSCRIPT</h3>
<p>O elemento NOSCRIPT serve para definir um conteúdo alternativo a um script, que apenas será exibido caso o <a href="http://obasicodaweb.com/termos-e-definicoes#termo-useragent">user-agent</a> usado não tenha suporte a scripts ou esteja com esse suporte desabilitado.</p>
<p>Em geral, devemos desenvolver nossas páginas de forma que a <a href="http://obasicodaweb.com/arquivo/padroes-web-desenvolvimento-em-camadas">camada de conteúdo</a> seja, por si só, suficiente para que um usuário possa executar qualquer tarefa. Porém, em alguns casos, isso não é possível. Sendo assim, devemos usar o elemento NOSCRIPT para informar ao usuário que seu user-agent não tem suporte a scripts e que uma determinada função da página só pode ser usada (ou visualizada) na presença deste suporte. Exemplo:</p>
<p>&lt;noscript&gt;<br/>&lt;p&gt;É necessário que haja suporte a javascript para que a função x bla bla bla&lt;/p&gt;<br/>&lt;/noscript&gt;</p>
<p>Assim como o elemento SCRIPT, o NOSCRIPT pode ocorrer tanto dentro do HEAD quanto dentro do BODY de um documento HTML.</p>
<p>E aqui termina o que tinha a ser dito sobre o elemento HEAD e seus &#8220;filhos&#8221;. Com certeza, em artigos futuros desta mesma série, voltaremos a falar destes elementos, para explicar alguma especificidade que não tenha sido necessária explicar até aqui ou que necessite de algum conceito que ainda vamos aprender. Continuem comigo!</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=dpbz8oYG"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=m14qkIVb"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=EV9j19H3"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=EV9j19H3" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=GIbmL5uc"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=qiseRJ2k"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=XaTYaugR"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=inAeOX15"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=HikJUA8U"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/fzCPkVxIGuI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-3-outros-elementos-do-head/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-3-outros-elementos-do-head</feedburner:origLink></item>
		<item>
		<title>HTML - Esqueleto de um documento HTML - Parte 2: HTML e HEAD</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/o7jnE4_dYZo/html-esqueleto-de-um-documento-html-parte-2-html-e-head</link>
		<comments>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-2-html-e-head#comments</comments>
		<pubDate>Sat, 28 Oct 2006 05:27:12 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/arquivo/html-esqueleto-de-um-documento-html-parte-2-html-e-head</guid>
		<description><![CDATA[Vamos continuar desmontando o esqueleto básico do nosso documento HTML de exemplo. Antes de começar essa parte, vamos relembrar o código de exemplo:

  &#60;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd"&#62;
  &#60;html lang="pt-br"&#62;
  &#60;head&#62;
  &#60;meta http-equiv="content-type" content="text/html; charset=utf-8"&#62;
  &#60;title&#62;Título da minha página&#60;/title&#62;
  &#60;link rel="stylesheet" href="/c/style.css" type="text/css" media="screen,
  projection"&#62;
 [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos continuar desmontando o esqueleto básico do nosso documento HTML de exemplo. Antes de começar essa parte, vamos relembrar o código de exemplo:</p>
<pre xml:space="preserve">
  &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd"&gt;
  &lt;html lang="pt-br"&gt;
  &lt;head&gt;
  &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;
  &lt;title&gt;Título da minha página&lt;/title&gt;
  &lt;link rel="stylesheet" href="/c/style.css" type="text/css" media="screen,
  projection"&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;div id="conteudo"&gt;
  &lt;/div&gt;
  &lt;/body&gt;
  &lt;/html&gt;
</pre>
<p>O que nos interessa para este post é o código que vai da linha 2 à linha 7 do código acima. O elemento HTML e o elemento HEAD e seus &#8220;elementos-filho&#8221;.</p>
<h3>Elemento HTML e o atributo lang</h3>
<p>O elemento HTML é descrito pela tag <code>&lt;html&gt;</code>, e é o elemento raiz de todo documento HTML.</p>
<p>Segundo o DTD do HTML 4.01 Strict, o elemento HTML não precisa ter nem sua tag de abertura nem sua tag de fechamento declaradas no documento. Isso acontece com diversos outros elementos e você vai poder checar por si mesmo cada um deles quando estivermos estudando a leitura e interpretação de DTDs.</p>
<p>Porém, como boa prática, vamos sempre usar as tags de abertura e fechamento para todos os elementos, salvo algumas exceções.</p>
<p>O mais importante de estudarmos com relação ao elemento HTML não é o elemento em si, mas sim seu atributo <code>lang</code>.</p>
<p>O atributo <code>lang</code> pode ser usado em quaisquer elementos do HTML, porém ele é especialmente importante para o elemento HTML, pois serve para definir o idioma predominante no documento.</p>
<p>No caso do nosso documento de exemplo, o idioma que estamos declarando é o pt-br, ou seja, português do Brasil.</p>
<p>O valor do atributo <code>lang</code> pode ser apenas um código de idioma ou um código de idioma seguido de um código de país.</p>
<p><strong>Códigos de idioma</strong> devem seguir o padrão ISO-639-1 (códigos de duas letras) ou o ISO-639-2 (códigos de três letras). Você pode ver os valores possíveis em ambos os padrões na página de <a href="http://www.loc.gov/standards/iso639-2/php/code_list.php">listagem de códigos de idioma</a>, no site da biblioteca do congresso americano.</p>
<p><strong>Códigos de país</strong> com duas letras devem seguir o padrão <a href="http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.html">ISO-3166</a>.</p>
<p>Não pode haver espaços dentro do atributo lang e os códigos de idioma e país devem ser separados por um hífem (-).</p>
<p>Declarar o idioma base do documento no elemento HTML é importante e essa informação pode ser usada, por exemplo, por um leitor de tela, para selecionar o idioma correto em que o documento será lido ou por um mecanismo de busca para classificar corretamente uma página em seus índices.</p>
<p>Quanto ao elemento HTML em si, não temos grandes coisas a falar. Sua tag de abertura deve vir logo após o DOCTYPE e sua tag de fechamento deve estar na última linha do documento. Ponto.</p>
<h3>Elemento HEAD e seu conteúdo</h3>
<p>O elemento HEAD deve ser declarado logo após a tag de abertura do elemento HTML e sua função é, basicamente, descrever <em>meta-informações</em> sobre o documento.</p>
<p>Essas meta-informações podem ou não ser visíveis para o usuário e algumas fazem sentido apenas em um determinado contexto ou para um determinado <em lang="en" xml:lang="en"><a href="http://obasicodaweb.com/termos-e-definicoes#termo-useragent">user-agent</a></em>.</p>
<p>Os elementos que compõem o HEAD são: TITLE, o título do documento; META, descritor genérico de meta-informação, que tem diversas funções que veremos a seguir; LINK, que, ao contrário do que se pode pensar, não é o elemento que cria links dentro de um texto e, sim, links para formas alternativas de conteúdo, estilos CSS, páginas vizinhas, índices, e outras coisas mais; STYLE, que serve para declarar estilos dentro do próprio documento; SCRIPT, geralmente usado para conter ou referenciar scripts em JavaScript, mas pode ser usado para scripts em outras linguagens também; NOSCRIPT, que define um conteúdo a ser exibido caso o <em lang="en" xml:lang="en"><a href="http://obasicodaweb.com/termos-e-definicoes#termo-useragent">user-agent</a></em> não tenha suporte a scripts</p>
<p>Vamos entender melhor cada um desses elementos:</p>
<h4>Elemento TITLE</h4>
<p>O título do documento. O elemento cujo conteúdo é mais relevante para os mecanismos de busca na hora de indexar e ranquear uma página.</p>
<p>Deve haver um, e apenas um, TITLE por documento HTML. Seu conteúdo deve, preferencialmente, descrever de forma simples e clara o conteúdo do documento e, em browsers gráficos, é o que será exibido no topo da janela do browser, em geral ao lado do nome deste.</p>
<h4>Elemento META</h4>
<p>Como já disse, existem diversos tipos de informação que podem ser descritas pelo elemento META. Alguns exemplos são:</p>
<p><strong>O tipo de conteúdo e o conjunto de caracteres usado no documento</strong>: O META exibido no exemplo é desse tipo. Declara que o documento é do tipo <code>text/html</code> (ou seja, HTML) e que o conjunto de caracteres usado no documento é o UTF-8. Será usado pelo browser caso esta informação não seja enviada pelo servidor, no <a href="http://obasicodaweb.com/arquivo/introducao-ao-http">cabeçalho HTTP</a>. Sempre declare este META como primeiro elemento do HEAD. Quanto antes ele vier no documento melhor, pois, caso ele precise ser usado, o browser terá que fazer uma releitura do documento e é melhor que isso seja feito enquanto poucos bytes, e principalmente, apenas caracteres ASCII, foram lidos.</p>
<p>O <code>http-equiv</code> indica que este META é uma informação equivalente a um cabeçalho HTTP.</p>
<p><code>&lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;</code></p>
<p><strong>Descrição do documento</strong>: uma breve descrição do conteúdo do documento, que pode ser usada por sites de busca como descrição do site em suas listagens.</p>
<p><code>&lt;meta name="description" content="Coloque aqui a descrição do site"&gt;</code></p>
<p><strong>Palavras-chave</strong>: listagem de palavras-chave relevantes ao conteúdo do documento, que podem ser usadas por sites de busca (embora hoje já não sejam mais tão relevantes) e, supostamente, para outros fins, como escolha de anúncios do <a href="http://www.google.com/adsense/">Adsense</a>, por exemplo.</p>
<p><code>&lt;meta name="keywords" content="basico,web,html,http"&gt;</code></p>
<p>Além destes exemplos de META, existem outros vários. Vamos vê-los no momento oportuno.</p>
<h4>Elemento LINK</h4>
<p>O elemento LINK define uma relação entre o nosso documento e outros documentos. Existem diversos tipos de relações que podem ser definidas.</p>
<p>O tipo de relação entre os documentos é descrita pelos atributos <code>rel</code> e <code>rev</code>.</p>
<p>Para entender a diferença entre <code>rel</code> e <code>rev</code>, tente pensar da seguinte forma: Se você diz &#8220;O documento X é uma versão alternativa do meu documento&#8221;, você deve usar <code>rel</code>; já se você disser &#8220;O meu documento é uma versão alternativa do documento X&#8221;, use <code>rev</code>.</p>
<p>Calma, vai ficar mais claro com os exemplos.</p>
<p>Vejamos alguns:</p>
<h5>Documentos adjascentes e índices</h5>
<p>Imagine um livro online. Você está escrevendo o documento que tem o conteúdo do capítulo 2. É interessante criar LINKs para o capítulo anterior, o próximo capítulo e o índice do livro. Esses LINKs podem ser usados, por exemplo, pelo browser, que pode fazer um pré-carregamento destas páginas enquanto estiver parado. Existe uma extensão para o Firefox que expõe, na barra de status, os LINKs presentes no documento. Chama-se <a href="https://addons.mozilla.org/firefox/2933/">Link Widgets</a>.</p>
<p>Exemplos:</p>
<p><code>&lt;link rel="Next" href="/capitulo-2"&gt;<br/>&lt;link rel=&#8221;Previous&#8221; href=&#8221;/capitulo-1&#8243;<br/>&lt;link rel=&#8221;Index&#8221; href=&#8221;/&#8221;&gt;</code></p>
<p>Pense: &#8220;O capítulo 2 é o próximo capítulo em relação a mim, que sou o capítulo 1&#8243;. <code>rel</code> na cabeça. Também seria certo, por exemplo:</p>
<p><code>&lt;link rev="Previous" href="capitulo-2"&gt;</code></p>
<p>Ou seja: &#8220;Eu sou o capítulo anterior ao capítulo 2&#8243;. Pescou?</p>
<h5>Versões alternativas</h5>
<p>O tipo mais comum de versão alternativa são os <a href="http:///assinar/">feeds RSS e ATOM</a>.</p>
<p><code>&lt;link rel="alternate" type="application/rss+xml" href="/feed"&gt;</code></p>
<p>Note o atributo <code>type</code>. Ele descreve o tipo do documento que estamos referenciando. No caso, um feed RSS. Caso não seja declarado, entende-se que seja do mesmo tipo que o documento onde se encontra o link, no caso, text/html.</p>
<p>Além de feeds, podemos ter outros tipos de versões alternativas. Um PDF, por exemplo:</p>
<p>&lt;<code>link rel="alternate" type="application/pdf" media="print" href="arquivo.pdf"&gt;</code></p>
<p>Aqui entra em cena o atributo <code>media</code>, que define que este documento só fará sentido como uma versão alternativa, caso esta mídia esteja sendo usada. No nosso caso, print, ou seja, impressão.</p>
<h5>Folhas de estilos CSS</h5>
<p>Podemos usar o elemento LINK para aplicar uma folha de estilos CSS a um documento HTML. Exemplo:</p>
<p><code>&lt;link rel="stylesheet" type="text/css" href="estilo.css" media="screen"&gt;</code></p>
<p>Este link diz que o documento referenciado é uma folha de estilos para o nosso documento, do tipo <code>text/css</code> e que deve ser aplicado apenas quando a media <em lang="en" xml:lang="en">screen</em> (ou seja, tela) esteja sendo usada.</p>
<p>Bem, o artigo já está longo demais. Vamos deixar o restante dos elementos do HEAD para amanhã. Até lá.</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=0hhZAm8w"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=kZsdAx8v"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=9tJWHNcK"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=9tJWHNcK" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=Y1WFDIrJ"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=zhWmt57d"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=2AdBykZs"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=9cTbEX81"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=fsJDI07l"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/o7jnE4_dYZo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-2-html-e-head/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-2-html-e-head</feedburner:origLink></item>
		<item>
		<title>HTML - Esqueleto de um documento HTML - Parte 1: DOCTYPE</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/0WUMCR-b8d4/html-esqueleto-de-um-documento-html-parte-1-doctype</link>
		<comments>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-1-doctype#comments</comments>
		<pubDate>Fri, 27 Oct 2006 17:09:06 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/arquivo/html-esqueleto-de-um-documento-html-parte-1-doctype</guid>
		<description><![CDATA[Ontem vimos uma introdução ao HTML. Sim, eu sei, foi chata. Mas não tinha muito jeito, era necessário apresentar alguns conceitos àqueles que estão realmente começando a estudar HTML.
Hoje, pra começar a ficar um pouco mais interessante, vamos colocar a mão na massa. Vamos ver como é a base de um documento HTML e entender [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem vimos uma introdução ao HTML. Sim, eu sei, foi chata. Mas não tinha muito jeito, era necessário apresentar alguns conceitos àqueles que estão realmente começando a estudar HTML.</p>
<p>Hoje, pra começar a ficar um pouco mais interessante, vamos colocar a mão na massa. Vamos ver como é a base de um documento HTML e entender como funciona e pra que serve cada uma de suas partes.</p>
<p>Pra começar, um documento de exemplo:</p>
<p><code>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"<br/>&#8220;http://www.w3.org/TR/html4/strict.dtd&#8221;&gt;<br/>&lt;html lang=&#8221;pt-br&#8221;&gt;<br/>&lt;head&gt;<br/>&lt;meta http-equiv=&#8221;content-type&#8221; content=&#8221;text/html; charset=utf-8&#8243;&gt;<br/>&lt;title&gt;Título da minha página&lt;/title&gt;<br/>&lt;link rel=&#8221;stylesheet&#8221; href=&#8221;/c/style.css&#8221; type=&#8221;text/css&#8221; media=&#8221;screen, projection&#8221;&gt;<br/>&lt;/head&gt;<br/>&lt;body&gt;<br/>&lt;div id=&#8221;conteudo&#8221;&gt;<br/>&lt;/div&gt;<br/>&lt;/body&gt;<br/>&lt;/html&gt;</code></p>
<p>Isso que vocês vêem aí em cima é nada mais nada menos que um documento HTML.</p>
<p>Vamos entender o que está descrito ali em cima e pra que serve cada um desses códigos malucos.</p>
<p>Bem, eu sei que disse que isso ia começar a ficar interessante. Não era totalmente verdade. Neste post vamos falar sobre a primeira linha do nosso documento de exemplo. A declaração de DOCTYPE. Pode ser um pouquinho chato, mas, acreditem, é muito importante. Vamos a ele.</p>
<h3>DOCTYPE</h3>
<p>A primeira linha de todo documento HTML deve ter uma declaração de DOCTYPE. Nunca se esqueçam, sempre na primeira linha, explico porque depois.</p>
<p>O DOCTYPE é uma referência a um DTD, que significa <em lang="en" xml:lang="en">Document Type Definition</em> (em português, Definição de Tipo de Documento). Um DTD é um documento onde estão definidas as regras para a criação de um documento HTML (existem DTDs pra outros tipos de documento, mas vamos manter o foco). Nele estão descritos os elementos que podem ser usados, quais elementos podem estar dentro de outros elementos, que tags descrevem esses elementos, se um elemento tem conteúdo ou não, se é necessário ter tag de abertura e/ou de fechamento. Enfim, tudo que pode ou não ser usado dentro do nosso documento.</p>
<p>Mais a frente vamos ver como ler e entender um DTD, por enquanto vamos nos ater ao DOCTYPE do nosso documento apenas.</p>
<p>Uma declaração de DOCTYPE é dividida em duas partes, um identificador público (<em lang="en" xml:lang="en">public identifier</em>) e uma URI.</p>
<p>O identificador público diz que tipo de documento está sendo usado:</p>
<p><code>-//W3C//DTD HTML 4.01//EN</code></p>
<p>Este é o identificador público do HTML 4.01 Sctrict, que é o que vamos usar daqui pra frente, em todos os nossos exemplos.</p>
<p>A URI aponta para o endereço do DTD na web:</p>
<p><code>http://www.w3.org/TR/html4/strict.dtd</code></p>
<p>Note que no exemplo acima, nosso DOCTYPE está dividido em duas linhas. Se você preferir, pode usar uma linha apenas, mas tome o cuidado de incluir um espaço entre o identificador público e a URI.</p>
<p>É extremamente importante identificar o DOCTYPE em todos os seus documentos HTML. Caso contrário, seu browser pode interpretar seu documento de maneira estranha, causando problemas que seriam facilmente evitados caso o DOCTYPE estivesse presente.</p>
<p>Um browser, ao encontrar a declaração de DOCTYPE <strong>não vai ler o documento referenciado em sua URI</strong> e interpretar o HTML de acordo com ele. Porém, ele vai se basear no identificador público e na presença ou não de uma URI para <strong>decidir como interpretar o documento</strong>. Na verdade, isso vai influir na maneira como estilos CSS são aplicados ao documento HTML.</p>
<p>Em geral, os browsers têm duas formas de interpretar um documento: <em lang="en" xml:lang="en">Strict Mode</em>, ou <em lang="en" xml:lang="en">Standards Compliance Mode</em>, onde as especificações são seguidas à risca e <em>Quirks mode</em> (Modo de compatibilidade), onde o browser vai deixar passar alguns erros, interpretando o documento mais ou menos como versões mais antigas de browser o fariam. Vamos estudar com calma estes modos de interpretação (além de um outro, usado pelo Mozilla) mais a frente.</p>
<h3>Strict, Transitional ou Frameset</h3>
<p>Existem três tipos de DOCTYPEs que podemos usar em nossos documentos HTML. Strict, Transitional e Frameset. Qual a diferença entre eles e qual devemos usar?</p>
<p>O DOCTYPE Transitional é, como o nome diz, uma transição entre versões mais antigas do HTML e a versão mais nova, 4.01. Nele temos alguns elementos e atributos que definem apenas apresentação e não semântica (Leia meu texto sobre <a href="http://obasicodaweb.com/arquivo/padroes-web-desenvolvimento-em-camadas">desenvolvimento em camadas</a>) e devem, a rigor, ser eliminados de nossos documentos. Além disso, um DOCTYPE HTML 4.01 Transitional faz com que a maioria dos browsers <strong>trabalhe em modo de compatibilidade</strong>, o que não é nada desejável. Portanto, o DOCTYPE Transitional deve ser evitado a todo custo. <strong>Não use nunca</strong>.</p>
<p>Já o DOCTYPE Strict é uma evolução do Transitional, que elimina todos esses elementos e atributos meramente de apresentação e deixa apenas os elementos que realmente carregam consigo algum significado específico. Este é o DOCTYPE que <strong>devemos usar, sempre</strong>.</p>
<p>O Frameset serve apenas para o caso de você precisar usar frames nos seus documentos. Mas você não quer fazer isso, né? Se quiser, depois vou te dar alguns <strong>bons motivos pra tirar essa idéia da cabeça</strong>.</p>
<p><br/></p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=xhuHkPMj"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=r7gYyes4"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=0jPRZVSY"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=0jPRZVSY" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=h6VdhZlJ"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=hfPAFBUz"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=7c9GcfQX"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=T0sJHUCH"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=d9sZDx7S"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/0WUMCR-b8d4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-1-doctype/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/html-esqueleto-de-um-documento-html-parte-1-doctype</feedburner:origLink></item>
		<item>
		<title>HTML - Introdução</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/vjQlQqyZmAc/html-introducao</link>
		<comments>http://www.obasicodaweb.com/html-introducao#comments</comments>
		<pubDate>Fri, 27 Oct 2006 04:40:11 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/arquivo/html-introducao</guid>
		<description><![CDATA[Comecei esse blog falando de HTTP, que é o que há de mais básico na web e que deveria correr naturalmente nas veias de todos que trabalham de alguma maneira com web. Estive pensando se deveria criar mais posts sobre o assunto, aprofundar um pouco, mas acho que ainda não é a hora.
É hora de [...]]]></description>
			<content:encoded><![CDATA[<p>Comecei esse blog falando de HTTP, que é o que há de mais básico na web e que deveria correr naturalmente nas veias de todos que trabalham de alguma maneira com web. Estive pensando se deveria criar mais posts sobre o assunto, aprofundar um pouco, mas acho que ainda não é a hora.</p>
<p>É hora de falar de outra tecnologia que também tem precisa estar, entre um glóbulo vermelho e outro, em grande quantidade, na nossa corrente sangüínea.</p>
<p>Como sempre, vamos começar do começo. E, é claro, vamos por partes.</p>
<p>HTML é uma linguagem de marcação de texto. Mais especificamente, uma linguagem de marcação de hipertexto. Portanto, antes de começar a falar de HTML, vamos entender o que vem a ser uma linguagem de marcação.</p>
<h3>Linguagens de marcação</h3>
<p>Linguagens de marcação (<em lang="en" xml:lang="en">markup languages</em> em inglês), são linguagens que combinam texto com informações extras sobre o texto. Essa informação extra pode ser representada por diversos símbolos ou palavras-chave diferentes, dependendo da linguagem de marcação com que estivermos trabalhando.</p>
<p>No caso do HTML &#8212; e de outras linguagens da mesma classe, que são linguagens de marcação descritiva &#8212; a informação extra é representada pelo que chamamos de <strong>tags</strong>. Falaremos mais de tags daqui a pouco.</p>
<p>O importante é saber que essa informação extra (que vamos chamar daqui pra frente apenas de tags, por praticidade) serve para <strong>descrever</strong> ou <strong>dar significado</strong> à parte do texto que estiver marcada com ela. A isso chamamos <strong>semântica</strong>, que podemos dizer que é o conceito chave que precisamos absorver para entender de fato o funcionamento de uma linguagem de marcação.</p>
<p>Resumindo, uma linguagem de marcação descritiva de texto serve pura e simplesmente para dar significado especial a determinadas partes desse texto. Isso vai ficar mais claro mais a frente, acreditem em mim. Não mudem de canal, crianças.</p>
<h3>SGML</h3>
<p>SGML significa <em lang="en" xml:lang="en">Standard Generalized Markup Language</em> (Linguagem Padrão de Marcações Genéricas, em português) e podemos dizer que é a linguagem-mãe do HTML (e também do XML e de outras linguagens, como DocBook, por exemplo).</p>
<p><br/>A SGML é o que podemos chamar de uma meta-linguagem, ou seja, uma linguagem destinada a criar outras linguagens. Não vamos nos aprofundar em SGML, não é o nosso foco. Apenas é importante saber que as regras que se aplicam ao HTML são derivadas da SGML. Inclusive o conceito de <strong>tags</strong> para descrever semanticamente o papel de determinado conteúdo dentro de um documento.</p>
<h3>Tags</h3>
<p>Podemos dizer, grosso modo, que tags são delimitadores de texto, que informam ao interpretador (um browser, por exemplo) como esse texto deve ser entendido.</p>
<p>A anatomia de uma tag é bem simples. Uma palavra (ou apenas uma letra) delimitada pelos caracteres &#8216;&lt;&#8217; e &#8216;&gt;&#8217;.</p>
<p>Por exemplo, &lt;p&gt; é a tag usada para descrever parágrafos em HTML. &lt;p&gt; é uma <strong>tag</strong>.</p>
<p>Existem dois tipos de tag: de abertura e de fechamento. A tag de abertura deve vir imediatamente antes do texto a ser marcado e a tag de fechamento, imediatamente depois. A única diferença entre uma tag de abertura e uma de fechamento é que a de fechamento tem uma &#8216;/&#8217; antes da letra ou palavra. Exemplo: a tag de fechamento de um parágrafo é &lt;/p&gt;</p>
<p>Então, um parágrafo em HTML seria assim:</p>
<p><code>&lt;p&gt;Este é um parágrafo.&lt;/p&gt;</code></p>
<p>Além do nome da tag (o &#8216;p&#8217;) e dos caracteres &#8216;&lt;&#8217;, &#8216;&gt;&#8217; e &#8216;/&#8217;, uma tag pode conter <strong>atributos</strong>.</p>
<p>Um atributo é um modificador, ou melhor, uma informação a mais sobre a tag. Atributos são definidos por uma palavra-chave, um sinal de igual (&#8217;=') e um valor, entre aspas duplas ou simples.</p>
<p>Exemplo:</p>
<p><code>&lt;p class="text"&gt;Este é um parágrafo com classe.&lt;/p&gt;</code></p>
<p>Atributos podem ter valores pré-definidos ou valores livres. Ao longo dos posts vamos ver exemplos de ambos os casos e entender melhor como cada atributo funciona.</p>
<p>HTML, como qualquer linguagem baseada em SGML (excluindo o XML, que é uma meta-linguagem baseada no SGML, falamos disso um outro dia), tem a característica de ser simples para o desenvolvedor e complexa para o interpretador. Isso se deve a diversos fatores. Mas isso fica pra depois, nessa mesma hora, nesse mesmo canal.</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=Id3o7Jd2"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=zwkr5Sjr"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=NmwkppsI"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=NmwkppsI" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=WylMC488"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=F2BZJsy2"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=WiI2AIAe"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=ToO3iKiM"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=pRCIBhFu"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/vjQlQqyZmAc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/html-introducao/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/html-introducao</feedburner:origLink></item>
		<item>
		<title>Menu com imagens e rollover - Exemplo de HTML e CSS</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/bOgdjfJgZjc/menu-imagens-rollover-exemplo</link>
		<comments>http://www.obasicodaweb.com/menu-imagens-rollover-exemplo#comments</comments>
		<pubDate>Mon, 04 Sep 2006 05:54:06 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/arquivo/menu-imagens-rollover-exemplo</guid>
		<description><![CDATA[Voltando à ativa depois de tanto tempo de inatividade, quero mostrar a vocês um exemplo comum de uso das camadas de conteúdo e apresentação. Um menu com imagens e rollover, mais acessível do que o normal e não muito complicado de se fazer.
O conceito é bastante simples: um DIV contendo uma lista não ordenada (UL), [...]]]></description>
			<content:encoded><![CDATA[<p>Voltando à ativa depois de tanto tempo de inatividade, quero mostrar a vocês um exemplo comum de uso das camadas de conteúdo e apresentação. Um menu com imagens e rollover, mais acessível do que o normal e não muito complicado de se fazer.</p>
<p>O conceito é bastante simples: um DIV contendo uma lista não ordenada (UL), cujos itens são posicionados de maneira absoluta, funcionando mais ou menos como um mapa de imagens (MAP). O rollover é obtido mudando o posicionamento da imagem de fundo. No final, vou mostrar algumas modificações que podem ser usadas para tornar o menu mais acessível.</p>
<p>Vamos começar do começo, como sempre:</p>
<h3>Código HTML básico</h3>
<pre>
<code>
&lt;div id="menu"&gt;
&#160;&#160;&lt;ul&gt;
&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;Início&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;Artigos&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;Contato&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&lt;/ul&gt;
&lt;/div&gt;
</code>
</pre>
<p>O código acima é praticamente tudo que vamos precisar ter na camada de conteúdo. Bem simples, como deve ser. Veja o <a href="/exemplos/menu-rollover/exemplo1.html">exemplo 1</a>.</p>
<h3>Posicionando o que tem que ser posicionado</h3>
<pre>
<code>
&#160;&#160;&lt;style type="text/css"&gt;
&#160;&#160;&#160;&#160;#menu{ position:relative; width:186px; height:35px; }
&#160;&#160;&#160;&#160;#menu ul{ list-style:none; }
&#160;&#160;&#160;&#160;#menu li{
&#160;&#160;&#160;&#160;&#160;&#160;position:absolute;
&#160;&#160;&#160;&#160;&#160;&#160;top:0;
&#160;&#160;&#160;&#160;&#160;&#160;height:35px;
&#160;&#160;&#160;&#160;&#160;&#160;border:1px solid;
&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;#menu li a{
&#160;&#160;&#160;&#160;&#160;&#160;display:block;
&#160;&#160;&#160;&#160;&#160;&#160;width:100%;
&#160;&#160;&#160;&#160;&#160;&#160;height:100%;
&#160;&#160;&#160;&#160;&#160;&#160;top:0;
&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;#um{ width:53px; left:0; }
&#160;&#160;&#160;&#160;#dois{ width:61px; left:53px; }
&#160;&#160;&#160;&#160;#tres{ width:72px; left:114px; }
&#160;&#160;&lt;/style&gt;

&lt;div id=&#8221;menu&#8221;&gt;
&#160;&#160;&lt;ul&gt;
&#160;&#160;&#160;&#160;&lt;li id=&#8221;um&#8221;&gt;&lt;a href=&#8221;#&#8221;&gt;Início&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;li id=&#8221;dois&#8221;&gt;&lt;a href=&#8221;#&#8221;&gt;Artigos&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;li id=&#8221;tres&#8221;&gt;&lt;a href=&#8221;#&#8221;&gt;Contato&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&lt;/ul&gt;
&lt;/div&gt;
</code>
</pre>
<p>Adicionamos um ID para cada item da lista, para que suas posições e larguras possam ser definidos separadamente.</p>
<p>O DIV <strong>menu</strong> precisa ter posicionamento relativo, para &#8220;conter&#8221; seus filhos, que serão posicionados de maneira absoluta. (leia meu <a href="http://brunotorres.net/2005/09/27/posicionamento-com-css">artigo sobre posicionamento com CSS</a>)</p>
<p>Note que cada LI tem uma largura (width) e uma posição horizontal (left) diferentes. O cálculo é simples: o valor de <em>left</em> é sempre a largura do LI anterior somado ao valor de <em>left</em> deste.</p>
<p>Usamos uma borda apenas para ilustrar. Veja o resultado no <a href="/exemplos/menu-rollover/exemplo2.html">exemplo 2</a>.</p>
<h3>Adicionando uma imagem de fundo</h3>
<p>A imagem de fundo deve ser o menu inteiro. Algo mais ou menos como a imagem abaixo:</p>
<p><img src="/exemplos/menu-rollover/img1.gif" alt="Imagem usada para ser o fundo do menu"></p>
<p>Esta imagem vai ser aplicada como fundo do DIV <strong>menu</strong>. E esta é a única mudança com relação ao exemplo anterior:</p>
<pre>
<code>
#menu{
&#160;&#160;position:relative;
&#160;&#160;width:186px;
&#160;&#160;height:35px;
&#160;&#160;<strong>background:url(img1.gif) no-repeat 0 0;</strong>
}
</code>
</pre>
<p>Veja o resultado no <a href="/exemplos/menu-rollover/exemplo3.html">exemplo 3</a>. Note que o texto está por cima da imagem. Vamos resolver isso.</p>
<h3>Escondendo o texto</h3>
<p>A forma mais simples de esconder o texto é usando a propriedade CSS <em>text-indent</em> com um valor negativo muito alto. Vamos usar <strong>-9999em</strong>. Isso faz com que o texto seja levado para a esquerda e fique fora do espaço visível.</p>
<p>Esta técnica tem sido muito usada para efeitos de <em><span lang="en">image replacement</span></em>, que é como chamamos os métodos usados para substituir texto por imagens, usando CSS.</p>
<p>Este método, usando text-indent negativo, é efetivo, porém tem o problema de não exibir conteúdo algum caso o browser tenha suporte a CSS ligado e suporte a imagens desligado. Esta é uma situação bem difícil de acontecer, mas nem por isso devemos deixar de nos preocupar. Vamos achar uma maneira de resolver este problema no último passo do tutorial.</p>
<p>O que muda no código:</p>
<pre>
<code>
#menu ul{
&#160;&#160;list-style:none;
&#160;&#160;text-indent:-9999em;
}
#menu li a{
&#160;&#160;display:block;
&#160;&#160;text-decoration:none;
&#160;&#160;width:100%;
&#160;&#160;height:100%;
&#160;&#160;top:0;
}
</code>
</pre>
<p>O text-indent negativo foi aplicado ao UL e colocamos um <code>text-decoration:none</code> no A, para evitar que apareça uma linha azul estranhíssima em algumas versões do IE.</p>
<p>Veja o resultado no <a href="/exemplos/menu-rollover/exemplo4.html">exemplo 4</a>.</p>
<h3>Adicionando o efeito de <span lang="en">rollover</span></h3>
<p>Para obter o efeito de rollover (ou seja, alguma mudança ao se passar o mouse sobre o elemento), vamos mudar a imagem usada como fundo. Apenas duplicamos a imagem e mudamos alguma coisa em cada um do itens. Neste caso, mudei a cor do texto. Veja:</p>
<p><img src="/exemplos/menu-rollover/img2.gif" alt="Imagem preparada para o efeito de rollover"></p>
<p>Mesmo a imagem tendo o dobro da altura da anterior, apenas a parte superior vai aparecer, já que nosso DIV tem uma altura fixa, em pixels.</p>
<p>Para o rollover, vamos usar a pseudo-classe <em>:hover</em> do A, e aplicar a imagem acima como fundo deste elemento, porém em posições diferentes para cada um deles. Veja:</p>
<pre>
<code>
#um a:hover{
&#160;&#160;background:url(img2.gif) no-repeat 0 -35px;
}
#dois a:hover{
&#160;&#160;background:url(img2.gif) no-repeat -53px -35px;
}
#tres a:hover{
&#160;&#160;background:url(img2.gif) no-repeat -114px -35px;
}
</code>
</pre>
<p>O primeiro valor é a posição da imagem na horizontal (left) e o segundo, na vertical (top). Percebam que o primeiro valor é sempre igual ao <em>left</em> do LI que contém o A. Veja o <a href="/exemplos/menu-rollover/exemplo5.html">exemplo 5</a>.</p>
<h3>Um pouco mais de acessibilidade</h3>
<p>Lembra do que falei, lá em cima, sobre nada ser exibido caso tenhamos CSS habilitado e imagens desabilitadas? Pois bem, há uma solução. Mas, claro, não é de graça. Vamos ter que adicionar alguma coisa ao nosso código HTML.</p>
<pre>
<code>
&lt;div id="menu"&gt;
&#160;&#160;&lt;ul&gt;
&#160;&#160;&#160;&#160;&lt;li id=&#8221;um&#8221;&gt;&lt;a href=&#8221;#&#8221;&gt;&lt;span&gt;&lt;/span&gt;Início&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;li id=&#8221;dois&#8221;&gt;&lt;a href=&#8221;#&#8221;&gt;&lt;span&gt;&lt;/span&gt;Artigos&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;li id=&#8221;tres&#8221;&gt;&lt;a href=&#8221;#&#8221;&gt;&lt;span&gt;&lt;/span&gt;Contato&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&lt;/ul&gt;
&lt;/div&gt;
</code>
</pre>
<p>Colocamos um SPAN vazio dentro de cada A. Alguns podem achar isso um pouco &#8220;sujo&#8221; e, na verdade, não deixa de ser. Porém, não perdemos nada de substancial com o uso destes elementos vazios, e vamos, no entanto, ganhar um pouco em termos de <a href="http://acessodigital.net/">acessibilidade</a>. Na minha opinião, vale a pena. Você decide se vale ou não para você.</p>
<p>Os referidos SPANs vão ser declarados como elementos de bloco e posicionados de maneira absoluta, de modo que fiquem &#8220;por cima&#8221; de seus pais (A). Vamos colocar uma imagem de fundo para cada SPAN (o mesmo valor usado nos <em>:hover</em>s, mas com posição vertical 0 ao invés de -35px). Veja:</p>
<pre>
<code>
#menu li a span{
&#160;&#160;display:block;
&#160;&#160;position:absolute;
&#160;&#160;width:100%;
&#160;&#160;height:100%;
&#160;&#160;top:0;
&#160;&#160;cursor:pointer;
}
#um a span{
&#160;&#160;background:url(img2.gif) no-repeat 0 0;
}
#dois a span{
&#160;&#160;background:url(img2.gif) no-repeat -53px 0;
}
#tres a span{
&#160;&#160;background:url(img2.gif) no-repeat -114px 0;
}
</code>
</pre>
<p>Percebam que tive que usar <em>cursor:pointer</em> para que o cursor padrão de ponteiro (aquela &#8220;mãozinha&#8221; que aparece quando você passa o mouse sobre um link) apareça no Internet Explorer.</p>
<p>Vejam o <a href="/exemplos/menu-rollover/exemplo6.html">exemplo 6</a>.</p>
<h3>Rollover de novo</h3>
<p>Vamos adicionar o efeito de rollover a esse nosso novo código.</p>
<pre>
<code>
#um a:hover span{
&#160;&#160;background:url(img2.gif) no-repeat 0 -35px;
}
#dois a:hover span{
&#160;&#160;background:url(img2.gif) no-repeat -53px -35px;
}
#tres a:hover span{
&#160;&#160;background:url(img2.gif) no-repeat -114px -35px;
}
</code>
</pre>
<p>Se você acompanhou bem até aqui, acho que não preciso explicar, né? Vejam o <a href="/exemplos/menu-rollover/exemplo7.html">exemplo 7</a>.</p>
<h3>Consertando o rollover no IE</h3>
<p>Os mais atentos com certeza notaram que ocorre um problema com o exemplo acima no Internet Explorer. Quando você passa o mouse sobre um link, ele muda de cor, mas não volta à cor original quando o cursor é movido para fora do elemento. Não me perguntem por que isso acontece, não faço a mínima idéia.</p>
<p>Passei alguns minutos tentando achar uma solução, e achei!</p>
<p>Por algum motivo, se colocarmos o z-index (que é o posicionamento no eixo Z, ou seja, serve para colocar um elemento &#8220;por cima&#8221; de outro) do a:hover para um valor alto (vou usar 1000, que é o valor máximo), tudo passa a funcionar perfeitamente no IE, e continua funcionando normalmente nos outros browsers.</p>
<pre>
<code>
#menu ul li a:hover{
&#160;&#160;z-index:1000;
}
</code>
</pre>
<p>Simples assim. Porém, notem que o seletor desta regra deve ser mais específico que o do <em>:hover</em>. Vou falar sobre especificidade um dia desses. Por agora, tente adicionar apenas um ID a mais no seletor (no caso #menu) e especificar cada um dos elementos, na ordem (no caso ul li). Isso vai funcionar.</p>
<p>Confira o <a href="/exemplos/menu-rollover/exemplo8.html">resultado final</a>.</p>
<p>O código foi testado e aprovado nos seguintes browsers:</p>
<ul>
<li><a href="http://getfirefox.com/">Firefox 1.5</a></li>
<li><a href="http://opera.com/">Opera 9</a></li>
<li>Internet Explorer 6</li>
<li><a href="http://getswift.org/">Swift</a> (um &#8220;<a href="http://www.apple.com/safari/">safari</a> para windows&#8221;, muito experimental ainda, portanto não posso garantir que o resultado seja o mesmo no safari do Mac OS X).</li>
</ul>
<p>Se algum de vocês puder testar em outros browsers e me dizer se funciona, agradeço. <img src='http://www.obasicodaweb.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>***</p>
<p>Espero que este exemplo seja de alguma utilidade para vocês. Dúvidas, sugestões e reclamações são muito bem vindas.</p>
<div class="feedflare">
<a href="http://feedproxy.google.com/~f/obasicodaweb?a=Q5LUBNTL"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=150" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=kAcTggyp"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=971" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=A0IhYpBP"><img src="http://feedproxy.google.com/~f/obasicodaweb?i=A0IhYpBP" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=DoCFn3cn"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=353" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=VGjg11SS"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=352" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=LbZvZVGN"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=YTig9VUK"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/obasicodaweb?a=WA8X2PSw"><img src="http://feedproxy.google.com/~f/obasicodaweb?d=957" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/obasicodaweb/~4/bOgdjfJgZjc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.obasicodaweb.com/menu-imagens-rollover-exemplo/feed</wfw:commentRss>
		<feedburner:origLink>http://www.obasicodaweb.com/menu-imagens-rollover-exemplo</feedburner:origLink></item>
		<item>
		<title>Título editável - exemplo de JavaScript/DOM</title>
		<link>http://feedproxy.google.com/~r/obasicodaweb/~3/L8tB3SO6lkU/titulo-editavel-exemplo-de-javascriptdom</link>
		<comments>http://www.obasicodaweb.com/titulo-editavel-exemplo-de-javascriptdom#comments</comments>
		<pubDate>Fri, 30 Jun 2006 10:00:34 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://obasicodaweb.com/arquivo/titulo-editavel-exemplo-de-javascriptdom</guid>
		<description><![CDATA[Vamos então aos posts com exemplos de códigos simples, mostrando o uso de uma ou mais das três camadas de desenvolvimento apresentadas nos dois posts anteriores.
Antes de começar, devo deixar claro que praticamente qualquer funcionalidade que você precise, seja em HTML, CSS ou JavaScript geralmente está a apenas uma &#8220;googlada&#8221; de distância. Se você tem [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos então aos posts com exemplos de códigos simples, mostrando o uso de uma ou mais das três camadas de desenvolvimento apresentadas nos dois posts anteriores.</p>
<p>Antes de começar, devo deixar claro que praticamente qualquer funcionalidade que você precise, seja em HTML, CSS ou JavaScript geralmente está a apenas uma &#8220;googlada&#8221; de distância. Se você tem um problema é muito provável que alguém já tenha tido o mesmo problema e a chance de que esse alguém já tenha resolvido e blogado sobre a solução também é muito grande.</p>
<p>O código feito aqui não se baseia em nenhum outro diretamente. Mas nada impede que eu use, inconscientemente (ou conscientemente, vai dizer) algo que eu já tenha visto por aí e tenha ficado registrado na caixola.</p>
<p>Vamos ao que interessa. Neste texto vamos fazer um título editável, ou seja, um título normal que, ao ser clicado se transforma em um campo de texto (INPUT) que ao perder o foco salva o novo valor e volta a ser um título novamente.</p>
<h3>Começando pelo começo</h3>
<p>A primeira coisa que precisamos é de uma página HTML com um título, no caso um H1, como pode ser visto no <a href="/exemplos/titulo-editavel/1.html">exemplo 1</a>.</p>
<pre>
<code>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&#160;&#160;&lt;meta http-equiv=&#8221;content-type&#8221; content=&#8221;text/html; charset=utf-8&#8243;&gt;
&#160;&#160;&lt;title&gt;Título editável com JavaScript&lt;/title&gt;
&#160;&#160;&lt;style type=&#8221;text/css&#8221;&gt;
&#160;&#160;&#160;&#160;h1 { 
&#160;&#160;&#160;&#160;&#160;&#160;font:normal 2.4em/1.6 georgia, &#8220;times new roman&#8221;, &#8220;bitstream vera serif&#8221;, times, serif;
&#160;&#160;&#160;&#160;&#160;&#160;color:#900;
&#160;&#160;&#160;&#160;}
&#160;&#160;&lt;/style&gt;
&#160;&#160;&lt;script type=&#8221;text/javascript&#8221;&gt;
&#160;&#160;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&#160;&#160;&lt;h1&gt;Edite este título&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code>
</pre>
<p>Um Título simples, com um toquezinho de CSS só para definir a fonte e a cor, pra não ficar tosco demais. <img src='http://www.obasicodaweb.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Note que o CSS e o JavaScript vão ser colocados dentro do próprio arquivo HTML, apenas para facilitar o estudo. No &#8220;mundo real&#8221; o ideal é colocá-los em arquivos separados.</p>
<h3>Fazendo o título parecer editável</h3>
<p>Precisamos agora dar alguma dica ao usuário de que, se clicado, o título pode ser editado.</p>
<p>Uma mudança na cor de fundo em conjunto com um texto explicativo no atributo TITLE do H1 me parecem ser suficientes. Além disso, vamos colocar um SPAN dentro do H1. Isso porque como o H1 é um elemento de bloco, ocupa por padrão 100% do espaço horizontal disponível. Para mudar isso poderíamos usar a propriedade CSS <em>float</em> ou definir uma largura específica para o H1. No caso do float, seria necessário definir a propriedade <em>clear</em> para o elemento logo abaixo do H1. Usar uma largura fixa não seria muito inteligente, pois o texto digitado pode ser maior que esse espaço. Portanto, fico com o SPAN.</p>
<p>Nesse ponto temos algo parecido com o <a href="/exemplos/titulo-editavel/2.html">exemplo 2</a>.</p>
<pre>
<code>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&#160;&#160;&lt;meta http-equiv=&#8221;content-type&#8221; content=&#8221;text/html; charset=utf-8&#8243;&gt;
&#160;&#160;&lt;title&gt;Título editável com JavaScript&lt;/title&gt;
&#160;&#160;&lt;style type=&#8221;text/css&#8221;&gt;
&#160;&#160;&#160;&#160;h1 { 
&#160;&#160;&#160;&#160;&#160;&#160;font:normal 2.4em/1.6 georgia, &#8220;times new roman&#8221;, &#8220;bitstream vera serif&#8221;, times, serif;
&#160;&#160;&#160;&#160;&#160;&#160;color:#900;
&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;h1 span:hover{
&#160;&#160;&#160;&#160;&#160;&#160;background:#f5f5f5;
&#160;&#160;&#160;&#160;}
&#160;&#160;&lt;/style&gt;
&#160;&#160;&lt;script type=&#8221;text/javascript&#8221;&gt;
&#160;&#160;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&#160;&#160;&lt;h1&gt;&lt;span title=&#8221;Clique para editar o texto&#8221;&gt;Edite este título&lt;/span&gt;&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code>
</pre>
<p>Você deve ter percebido que o exemplo 2 não funciona muito bem no Internet Explorer. Isso acontece porque o IE não tem suporte à pseudo-class <em>:hover</em> em elementos senão o A. Portanto, para obter esse efeito precisaremos de uma pitadinha de JavaScript.</p>
<p>Veja o <a href="/exemplos/titulo-editavel/3.html">exemplo 3</a>. Perceba que coloquei o código todo dentro de uma função atribuída ao evento <em>onload</em> do objeto <em>window</em>, ou seja, o script será executado assim que o documento terminar de ser carregado pelo browser. Essa não é a melhor forma de fazer as coisas, mas por agora nos serve muito bem. Mais à frente veremos formas mais interessantes de &#8220;inicializar&#8221; nossos scripts.</p>
<pre>
<code>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&#160;&#160;&lt;meta http-equiv=&#8221;content-type&#8221; content=&#8221;text/html; charset=utf-8&#8243;&gt;
&#160;&#160;&lt;title&gt;Título editável com JavaScript&lt;/title&gt;
&#160;&#160;&lt;style type=&#8221;text/css&#8221;&gt;
&#160;&#160;&#160;&#160;h1 { 
&#160;&#160;&#160;&#160;&#160;&#160;font:normal 2.4em/1.6 georgia, &#8220;times new roman&#8221;, &#8220;bitstream vera serif&#8221;, times, serif;
&#160;&#160;&#160;&#160;&#160;&#160;color:#900;
&#160;&#160;&#160;&#160;}
&#160;&#160;&lt;/style&gt;
&#160;&#160;&lt;script type=&#8221;text/javascript&#8221;&gt;
&#160;&#160;&#160;&#160;window.onload = function(){
&#160;&#160;&#160;&#160;&#160;&#160;var title = document.getElementsByTagName(&#8217;h1&#8242;)[0];
&#160;&#160;&#160;&#160;&#160;&#160;var span = title.firstChild;
&#160;&#160;&#160;&#160;&#160;&#160;span.onmouseover = function(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.title = &#8216;Clique para editar o texto&#8217;;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.style.background = &#8216;#f5f5f5&#8242;;
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;span.onmouseout = function(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.title = &#8221;;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.style.background = &#8221;;
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;}
&#160;&#160;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&#160;&#160;&lt;h1&gt;&lt;span&gt;Edite este título&lt;/span&gt;&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code>
</pre>
<p>Pense comigo. O título só será editável caso o browser tenha suporte a JavaScript, portanto é melhor que tanto a cor de fundo ao passar o mouse quanto o TITLE só existam quando o suporte estiver presente.</p>
<p>Explicando o script: na linha <code>var title = document.getElementsByTagName('h1')[0];</code> colocamos na variável <em>title</em> uma referência para o primeiro elemento definido pela tag H1 no documento.</p>
<p>Na linha seguinte, <code>var span = title.firstChild;</code> pegamos o primeiro filho (firstChild) do H1 &#8212; que, no caso, é o SPAN, e jogamos para a variável <em>span</em>.</p>
<p>Nas linhas seguintes definimos, no evento <em>onmouseover</em> do SPAN, seu título e cor de fundo e no <em>onmouseout</em> limpamos esses valores. Simples, não? Pois bem, avancemos.</p>
<h3>Criando um INPUT para edição do texto</h3>
<p>Agora precisamos que, ao clicar no título, este se transforme em um INPUT para permitir a edição do texto.</p>
<p>Para isso vamos usar o evento <em>onclick</em> do nosso SPAN, como pode ser visto no <a href="/exemplos/titulo-editavel/4.html">exemplo 4</a>.</p>
<pre>
<code>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&#160;&#160;&lt;meta http-equiv=&#8221;content-type&#8221; content=&#8221;text/html; charset=utf-8&#8243;&gt;
&#160;&#160;&lt;title&gt;Título editável com JavaScript&lt;/title&gt;
&#160;&#160;&lt;style type=&#8221;text/css&#8221;&gt;
&#160;&#160;&#160;&#160;h1 { 
&#160;&#160;&#160;&#160;&#160;&#160;font:normal 2.4em/1.6 georgia, &#8220;times new roman&#8221;, &#8220;bitstream vera serif&#8221;, times, serif;
&#160;&#160;&#160;&#160;&#160;&#160;color:#900;
&#160;&#160;&#160;&#160;}
&#160;&#160;&lt;/style&gt;
&#160;&#160;&lt;script type=&#8221;text/javascript&#8221;&gt;
&#160;&#160;&#160;&#160;window.onload = function(){
&#160;&#160;&#160;&#160;&#160;&#160;function editTitle(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var title = document.getElementsByTagName(&#8217;h1&#8242;)[0];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var span = title.firstChild;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;span.onmouseover = function(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.title = &#8216;Clique para editar o texto&#8217;;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.style.background = &#8216;#f5f5f5&#8242;;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;span.onmouseout = function(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.title = &#8221;;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.style.background = &#8221;;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;span.onclick = function(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var textoAtual = this.firstChild.nodeValue;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var input = &#8216;&lt;input type=&#8221;text&#8221; value=&#8221;&#8216;+textoAtual+&#8217;&#8221;&gt;&#8217;;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.innerHTML = input;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var field = this.firstChild;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.onclick = null;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.onmouseover = null;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;field.focus();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;field.select();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;field.onblur = function(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this.parentNode.innerHTML = this.value;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;editTitle();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;editTitle();
&#160;&#160;&#160;&#160;}
&#160;&#160;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&#160;&#160;&lt;h1&gt;&lt;span&gt;Edite este título&lt;/span&gt;&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code>
</pre>
<p>Note que o código dessa vez foi colocado dentro de uma função, <em>editTitle()</em> que é chamada logo após a sua definição. Já ex