PDA

View Full Version : [JS] Script "chiusura" menu


Isomarcus
18-02-2007, 12:17
salve a tutti, sto impazzendo con questo semplicissimo script js:

window.onload=expand;

function expand(id) {

var elem = document.getElementById(id);

for (var i = 1; i<=20; i++) {

if (document.getElementById('submenu'+i)) {document.getElementById ('submenu'+i).style.display='none';}

}

if (elem) {d.style.display='block';}

}

quello che fa in pratica è espandere dei submenu quando si clicca sull'elemento padre, e contemporaneamente chiudere gli altri già aperti... ora quello che vorrei aggiungere a questa funzione è la possibilità di chiudere il submenu quando si clicca una seconda volta sull'elemento padre... beh parola mia ho provato almeno 10 modi diversi ma non funziona... quello che avevo provato io è controllare se il submenu è già espanso (cioè se il submenu ha display = block) e in caso chiuderli mettendo display = none... ma temo che i controlli condizionali su proprietà di stile (in questo caso display) non funzionino come spero io :D
preciso che ho cercato di rendere lo script il più leggero e snello possibile, è per questo che è così striminzito... il sito è centrato su tanto php quindi non voglio esagerare col js :p

MEMon
18-02-2007, 12:40
Ma dove li fai i controlli che dici?
Non puoi mettere il codice per intero integrato in una paginetta da vedere un attimo dove sta l'inghippo?

andbin
18-02-2007, 14:43
window.onload=expand;

function expand(id) {
....
}Rispondi a questa domanda: che cosa ti aspetti che ti venga passato nel parametro 'id'???

Tu hai assegnato una funzione a window.onload. L'evento onload viene generato quando la pagina è stata caricata e fin qui ci siamo. Ma non ti viene certamente passato un 'id' di un elemento!!!!
Diciamo che sui browser IE non viene passato alcun valore (id sarebbe undefined), sui browser Mozilla e simili viene passato un oggetto di tipo Event.

Per dirla in breve: quando una tua funzione è usata come "event handler", non sei tu che puoi specificare quali parametri ricevere!

Isomarcus
18-02-2007, 16:59
scusa, forse non ho capito, ma l'id viene passato solo quando la funzione viene chiamata dal menu (tramite un onclick), quello che fa al caricamento della pagina è solo chiudere tutti gli elementi con id "submenu" aperti!


questo è un piccolo esempio del codice che usa quello script


<dt onclick="javascript:show('submenu1');">Menu1</dt>
<dd id="submenu1">
<ul>
<li><a href="pag.html">submenu1</a></li>
<li><a href="#">submenu2</a></li>
<li><a href="#">submenu3</a></li>
</ul>
</dd></dt>


la funzione così com'è funziona perfettamente, ma assolutamente non riesco a fargli chiudere i submenu cliccando sull'elemento padre (sul dt per capirci)
la cosa che ho provato per prima è stata chiamare prima un'altra funzione, che in pratica controllava se gli elementi con id "submenu" successivi all'elemento padre avevano proprietà display = block e nel qual caso la settava a none, mentre in caso contrario chiamava la funzione show ... ma il controllo condizionale su style.display non funziona

andbin
19-02-2007, 08:19
scusa, forse non ho capito, ma l'id viene passato solo quando la funzione viene chiamata dal menu (tramite un onclick), quello che fa al caricamento della pagina è solo chiudere tutti gli elementi con id "submenu" aperti!Ripeto: tu hai fatto una funzione che si chiama expand, che si aspetta di ricevere un 'id' da passare a getElementById. Hai assegnato tale funzione all'evento onload. Bene, quando l'evento onload viene generato, la funzione expand non riceve di certo un 'id'. Sebbene questo non dia problemi (infatti getElementById dovrebbe ritornare null), ha poco senso (almeno secondo me) che tu usi questa tua funzione come event-handler.
Tutto qui quello che volevo dire!

Isomarcus
22-02-2007, 20:06
ah ok. sì cmq quello che volevo fargli fare all'onload era semplicemente chiudere tutti i submenu aperti, infatti arrivandogli un id nullo la parte dell'espansione viene semplicemente ignorata :p

cmq ritornando alla domanda iniziale, qualche idea su come posso richiudere i submenu una volta aperti?

Isomarcus
24-02-2007, 15:41
up

Isomarcus
02-03-2007, 15:18
up

Isomarcus
08-03-2007, 14:13
up