[javascript] non riesco a far vedere l'elemento a getElementByID

Sono due giorni che ci sbatto la testa ma non capisco perché non mi veda l'elemento: in pratica ho bisogno di far leggere ad uno script la parte testuale di una serie di link nella pagina html.

Ebbene secondo sia il manuale del javascript che molti esempi online, questa istruzione legge un elenco di tag in una sezione ben definita della pagina xhtml:

var link = document.getElementById('menu').getElementsByTagName('a');

ove la sezione xhtml: (semplifico per necessità)

....
<ul id='menu'>
  <li><a href='.....>link 1</li>
  <li><a href='....>link2</li>
</ul>

ebbene la variabile javascript link contiene un array con tutti i link (a) della sezione identificata con 'menu'.

Purtroppo eseguendo lo script lo stesso mi va in errore proprio qui: document.getElementById('menu') dicendomi che non esiste la proprietà ... 'menu'. Non ha senso!

Per completezza metto il codice completo della pagina qui sotto, se qualcuno è capace di darmi una mano ben venga.

L'esempio è stato provato su IE6 e macchina Win2000 e NT4 Firefox su Win2000 e NT4 e gnu/linux, l'errore è sempre lo stesso.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it" dir="ltr">
<head>
<script type='text/javascript'>
<!--

function getEl(id) {   
   element = document.getElementById(id);   
   return element;   
}   

function scambio(num){   
   if (document.getElementById) {
      if(getEl('notizia'+num).style.display == 'none') {
         getEl('notizia'+num).style.display = 'block';   
         getEl(num).innerHTML = '<strong>CHIUDI:</strong> ' + testo_link;   
      } else {
         getEl('notizia'+num).style.display = 'none';   
         getEl(num).innerHTML = testo_link[num];   
      }   
   } else return false
}

// MAIN FUNCTION

if (document.getElementById) {
   var testo_link = '';
   var sezione = getEl(menu);
   var ancore = sezione.getElementsByTagName('a');
   for (var i = 0; i < ancore.length; i++) {
      testo_link[i] = document.getEl(i).textContent;
   }
}
// -->
</script>
</head>
<body>
<ul id='menu'>
   <li><a id='0' href='prova.html#notizia0' onclick="scambio(0); return true" title="va all'articolo">articolo 0</a></li>
   <li><a id='1' href='prova.html#notizia1' onclick="scambio(1); return true" title="va all'articolo">articolo 1</a></li>
   <li><a id='2' href='prova.html#notizia2' onclick="scambio(2); return true" title="va all'articolo">articolo 2</a></li>
</ul>
<div id='notizia0' style='display: none'>notizia nascosta 0</div>
<div id='notizia1' style='display: none'>notizia nascosta 1</div>
<div id='notizia2' style='display: none'>notizia nascosta 2</div>
</body>
</html>
inviato 9 anni fa
Marco Grazia
X 0 X

prova a mettere lo script al di sotto dell'html a cui fa riferimento

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Probabilmente è come dice gianni, spostandola dopo la creazione degli elementi risolve il problema, oppure mettendola come evento onload del body viene eseguita dopo che l'intera pagina è stata caricata.

risposto 9 anni fa
LonelyWolf
X 0 X

A quel punto il DOM non è ancora pronto per essere manipolato.

Prova così:

// MAIN FUNCTION
window.onload = function () {
    try {
        var testo_link = '';
        if ( !( var sezione = getEl('menu') )
                throw "Element not found";
        var ancore = sezione.getElementsByTagName('a');
        for (var i = 0; i < ancore.length; i++) {
           testo_link[i] = document.getEl(i).textContent;
        }
    } catch (e) {
        alert(e);
    }
}

bada: l'ho scritto a braccio...

 :bye:

risposto 9 anni fa
Xscratch
X 0 X

E avete ragione, il mio è stato un errore da principiante.

Però, ora se quel problema sembra essere stato risolto, mi manca il secondo parametro:

for (var i = 0; i < ancore.length; i++) {
           testo_link[i] = document.getElelementById(i).textContent;
        }

testo_link risulta essere sempre vuoto e non ha senso anche perché tramite firebug (estenzione per FF) mi dice che textContent contiene il testo che sto cercando :( non ha di nuovo senso.

Ah xscratch, ho tolto la questione del try catch perché non sono sicuro della sintassi (ma quello è PHP sicuro che è uguale in JS?) ma per il resto è uguale (a parte qualche orrore di ortografia da parte mia).

risposto 9 anni fa
Marco Grazia
X 0 X

Ma al getElelementById() non andrebbe passata una stringa?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Ah xscratch, ho tolto la questione del try catch perché non sono sicuro della sintassi (ma quello è PHP sicuro che è uguale in JS?) ma per il resto è uguale (a parte qualche orrore di ortografia da parte mia).

sisi, fidati, io lo uso sempre per evitare che gli errori di uno script interferiscano con l'esecuzione degli altri script.

comunque per l'errore ha ragione Gianni

risposto 9 anni fa
Xscratch
X 0 X

No, no, una stringa in senso lato :) ovvero il nome dell'identificativo può essere tranquillamente un numero, inteso ovviamente come stringa.

Semmai e qui vi do ragione, ma penso mentre scrivo la risposta, è il fatto che i in questo caso non è una stringa.

In effetti potrei ovviare alla cosa, visto che ho creato il wrapper getEl() proprio per questo ... provo e vi faccio sapere.

Ok allora per try catch.

risposto 9 anni fa
Marco Grazia
X 0 X

Uhm....

for (var i = 0; i < ancore.length; i++) {
         elemento = getEl(i);
         testo_link[i] = elemento.firstChild;
         alert(elemento.firstChild);
      }

allora ho modificato ancora questa parte dello script che è la parte che ora mi da errore, o meglio, non mi da nulla.

Ebbene testo_link[] è ancora vuota, e alert mi da text object, che presuppone come firstChild sia un oggetto testo che presupponga qualcosa come value subito dopo.

La cosa assurda è che con firebug, in quel momento nel breakpoint firstChild ha proprio il valore "articolo 0" che è ciò che cerco di passare a testo_link.

Ah, per sintetizzare ciò che avete detto tu e Gianni, ho usato la funzione di wrapping per far diventare i una stringa (elemento = getEl(i);) e funge fin lì.

risposto 9 anni fa
Marco Grazia
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda