Não consigo aceder ao body através de DOM (javascript)

mj2p

I'm Cool Cuz I Fold
Boas pessoal. Estou agora a dar os primeiros passos em javascript, e deparei-me desde logo com um problema. Tenho uma página em que no <body> tenho três parágrafos. Faço então document.getElementsByTagName("p") para os encontrar.

Desta forma deveria ter uma colecção de nós cujas tags são <p>. Mas simplesmente não tenho nada. E o mais estranho ainda, é que quando faço document.getElementsByTagName("*"), para ter uma colecção de todos os nós da minha página web, esta colecção só tem o nó <html>, o nó <head> e depois só mais todos os outros que estão contidos em <head>.

Como faço para aceder aos nós mais interiores de uma página web?

Vá, cumps
 
Podias colocar aqui o teu código completo?

Se por ex. fizeres isto:

Código:
<html>
<head>
  <script type="text/javascript" language="javascript">
    DOMTest = function(){
      var elems=document.getElementsByTagName("p");
      for(var i=0,count=elems.length;i<count;i++){
        alert(elems[i].innerHTML);
      }
    }
  </script>
</head>
<body onload="DOMTest()">
  <p>Parágrafo 1</p>
  <p>Parágrafo 2</p>
  <p>Parágrafo 3</p>
</body>
</html>

Vão aparecer 3 caixas de mensagem com o conteúdo dos 3 parágrafos. Mas também podes ir directamente ao elemento body e obter todos os elementos com tag <p>, por ex. document.body.getElementsByTagName("p"), que neste caso irá dar exactamente o mesmo resultado.

Porém se usasses o getElementsByTagName("*"), ai sim iria dar um resultado diferente, consoante fosse document ou document.body
 
Ok, o teu código resultou. No entanto, fui mexer um pouco nele para ver se encontrava a possível razão para não estar a funcionar comigo. E quando retirei o evento "onLoad" da tag do <body> ele já não correu como previsto, mesmo tendo colocado o script a executar automaticamente quando a página abre.

Isto tem algo a haver com o facto de quando o script está programado para correr mal a página abra, este correr antes mesmo de serem "criados" os conteúdos HTML?

Esclarece-me se puderes.

Vá, cumps
 
Ok, o teu código resultou. No entanto, fui mexer um pouco nele para ver se encontrava a possível razão para não estar a funcionar comigo. E quando retirei o evento "onLoad" da tag do <body> ele já não correu como previsto, mesmo tendo colocado o script a executar automaticamente quando a página abre.

Isto tem algo a haver com o facto de quando o script está programado para correr mal a página abra, este correr antes mesmo de serem "criados" os conteúdos HTML?

Esclarece-me se puderes.

Vá, cumps

Se tirares o body onload, podes ter outras 2 hipóteses, usar algo deste tipo:
Código:
  <script type="text/javascript" language="javascript">
    DOMTest = function(){
      var elems=document.body.getElementsByTagName("p");
      for(var i=0,count=elems.length;i<count;i++){
        alert(elems[i].innerHTML);
      }
    }
    window.onload=DOMTest;
  </script>

Ou então chamares a função mesmo antes do </body>
Código:
  ........
  <p>Paragrafo 3</p>
  <script type="text/javascript" language="javascript">
    DOMTest();
  </script>
  </body>

Se por ex. chamares a função DomTest dentro do <head> a função só vai actuar sobre o html renderizado até então. Experimenta por ex. fazer isto e vês que ele só vai "ler" até ao </head>
Código:
  <script type="text/javascript" language="javascript">
    DOMTest = function(){
      var elems=document.getElementsByTagName("*");
      for(var i=0,count=elems.length;i<count;i++){
        alert(elems[i].innerHTML);
      }
    }
    DOMTest();
  </script>
 
Back
Topo