<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2974713680059630781</id><updated>2011-12-21T10:26:23.392-08:00</updated><title type='text'>Software By Developer</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-4454858998868832260</id><published>2011-12-21T10:02:00.000-08:00</published><updated>2011-12-21T10:26:23.404-08:00</updated><title type='text'></title><content type='html'>Hoje após duas horas desesperantes, descobri a solução para o problema do scrollTop no IE8, quando é usado dentro de um 'SELECT'.&lt;br /&gt;&lt;br /&gt;Basicamente, no IE8 quando se adiciona um elemento 'OPTION', via Javascript a um 'SELECT' que seja do tipo 'multiple' (nota: estou a usar um 'size' de 10), não posiciona a scroll bar, de forma a mostrar o elemento 'OPTION' que foi inserido (já pré-selecionado).&lt;br /&gt;&lt;br /&gt;Isto tem o inconveniente de o utilizador não se aperceber que o elemento foi realmente adicionado, se a combo não estiver na posição ideal.&lt;br /&gt;&lt;br /&gt;Note-se que estou a inserir os elementos ordenados alfabeticamente, logo a inserção poderá ocorrer em qualquer posição, dependendo dos elementos já existentes e do elemento inserido.&lt;br /&gt;&lt;br /&gt;Para corrigir este problema de usabilidade, defini o seguinte código após ter efectuado a inserção no 'SELECT', dentro de um objecto JS que o contém:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;   // we have to do this, in order for IE8 to correctly scroll to the added element&lt;br /&gt;   if( option.selected)&lt;br /&gt;   {&lt;br /&gt;      var topScroll = 0;&lt;br /&gt;      if( this.select.length )&lt;br /&gt;         topScroll = index * (this.select.scrollHeight / this.select.length );&lt;br /&gt;&lt;br /&gt;      this.select.scrollTop = topScroll; // &amp;lt;=- linha problemática&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;No entanto, após fazer debug da coisa, a 'linha problemática' aparentemente não executa !!!&lt;br /&gt;Isto é, mesmo que o valor topScroll seja diferente de zero, o campo 'this.select.scrollTop' fica intocado.&lt;br /&gt;É como se a instrução nunca tivesse sido executada !!!&lt;br /&gt;&lt;br /&gt;Após perder umas centenas de neurónios, reparei que se eu forçar o valor no debugger a correcção funcionava !&lt;br /&gt;&lt;br /&gt;Após mais algumas tentativas, para perceber o problema, cheguei ao momento Eureka!&lt;br /&gt;&lt;br /&gt;O IE8, pega de empurrão!&lt;br /&gt;&lt;br /&gt;Isto é a solução é insistir à canzana ! :)&lt;br /&gt;Ou seja, repetir a instrução de atribuição !&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;   // we have to do this, in order for IE8 to correctly scroll to the added element&lt;br /&gt;   if( option.selected)&lt;br /&gt;   {&lt;br /&gt;      var topScroll = 0;&lt;br /&gt;      if( this.select.length )&lt;br /&gt;         topScroll = index * (this.select.scrollHeight / this.select.length );&lt;br /&gt;&lt;br /&gt;      this.select.scrollTop = topScroll;&lt;br /&gt;      this.select.scrollTop = topScroll; // WE MUST DUPLICATE THIS LINE, due to an IE8 Bug !&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Incrível, mas é verdade ! E assim já funciona como esperado e é inócuo para os outros browsers, como seria de esperar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-4454858998868832260?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/4454858998868832260/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=4454858998868832260' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/4454858998868832260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/4454858998868832260'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2011/12/hoje-apos-duas-horas-desesperantes.html' title=''/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-7333198052351110649</id><published>2011-09-22T08:44:00.000-07:00</published><updated>2011-09-22T08:47:36.696-07:00</updated><title type='text'>Java decompiler para o Eclipse</title><content type='html'>O &lt;a href="http://java.decompiler.free.fr/?q=jdeclipse"&gt;Eclipse Java Decompiler&lt;/a&gt; pode dar jeito, quando ao meio do debug, nos deparamos com uma classe de uma lib (jar) qualquer, da qual não temos a source disponível. &lt;br /&gt;Permite fazer o decompile da class enquanto fazemos debug, para determinar a fonte do problema.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-7333198052351110649?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/7333198052351110649/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=7333198052351110649' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/7333198052351110649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/7333198052351110649'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2011/09/java-decompiler-para-o-eclipse.html' title='Java decompiler para o Eclipse'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-2021113125919459104</id><published>2011-08-09T10:30:00.000-07:00</published><updated>2011-08-09T10:55:02.817-07:00</updated><title type='text'>IE8 Document Mode é Sticky !</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-Fyd2V75AfNo/TkFw8fooHqI/AAAAAAAAAZI/BRUM-8-iscM/s1600/wheat-version.jpg"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 187px; height: 200px;" src="http://1.bp.blogspot.com/-Fyd2V75AfNo/TkFw8fooHqI/AAAAAAAAAZI/BRUM-8-iscM/s200/wheat-version.jpg" alt="" id="BLOGGER_PHOTO_ID_5638912393030934178" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-2s_vcBPTj3A/TkFwwZNQoEI/AAAAAAAAAZA/cAURMHE2Xns/s1600/localhost-version.jpg"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 187px; height: 200px;" src="http://1.bp.blogspot.com/-2s_vcBPTj3A/TkFwwZNQoEI/AAAAAAAAAZA/cAURMHE2Xns/s200/localhost-version.jpg" alt="" id="BLOGGER_PHOTO_ID_5638912185147105346" border="0" /&gt;&lt;/a&gt;Mais uma "feature" do IE8!&lt;br /&gt;Se tivermos uma página simples, que abrimos em dois &lt;span style="font-style: italic;"&gt;tabs&lt;/span&gt;, mas no primeiro &lt;span style="font-style: italic;"&gt;tab&lt;/span&gt; definimos o URL como 'localhost' e o outro &lt;span style="font-style: italic;"&gt;tab&lt;/span&gt; com o URL com o nome da máquina propriamente dito ("wheat", no exemplo).&lt;br /&gt;&lt;br /&gt;Vamos constatar que o IE8, vai fazer o '&lt;span style="font-style: italic;"&gt;render&lt;/span&gt;' da página com &lt;span style="font-style: italic;"&gt;margin&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;offset&lt;/span&gt; distintos, para a tag BODY.&lt;br /&gt;&lt;br /&gt;A página está definida com o seguinte DOCTYPE:&lt;br /&gt;&amp;lt;!-- DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" --&amp;gt;&lt;br /&gt;&lt;br /&gt;Após mais alguns testes, acabei por descobrir que o problema não era do URL, mas sim devido ao facto de ter reutilizado um &lt;span style="font-style: italic;"&gt;tab&lt;/span&gt; (alterando o seu URL), que conteve anteriormente uma página que forçou o modo de compatibilidade 'IE7' no IE8, com o seguinte meta dado no &lt;span style="font-style: italic;"&gt;head&lt;/span&gt; !&lt;br /&gt;&lt;br /&gt;&amp;lt;meta http-equiv="X-UA-Compatible" content="IE=8"/&amp;gt;&lt;br /&gt;&lt;br /&gt;Resumindo e concluindo, o modo de compatibilidade aparentemente é uma propriedade do &lt;span style="font-style: italic;"&gt;tab&lt;/span&gt;, e que não muda com a alteração do endereço (URL), como devia.&lt;br /&gt;&lt;br /&gt;Isto implica que uma página que faça um render correcto, seguindo os standards, pode ficar completamente desfigurada no IE, se o &lt;span style="font-style: italic;"&gt;tab&lt;/span&gt; tiver sido usado para aceder a outra página previamente, que tenha forçado o modo de compatibilidade do IE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-2021113125919459104?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/2021113125919459104/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=2021113125919459104' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/2021113125919459104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/2021113125919459104'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2011/08/ie8-document-mode-e-sticky.html' title='IE8 Document Mode é Sticky !'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Fyd2V75AfNo/TkFw8fooHqI/AAAAAAAAAZI/BRUM-8-iscM/s72-c/wheat-version.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-74830341322923154</id><published>2011-07-22T02:25:00.000-07:00</published><updated>2011-07-22T03:10:43.233-07:00</updated><title type='text'>IE8 não gera evento form submit, em certas condições</title><content type='html'>Ultimamente, tenho andado a dançar o fandango com o IE8, ao fazer um 'port' de uma aplicação IE6 para IE8.&lt;br /&gt;&lt;br /&gt;Infelizmente os bugs são mais que muitos: &lt;a href="http://jhop.me/ie8-bugs"&gt;James Hopkins IE8 Bugs &lt;/a&gt; e &lt;a href="http://www.gtalbot.org/BrowserBugsSection/MSIE8Bugs/"&gt;Gérald Talbot's IE8 Bugs&lt;/a&gt; chegam para ter uma ideia dos problemas que se tem pela frente, já para não falar nos modos de (in)compatibilidade, que o bicho trás para o IE7.&lt;br /&gt;Estranho é que alguns anos após o lançamento do IE8, a grande maioria dos problemas continua por resolver.&lt;br /&gt;&lt;br /&gt;Mas voltando ao que interessa, o IE8 tem outro BUG ainda não documentado que consiste na falha em gerar um evento de 'submit' num form, em certas condições.&lt;br /&gt;&lt;br /&gt;Se tivermos o seguinte código, o IE8 gera o evento 'submit' correctamente:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;form action="login"&amp;gt;&lt;br /&gt; &amp;lt;label for="user"&amp;gt;User&amp;lt;/label&amp;gt;&lt;br /&gt; &amp;lt;input id="user" name="user" type="text" value="" /&amp;gt;&lt;br /&gt; &amp;lt;br/&amp;gt;&lt;br /&gt; &amp;lt;label for="pass"&amp;gt;Pass&amp;lt;/label&amp;gt;&lt;br /&gt; &amp;lt;input id="pass" name="pass" type="password" value="" /&amp;gt;&lt;br /&gt; &amp;lt;br/&amp;gt;&lt;br /&gt; &amp;lt;input type="submit" value="Submit" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Mas se quisermos adicionar um botão adicional, para por exemplo limpar o form (exemplo simplificado), o evento já não é despoletado.&lt;br /&gt;NOTA: A implementação da funcionalidade em 'javascript' não é mostrada.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;form action="login"&amp;gt;&lt;br /&gt; &amp;lt;label for="user"&amp;gt;User&amp;lt;/label&amp;gt;&lt;br /&gt; &amp;lt;input id="user" name="user" type="text" value="" /&amp;gt;&lt;br /&gt; &amp;lt;br/&amp;gt;&lt;br /&gt; &amp;lt;label for="pass"&amp;gt;Pass&amp;lt;/label&amp;gt;&lt;br /&gt; &amp;lt;input id="pass" name="pass" type="password" value="" /&amp;gt;&lt;br /&gt; &amp;lt;br/&amp;gt;&lt;br /&gt; &amp;lt;input id="iClear" type="button" value="limpar" /&amp;gt;&lt;br /&gt; &amp;lt;input id="iSubmit" type="submit" value="Submit" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;E isto acontece apenas e somente, porque o IE8 não gosta que exista nenhum INPUT do tipo 'button', antes de um INPUT do tipo 'submit'. Isto é. aparentemente o IE8 procura o primeiro botão disponível e activa-o, mas se não fôr um botão do tipo 'submit', o form não é submetido, pois activa o botão errado.&lt;br /&gt;&lt;br /&gt;A solução passa por ter o INPUT com o type='submit' aparecer em primeiro lugar no HTML.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;form action="login"&amp;gt;&lt;br /&gt; &amp;lt;label for="user"&amp;gt;User&amp;lt;/label&amp;gt;&lt;br /&gt; &amp;lt;input id="user" name="user" type="text" value="" /&amp;gt;&lt;br /&gt; &amp;lt;br/&amp;gt;&lt;br /&gt; &amp;lt;label for="pass"&amp;gt;Pass&amp;lt;/label&amp;gt;&lt;br /&gt; &amp;lt;input id="pass" name="pass" type="password" value="" /&amp;gt;&lt;br /&gt; &amp;lt;br/&amp;gt;&lt;br /&gt; &amp;lt;input id="iSubmit" type="submit" value="Submit" /&amp;gt;&lt;br /&gt; &amp;lt;input id="iClear" type="button" value="limpar" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Se não gostarem do botão à esquerda, até por questões de usabilidade, podem sempre posicionar os botões por css com um float:right, que na pratica vos inverte a ordem relativamente a existente no HTML.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-74830341322923154?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/74830341322923154/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=74830341322923154' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/74830341322923154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/74830341322923154'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2011/07/ie8-nao-gera-evento-form-submit-em.html' title='IE8 não gera evento form submit, em certas condições'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-8079095571075546155</id><published>2009-09-30T03:41:00.000-07:00</published><updated>2009-09-30T04:34:12.369-07:00</updated><title type='text'>Tabela com múltiplos THEAD versus TBODY (IE Quirk)</title><content type='html'>&lt;p&gt;Caso se crie uma &lt;span style="color:orange;"&gt;table&lt;/span&gt; com mais do que um &lt;span style="color:orange;"&gt;thead&lt;/span&gt;, algo deste género:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;table id="myTable" cellspacing="0px"&amp;gt;&lt;br /&gt; &amp;lt;thead&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;th colspan="7"&amp;gt;Outubro&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;Domingo&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;2ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;3ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;4ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;5ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;6ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&gt;Sábado&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt; &amp;lt;/thead&amp;gt;&lt;br /&gt; &amp;lt;thead class="days"&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt; &amp;lt;/thead&amp;gt;&lt;br /&gt; &amp;lt;tbody&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td&amp;gt;TESTE&amp;lt;/td&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  ...&lt;br /&gt; &amp;lt;/tbody&amp;gt;&lt;br /&gt; &amp;lt;tfoot&amp;gt;&lt;br /&gt;  ...&lt;br /&gt; &amp;lt;/tfoot&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Tudo funciona perfeitamente (em FF3.0.14 ou no IE6.02900), inclusive aplicar CSS específico ao &lt;span style="color:orange;"&gt;thead&lt;/span&gt; cuja class="days".&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Mas se tentarem aceder por javascript ao array the objectos &lt;span style="color:orange;"&gt;tBodies&lt;/span&gt; da tabela, as coisas ai mudam de figura.&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;var myTable = document.getElementById( 'myTable' );&lt;br /&gt;&lt;br /&gt;var rows = myTable.tBodies[0].rows;&lt;br /&gt;&lt;br /&gt;alert( 'Dados da primeira coluna do body = ' + rows[0].cells[0].innerHTML );&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;No caso do FF, retorna exactamente o esperado "TESTE", no entanto, no caso do IE vai retornar "4" ou seja, o conteúdo da primeira coluna do segundo &lt;span style="color:orange;"&gt;thead&lt;/span&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt; Isto acontece porque o IE, erradamente associa o segundo &lt;span style="color:orange;"&gt;thead&lt;/span&gt; (days), como se fosse o primeiro &lt;span style="color:orange;"&gt;tbody&lt;/span&gt;, o que claramente não é, inclusivamente é incoerente com a aplicação de estilos, que essa sim funciona correctamente.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A solução para o problema, passa por fugir dele :) isto é, evitar o uso do &lt;span style="color:orange;"&gt;thead&lt;/span&gt; adicional, e aplicar o estilo (class) directamente no &lt;span style="color:orange;"&gt;tr&lt;/span&gt;. Não esquecer de actualizar o CSS de forma a corresponder com a alteração efectuada.&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;table id="myTable" cellspacing="0px"&amp;gt;&lt;br /&gt; &amp;lt;thead&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;th colspan="7"&amp;gt;Outubro&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;Domingo&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;2ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;3ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;4ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;5ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;6ª-Feira&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&gt;Sábado&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;tr class="days"&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;   &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt; &amp;lt;/thead&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-8079095571075546155?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/8079095571075546155/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=8079095571075546155' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/8079095571075546155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/8079095571075546155'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2009/09/table-multi-thead-versus-tbody-ie-quirk.html' title='Tabela com múltiplos THEAD versus TBODY (IE Quirk)'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-8616202578810303771</id><published>2007-12-19T08:30:00.000-08:00</published><updated>2007-12-19T09:14:20.996-08:00</updated><title type='text'>JSPs e comentários</title><content type='html'>Comentários em JSPs pode não ser tão linear como deveria ser. Vejam o código seguinte:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color:yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;SimpleDateFormat javascriptDateFormat = new SimpleDateFormat( "yyyy, (MM-1), dd" );&lt;br /&gt;// usage: var mydate = new Date( &lt;span style="background-color:yellow;"&gt;&amp;lt;%=&lt;/span&gt; javascriptDateFormat.format( myJavaDate ) &lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt; )&lt;br /&gt;...&lt;br /&gt;&lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;À partida parece estar tudo bem, mas não está, porque o pre-processador das JSPs não gosta de tags embebidas (&amp;lt;% ... %&amp;gt;). Como executa/processa antes do compilador Java, e não considera os comentários java (// ou /* ... */) caput!&lt;br /&gt;A solução passa então por comentar usando &lt;i&gt;comentários JSP&lt;/i&gt;.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color:yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;SimpleDateFormat javascriptDateFormat = new SimpleDateFormat( "yyyy, (MM-1), dd" );&lt;br /&gt;&lt;span style="background-color:orange;"&gt;&amp;lt;%--&lt;/span&gt; // usage: var mydate = new Date( &lt;span style="background-color:yellow;"&gt;&amp;lt;%=&lt;/span&gt; javascriptDateFormat.format( myJavaDate ) &lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt; ) &lt;span style="background-color:orange;"&gt;--%&amp;gt;&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Mas novamente, esbarramos com a limitação das tags embebidas não serem suportadas pelo Pre-processador JSP. Vamos resolver o problema fechando e abrindo o bloco envolvente de forma a evitar que um bloco fique contido no outro:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color:yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;SimpleDateFormat javascriptDateFormat = new SimpleDateFormat( "yyyy, (MM-1), dd" );&lt;br /&gt;&lt;span style="background-color:orange;"&gt;%&amp;gt;&lt;/span&gt; &lt;span style="background-color:yellow;"&gt;&amp;lt;%--&lt;/span&gt; // usage: var mydate = new Date( &lt;span style="background-color:yellow;"&gt;&amp;lt;%=&lt;/span&gt; javascriptDateFormat.format( myJavaDate ) &lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt; ) &lt;span style="background-color:yellow;"&gt;--%&amp;gt;&lt;/span&gt; &lt;span style="background-color:orange;"&gt;&amp;lt;%&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;E agora já funciona e até seria um resultado expectável, não fosse haver aqui algo estranho!&lt;br /&gt;A formatação da data, que está em &lt;i&gt;código JSP&lt;/i&gt;, está dentro de um &lt;i&gt;comentário JSP&lt;/i&gt;, ora reparem bem:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color:yellow;"&gt;&amp;lt;%--&lt;/span&gt; // usage: var mydate = new Date( &lt;span style="background-color:yellow;"&gt;&amp;lt;%=&lt;/span&gt; javascriptDateFormat.format( myJavaDate ) &lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt; ) &lt;span style="background-color:yellow;"&gt;--%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Ou seja, tags para &lt;i&gt;código JSP&lt;/i&gt; (&amp;lt;% ... %&amp;gt;) podem estar contidas em &lt;i&gt;comentários JSP&lt;/i&gt; (&amp;lt;%-- ... --%&amp;gt;), mas o inverso não é verdade !&lt;br /&gt;Confuso no mínimo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-8616202578810303771?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/8616202578810303771/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=8616202578810303771' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/8616202578810303771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/8616202578810303771'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/12/jsps-e-comentrios.html' title='JSPs e comentários'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-7592363293560821792</id><published>2007-12-17T10:20:00.000-08:00</published><updated>2007-12-17T11:08:44.615-08:00</updated><title type='text'>CSS - IE6 versus Selector de Atributos</title><content type='html'>O IE6 não suporta CSS "attribute Selectors", como no exemplo seguinte:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;div.Field input[type="text"]&lt;br /&gt;{&lt;br /&gt;   color: blue;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Assim, temos que circundar o problema, e a solução mais comum, é adicionar uma &lt;i&gt;class&lt;/i&gt; específica para o caso que queremos resolver, e atribuir a &lt;i&gt;class&lt;/i&gt; ao elemento respectivo, por exemplo:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;div.Field input.Text /* IE6 Does NOT support attribute selector */&lt;br /&gt;{&lt;br /&gt;   color: blue;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Passamos então a representar o conteudo da seguinte forma:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;div class="Field"&amp;gt;&lt;br /&gt;   &amp;lt;label for="Name"&amp;gt;Nome&amp;lt;/label&amp;gt;:&amp;lt;input class="Text" type="text" id="Name" value=""&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Mas numa perspectiva futura, podemos querer suportar ambas as regras, com algo como o seguinte:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;div.Field input[type="text"],&lt;br /&gt;div.Field input.Text /* IE6 Does NOT support attribute selector */&lt;br /&gt;{&lt;br /&gt;   color: blue;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Perfeitamente válido ! Certo ?&lt;br /&gt;Sim, é perfeitamente válido segundo o &lt;i&gt;standard&lt;/i&gt;; Mas não, não funciona no IE6!&lt;br /&gt;E de nada vale trocar a ordem das regras, dado que o comportamento é exactamente o mesmo.&lt;br /&gt;&lt;br /&gt;O problema é devido ao IE6 rejeitar as regras que não suporta, conjuntamente com qualquer outra que lhe esteja associada.&lt;br /&gt;&lt;br /&gt;Para resolver o problema temos que duplicar as formatações, de forma a que a rejeição da regra não suportada, não afecte as restantes, ou seja:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;div.Field input[type="text"]&lt;br /&gt;{&lt;br /&gt;   color: blue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.Field input.Text /* IE6 Does NOT support attribute selector */&lt;br /&gt;{&lt;br /&gt;   color: blue;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Saber isto pode poupar-vos muito tempo :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-7592363293560821792?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/7592363293560821792/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=7592363293560821792' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/7592363293560821792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/7592363293560821792'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/12/css-ie6-versus-selector-de-atributos.html' title='CSS - IE6 versus Selector de Atributos'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-2518892200438147584</id><published>2007-11-13T07:04:00.000-08:00</published><updated>2007-11-13T07:36:47.894-08:00</updated><title type='text'>Validação de Parametros</title><content type='html'>Hoje deparei-me com o seguinte Código Java numa página JSP:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;boolean bDisabled = (new Boolean ((String) (request.getParameter("bDisabled")))).booleanValue();&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;É mais um caso de conversões implícitas, usadas abusivamente. Mas desta vez o programador, gostou de complicar a coisa, para além do razoável.&lt;br /&gt;Nomeadamente, é preciso que quem chame a página, saiba exactamente, qual é a conversão implícita esperada, que é "true" para &lt;span style="font-style: italic;"&gt;true&lt;/span&gt; e "false" para &lt;span style="font-style: italic;"&gt;false&lt;/span&gt;, e tem que respeitar o &lt;span style="font-style: italic;"&gt;case&lt;/span&gt;.&lt;br /&gt;Assumindo eu, que é válida a seguinte afirmação:&lt;br /&gt;&lt;blockquote&gt;Se não é "true" é implicitamente "false".&lt;/blockquote&gt;Então podemos optar por algo bem mais simples.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;boolean bDisabled = "true".equals( request.getParameter( "bDisabled" ) );&lt;/pre&gt;&lt;/blockquote&gt;A vantagem é óbvia em termos de legibilidade e eficiência.&lt;br /&gt;Nota: No caso em que o parâmetro não é enviado, assumimos que seja equivalente a &lt;span style="font-style: italic;"&gt;false&lt;/span&gt;, o que é uma assumpção razoável, mas que validei no código existente como perfeitamente válida.&lt;br /&gt;Caso não fosse, bastaria testar esse caso também, e gerar uma excepção para qualquer outro caso, por exemplo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-2518892200438147584?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/2518892200438147584/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=2518892200438147584' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/2518892200438147584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/2518892200438147584'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/11/validao-de-parametros.html' title='Validação de Parametros'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-7655153489431202490</id><published>2007-11-02T10:17:00.000-07:00</published><updated>2007-11-02T11:55:36.630-07:00</updated><title type='text'>Estruturas de dados em Javascript</title><content type='html'>Aqui temos mais um caso típico de código Javascript:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;for (i=0;i &lt; arrParameterRange.length ; i++)&lt;br /&gt;{&lt;br /&gt;    // set the temporary variables, to improve the code readability&lt;br /&gt;    sParamFormat    =  arrParameterRange[i][0];&lt;br /&gt;    sParamRangeFrom =  arrParameterRange[i][1];&lt;br /&gt;    sParamRangeTo   =  arrParameterRange[i][2];&lt;br /&gt;    ...&lt;br /&gt;    alert(  sParamFormat + " for range " + sParamRangeFrom + " : " + sParamRangeTo );&lt;br /&gt;    ...&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;O que me levou a escrever sobre este código foi o comentário que lhe está associado.&lt;br /&gt;De facto a intenção é boa, mas estão a tentar resolver o problema errado.&lt;br /&gt;&lt;br /&gt;O problema deste código reside na forma como os dados estão a ser guardados, nomeadamente estão a usar Arrays de Arrays.&lt;br /&gt;A inicialização típica destes arrays é algo como o código seguinte:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;var arrParameterRange = new Array();&lt;br /&gt;arrParameterRange[0] = new Array( 'DumbFormat', 'DumbFrom_0', 'DumbTo_0' );&lt;br /&gt;arrParameterRange[1] = new Array( 'DumbFormat', 'DumbFrom_1', 'DumbTo_1' );&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;E isto depois implica código semelhante ao que vimos no início, com indices HardCoded por todo o lado, que não é nada fácil de ler, expecialmente quando temos sub Arrays com dimensão 10 ou mais, pois nós humanos perdemos a capacidade de associar eficazmente os indices com os dados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Curiosidade&lt;/span&gt;: Está provado experimentalmente que o limite do humano médio é de 7 itens. Isto é relevante em questões relacionadas com usabilidade (número máximo de opções de um menu, por exemplo), assim como em outras aplicações.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;alert( arrParameterRange[i][2] + " : " + arrParameterRange[i][3] );&lt;/pre&gt;&lt;/blockquote&gt;Existem alguns programadores mais iluminados que tentam dar a volta ao problema, definindo "constantes" para usar para os indíces, mas novamente estamos a resolver o problema errado.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;var RANGE_IDX_FORMAT = 0;&lt;br /&gt;var RANGE_IDX_FROM = 1;&lt;br /&gt;var RANGE_IDX_TO = 2;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;alert( arrParameterRange[i][RANGE_IDX_FROM] + " : " + arrParameterRange[i][RANGE_IDX_TO] );&lt;/pre&gt;&lt;/blockquote&gt;O problema que deviamos estar a resolver, era como estruturar correctamente os dados. E para isso temos objectos em Javascript, que servem a sua função, mas que também servem para dar nomes aos dados, nomeadamente às propriedades do objecto. Isto porque Objectos sem métodos são &lt;span style="font-style:italic;"&gt;equivalentes&lt;/span&gt; a estruturas (dado que é tudo público, em Javascript).&lt;br /&gt;&lt;br /&gt;Então vamos definir um objecto em Javascript para guardar os nossos dados:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;var ParamRange = function( format, from, to )&lt;br /&gt;{&lt;br /&gt;    this.format = format;&lt;br /&gt;    this.from = from;&lt;br /&gt;    this.to = to;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;E com esta simples alteração, já conseguimos código legível e fácil de manter:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;var arrParameterRange = new Array();&lt;br /&gt;arrParameterRange[0] = new ParamRange( 'DumbFormat', 'DumbFrom_0', 'DumbTo_0' );&lt;br /&gt;arrParameterRange[1] = new ParamRange( 'DumbFormat', 'DumbFrom_1', 'DumbTo_1' );&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;for( i=0; i &lt; arrParameterRange.length ; i++ )&lt;br /&gt;{&lt;br /&gt;    var paramRange = arrParameterRange[ i ];&lt;br /&gt;    ...&lt;br /&gt;    alert( paramRange.format + " for range " + paramRange.from + " : " + paramRange.to );&lt;br /&gt;    ...&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;Claro está que o melhor seria mesmo definir métodos para isolar as propriedades do objecto, e providenciar as funcionalidades necessárias, mas este tema já vai longo e ainda tinha muito que escrever se fosse por ai.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-7655153489431202490?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/7655153489431202490/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=7655153489431202490' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/7655153489431202490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/7655153489431202490'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/11/estruturas-de-dados-em-javascript.html' title='Estruturas de dados em Javascript'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-1273846646727581817</id><published>2007-11-02T09:40:00.000-07:00</published><updated>2008-10-15T09:40:02.545-07:00</updated><title type='text'>Conversões implícitas</title><content type='html'>Recentemente deparei-me com o seguinte código numa JSP (Java+Javascript):&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;if( &lt;span style="background-color:yellow;"&gt;&amp;lt;%=&lt;/span&gt; sTestParam.equals("true") &lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt; )&lt;br /&gt;{&lt;br /&gt; ...&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;  À primeira vista não parece haver problema nenhum com este código, mas este código é tudo menos intuitivo por usar uma conversão implícita abusivamente e por assumir um pressuposto que não é garantido na especificação do Java.&lt;br /&gt;&lt;br /&gt;Se olharmos com cuidado, temos um metodo que nos devolve um booleano (Java), que por sua vez devido ao método de embeber resultados numa JSP ( &lt;span style="background-color:yellow;color:black;"&gt;&amp;lt;%=&lt;/span&gt; ... &lt;span style="background-color:yellow;color:black;"&gt;%&amp;gt;&lt;/span&gt; ) é implicitamente convertido para String (Boolean.toString), que retorna "true" ou "false", e que finalmente é usado como código Javascript, que mais tarde o browser interpretará como um booleano novamente.&lt;br /&gt;&lt;br /&gt;O problema principal é isto tudo ser muito obscuro, mas existe também um problema subjacente potencial, é que não existe garantia nenhuma que as futuras versões do Java continuem a converter um booleano implicitamente para "true" ou "false", isto pode mudar e depois este código deixa de funcionar, é pouco provável mas possível.&lt;br /&gt;Como exemplo puramente ilustrativo, poderia passar a retornar "True", "_true_" ou "&lt;span style="font-style: italic;"&gt;'True'&lt;/span&gt;" ou "Vero" par uma implementação italiana.&lt;br /&gt;javascript:void(0)&lt;br /&gt;A solução seguinte é bem mais intuitiva e explícita, e sem usar qualquer conversão implícita:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="background-color:yellow;"&gt;&amp;lt;%&lt;/span&gt; if( sTestParam.equals("true") ) { &lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt; ...&lt;br /&gt;&lt;span style="background-color:yellow;"&gt;&amp;lt;%&lt;/span&gt; } &lt;span style="background-color:yellow;"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;Ter em atenção que conversões implícitas são úteis e até facilitam o trabalho, quando bem aplicadas. Mas como em tudo, quando se abusa das ferramentas e da sua função, acaba por se perder os benefícios e eventualmente criar problemas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-1273846646727581817?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/1273846646727581817/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=1273846646727581817' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/1273846646727581817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/1273846646727581817'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/11/converses-implcitas.html' title='Conversões implícitas'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-1424637437230549394</id><published>2007-10-22T07:08:00.000-07:00</published><updated>2007-10-22T07:18:00.449-07:00</updated><title type='text'>Sem comentários</title><content type='html'>Hoje deparei-me com o código Javascript seguinte:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;function returnFalse()&lt;br /&gt;{&lt;br /&gt;    return false;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-1424637437230549394?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/1424637437230549394/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=1424637437230549394' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/1424637437230549394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/1424637437230549394'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/10/sem-comentrios.html' title='Sem comentários'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-1361094317494025537</id><published>2007-10-22T06:19:00.000-07:00</published><updated>2007-10-22T06:38:28.934-07:00</updated><title type='text'>Validação de Strings</title><content type='html'>É muito frequente encontrar código java semelhante ao seguinte:&lt;br /&gt;&lt;blockquote&gt;if( myStr != null &amp;amp;&amp;amp; myStr.equals( "TestString" ) )&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;Embora o código esteja correcto, é uma pattern recorrente que pode e deve ser simplificada, como na sugestão seguinte:&lt;br /&gt;&lt;blockquote&gt;if( "TestString".equals( myStr ) )&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;Isto funciona, porque "TestString" existe sempre por ser uma constante (literal), e dado representar um objecto, podemos sempre chamar o metodo equals(...) que por sua vez sabe lidar com o caso de o parâmetro ser &lt;span style="font-style: italic;"&gt;null&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Existem ainda situações semelhantes, por exemplo:&lt;br /&gt;&lt;blockquote&gt;if( myStr != null &amp;amp;&amp;amp; !myStr.equals( "" ) )&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;Que podem ser simplificadas de forma a serem mais eficientes, como sugerido a seguir:&lt;br /&gt;&lt;blockquote&gt;if( myStr != null &amp;amp;&amp;amp; myStr.length() &gt; 0 )&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;NOTA: Comparar com a String vazia é menos eficiente, mas se preferirem podem usar a sugestão seguinte, por ser mais concisa.&lt;br /&gt;&lt;blockquote&gt;if( !"".equals( myStr ) )&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-1361094317494025537?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/1361094317494025537/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=1361094317494025537' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/1361094317494025537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/1361094317494025537'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/10/validao-de-strings.html' title='Validação de Strings'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-2452332230039710546</id><published>2007-10-15T11:05:00.000-07:00</published><updated>2007-11-23T06:59:28.745-08:00</updated><title type='text'>Ingenuidade versus desempenho</title><content type='html'>A ingenuidade de alguns programadores, relativamente à forma como as linguagens funcionam a baixo nível, trás muitas vezes impactos inesperados no desempenho das aplicações.&lt;br /&gt;Vou mostrar um exemplo típico, que se encontra frequentemente em Javascript, uma função que usa um ciclo &lt;span style="font-style: italic;"&gt;for&lt;/span&gt; para gerar uma lista de valores separados por virgulas.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;function getValidZoneList()&lt;br /&gt;{&lt;br /&gt; var zoneList = '';&lt;br /&gt;&lt;br /&gt; for( var i=0; i &lt; arrValidZone.length; ++i )&lt;br /&gt; {&lt;br /&gt;   if( zoneList == '' )&lt;br /&gt;     zoneList  = arrValidZone[ i ][ 0 ];&lt;br /&gt;   else&lt;br /&gt;     zoneList += ', ' + arrValidZone[ i ][ 0 ];&lt;br /&gt; }&lt;br /&gt; return zoneList;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;O primeiro problema com que nos deparamos é o teste &lt;pre&gt;( zoneList == '' )&lt;/pre&gt;, que é tipicamente mais lento que testar &lt;pre&gt;( zoneList.length == 0 )&lt;/pre&gt;&lt;br /&gt;O segundo problema é fazer testes desnecessários dentro dos ciclos!&lt;br /&gt;Neste caso concreto o teste só é necessário, para determinar se precisamos de adicionar o separador virgula no caso de já termos algum elemento na lista. O facto é que este teste só é relevante no primeiro elemento, sendo falso para todos os restantes.&lt;br /&gt;&lt;br /&gt;Se a função fosse implementada da forma que se sugere a seguir, aumentaria significativamente o seu desempenho, pois fariamos apenas um único test, no início:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;// returns a comma separated String with the list of Valid Zones&lt;br /&gt;function getValidZoneList()&lt;br /&gt;{&lt;br /&gt; var zoneList = '';&lt;br /&gt;&lt;br /&gt; if( arrValidZone.length )&lt;br /&gt; {&lt;br /&gt;   var i = 0;&lt;br /&gt;   zoneList += arrValidZone[ i ][ 0 ];&lt;br /&gt;&lt;br /&gt;   for( ++i; i &lt; arrValidZone.length; ++i )&lt;br /&gt;     zoneList += ', ' + arrValidZone[ i ][ 0 ];&lt;br /&gt; }&lt;br /&gt; return zoneList;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-2452332230039710546?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/2452332230039710546/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=2452332230039710546' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/2452332230039710546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/2452332230039710546'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/10/ingenuidade-e-seus-impactos-no.html' title='Ingenuidade versus desempenho'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-9084869484202641136</id><published>2007-10-15T08:34:00.000-07:00</published><updated>2007-10-15T11:02:49.974-07:00</updated><title type='text'>Debug "Artesanal"</title><content type='html'>Quantos de nos já não fomos forçados ao método de &lt;span style="font-style: italic;"&gt;debug&lt;/span&gt; "Artesanal",  de fazer &lt;span style="font-style:italic;"&gt;prints&lt;/span&gt; pelo meio do código. À falta de melhor solução, sempre é uma solução, ainda que pobre.&lt;br /&gt;&lt;br /&gt;Mas hoje deparei-me com o seguinte, numa tag Body (HTML):&lt;br /&gt;&lt;blockquote&gt;&lt;span class="comment"&gt;onload="javascript:window.open('about:blank').document.write('&amp;lt;pre&amp;gt;' + document.documentElement.outerHTML.replace(/&amp;lt;/g, '&amp;lt;') + '&amp;lt;/pre&amp;gt;');"&lt;/span&gt;&lt;/blockquote&gt;A ideia desta alma é fazer debug numa janela à parte, atráves de um &lt;span style="font-style: italic;"&gt;dump&lt;/span&gt; do html/código gerado.&lt;br /&gt;A motivação é clara, pois trata-se de uma página gerada dinâmicamente, e que neste caso inclui geração dinâmica de Javascript, outch!&lt;br /&gt;O "único" problema é que ao fazer isto, qualquer Javascript embutido na página vai deixar de funcionar, dado que todas as variáveis e funções definidas, não o foram, logo vai dar sarna para o "inventor" se coçar, com todas as mensagens de erro que irá receber.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-9084869484202641136?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/9084869484202641136/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=9084869484202641136' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/9084869484202641136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/9084869484202641136'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/10/debug-artesanal.html' title='Debug &quot;Artesanal&quot;'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-142539794794141251</id><published>2007-10-12T04:53:00.000-07:00</published><updated>2007-10-12T05:17:29.268-07:00</updated><title type='text'>"Martelar"</title><content type='html'>O termo "martelar" pertence ao calão informático Português e refere-se ao acto de alterar uma aplicação de uma forma rápida, localizada e sem grandes cuidados estruturais.&lt;br /&gt;Normalmente resulta numa solução suficiente, mas não propriamente ideal, na medida em que não tem em consideração o código circundante ou desenvolvimentos futuros.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Estou a "martelar" o código.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É uma analogia com a profissão de Carpinteiro, mais concretamente ao acto de martelar um prego, supostamente uma actividade que não requer grande destreza ou cuidado, para obter um resultado minimamente satisfatório.&lt;br /&gt;&lt;br /&gt;Termos relacionados:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"martelanço"&lt;br /&gt;O acto de "martelar".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Estou no "martelanço".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"martelado"&lt;br /&gt;O estado final do código depois da intervenção.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Este código está todo "martelado".&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;Esta "técnica" é tipicamente usada em situações de urgência/falta de tempo, nomeadamente quando se está em cima dos prazos de término dos projectos, quando já não há tempo para estruturar correctamente o código.&lt;br /&gt;&lt;br /&gt;Infelizmente encontram-se com alguma frequência, "Carpinteiros de Software" a tempo inteiro.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-142539794794141251?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/142539794794141251/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=142539794794141251' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/142539794794141251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/142539794794141251'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/10/martelar.html' title='&quot;Martelar&quot;'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-2531767641211947473</id><published>2007-10-11T11:02:00.000-07:00</published><updated>2007-10-11T11:15:18.062-07:00</updated><title type='text'>IE 6 window.opener Javascript BUG</title><content type='html'>Há males que vêm por bem.&lt;br /&gt;&lt;br /&gt;Já me aconteceu inumeras vezes ao fazer debug do IE 6 (6.0.2900.2180.xpsp_sp2_gdr.070227-2254) usando o "Microsoft Script Editor (10.0)" determinar que o object window.opener não está definido quando deveria estar, nomeadamente no documento carregado dentro de uma Iframe.&lt;br /&gt;A atitude natural e expectável é culpar o browser (IE), pois já faz tanta coisa mal, que é só mais uma. Assim sendo arranja-se uma forma de circundar o problema.&lt;br /&gt;Mas hoje descobri o cálice dourado :)&lt;br /&gt;&lt;br /&gt;O culpado desta vez é o debugger "Microsoft Script Editor".&lt;br /&gt;&lt;br /&gt;Se o debugger estiver activo durante a execução de uma instrução que envolva window.opener este objecto não está definido (undefined).&lt;br /&gt;&lt;br /&gt;Mas se só chamarmos o debugger depois de executar essa linha, ou simplesmente não lançar o debugger, o código com o window.opener executa sem problemas, pois este encontra-se correctamente definido.&lt;br /&gt;&lt;br /&gt;O seja, no caso seguinte window.opener não está definido e dá erro, no debugger:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;      function GiveZipCode( zipC, cityN, streetN )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;              debugger;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;              window.opener.fillBoxes( zipC, streetN, cityN );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;              ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;desta forma o window.opener JÁ ESTÁ CORRECTAMENTE definido e funciona:&lt;br /&gt;&lt;br /&gt;     function GiveZipCode( zipC, cityN, streetN)&lt;br /&gt;     {&lt;br /&gt;             window.opener.fillBoxes( zipC, streetN, cityN );&lt;br /&gt;             debugger;&lt;br /&gt;             ...&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;Para os mais incrédulos, basta chamar o debugger dentro da função fillBoxes() que ele para lá dentro, sem qualquer problema, ou seja conseguiu aceder ao window.opener, logo está definido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-2531767641211947473?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/2531767641211947473/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=2531767641211947473' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/2531767641211947473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/2531767641211947473'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/10/ie-6-windowopener-javascript-bug.html' title='IE 6 window.opener Javascript BUG'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2974713680059630781.post-701098583813567639</id><published>2007-10-10T06:24:00.000-07:00</published><updated>2007-10-10T10:17:50.046-07:00</updated><title type='text'>"Bombar"</title><content type='html'>O termo "bombar" pertence ao calão informático Português e refere-se ao facto de uma aplicação ou programa estar finalmente a executar sem problemas (conhecidos).&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;Está a "bombar"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É uma analogia ao funcionamento de uma bomba usada num poço, para extrair água.&lt;br /&gt;Quando está a funcionar existe "output" (água) na saída.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2974713680059630781-701098583813567639?l=softwarebydev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwarebydev.blogspot.com/feeds/701098583813567639/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2974713680059630781&amp;postID=701098583813567639' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/701098583813567639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2974713680059630781/posts/default/701098583813567639'/><link rel='alternate' type='text/html' href='http://softwarebydev.blogspot.com/2007/10/est-bombar.html' title='&quot;Bombar&quot;'/><author><name>Developer</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
