Newsgroup: it.comp.lang.javascript
Titolo: Menu Gerarchico a Cascata finalmente funzionante su NS4+!!

Volevo comunicarvi che riguardo al menù "Menu Gerarchico a Cascata" che
trovate su 
www.risorse.net
 , avrei risolto il "problemino" che impediva a
NN4+ di creare questo menù. La soluzione era veramente semplice ed ecco la
modifica da fare nel file dove risiede il cuore del codice JS (menu.js):
Nella routine makeElement bisogna cambiarla in:
----------------------------------------------------------------
function makeElement(whichEl,whichContainer) {
 if (arguments.length==1)
  whichContainer = (NS4) ? window: document.body;
if (NS4) {
  if (arguments.length==1){
   eval(whichEl + "= new Layer(menuWidth )");
  }
  else {
  eval(whichEl + "= new Layer(menuWidth, whichContainer )");
  }
 }
 else {
  elStr = "<DIV ID=" + whichEl + " STYLE='position:absolute'></DIV>";
  whichContainer.insertAdjacentHTML("BeforeEnd",elStr);
 }
 return eval(whichEl);
}
----------------------------------------------------------------------------
----
Prima, dopo il test if (NS4) c'era solo l'espressione " eval(whichEl + "=
new Layer(menuWidth, whichContainer)");"
dove whichContainer=window nel caso del primo menù, corrispondente al primo
layer (rispondendo al test "if  arguments.length==1"). E l'espressione new
Layer(...,...) si bloccava nel caso di questo valore (object window).
Il trucco è stato di togliere whichContainer nel caso arguments.length==1 in
modo che automaticamente il primo layer si trovi in prima fila (Top), e gli
altri siano al loro posto con il loro valore whichContainer.
Il test arguments.length==1 serve per sapere se la funzione è stata chiamata
con o senza whichContainer, che vuol dire che si crea il primo layer in cima
a tutti gli altri. Gli altri vengono creati con un valore preciso di
whichContainer che li fa mettere in posizione inferiore al primo (below).
Con questo test che ho aggiunto nel caso NS4=true, le due situazioni vengono
distinte e in NN4+ funziona perfettamente!
Ultimo PROBLEMA:
Adesso per perfezionare il tutto c'è un'ultimo problema da risolvere. Quando
si è caricata la pagina web contenente il menù e che si cambia la dimensione
della finestra (in qualunque modo), il menù non funziona più. Invece su IE5
funziona lo stesso qualunque cosa si faccia alla finestra! Preciso che se la
dimensione della finestra in NN4+ rimane invariata e che si passa
semplicemente da una finestra all'altra tramite la barra delle applicazioni,
il menù continua a funzionare.
Infine il menù continua a funzionare quando si riduce a icona la finestra e
che la si riapre.
Chi mi sa dire qualche cosa??
Grazie
Ciao
Thierry

 NN4+ di creare questo menų. La soluzione era veramente semplice ed ecco la


 dibattendo con il problema che hai risolto.
Di nulla, č stato un piacere!
Un'altra cosa che non ho comunicato č che su IE5 la posizione dei menů č
cosě alta in confronto a dove passi con il mouse, che vengono creati fuori
dalla parte visibile e quindi vedi che sono stati creati ma non vedi niente.
Adesso non ho ancora provato su IE4 (dove funzionava perfettamente la
versione originale) la mia trasformazione, perň č una correzione facile
facile :-)
Nella versione originale (menu.js) non teneva conto delle coordinate
verticali del menů a secondo che fosse il top o un child, come segue:
----------------------------------------------------------------------------
----------------------------------
function keepInWindow() {
 scrBars = 20;
 if (NS4) {
  winRight = (window.pageXOffset + window.innerWidth) - scrBars;
  rightPos = this.left + menuWidth;
  if (rightPos > winRight) {
   if (this.hasParent) {
    parentLeft = this.parentMenu.left;
    newLeft = ((parentLeft-menuWidth) + childOverlap);
    this.left = newLeft;
   }
   else {
    dif = rightPos - winRight;
    this.left -= dif;
   }
  }
  winBot = (window.pageYOffset + window.innerHeight) - scrBars;
  botPos = this.top + this.fullHeight;
  if (botPos > winBot) {
   dif = botPos - winBot;
   this.top -= dif;
  }
 }
 else {
---->>> ERRORE NELLA POSIZIONE VERTICALE DEL MENU'
     winRight = (document.body.scrollLeft + document.body.clientWidth) -
scrBars;
  rightPos = this.style.pixelLeft + menuWidth;
  if (rightPos > winRight) {
   if (this.hasParent) {
    parentLeft = this.parentMenu.style.pixelLeft;
    newLeft = ((parentLeft - menuWidth) + childOverlap);
    this.style.pixelLeft = newLeft;
   }
   else {
    dif = rightPos - winRight;
    this.style.pixelLeft -= dif;
   }
  }
  winBot = (document.body.scrollTop + document.body.clientHeight) - scrBars;
  botPos = this.style.pixelTop + this.fullHeight;
  if (botPos > winBot) {
   dif = botPos - winBot;
   this.style.pixelTop -= dif;
  }
 }
}
----------------------------------------------------------------------------
-----------------------
Nella versione corretta ho semplicemente aggiunto un test dove ho scritto:
---->>> ERRORE NELLA POSIZIONE VERTICALE DEL MENU'
cioč: if (!this.hasParent) this.style.pixelTop += document.body.scrollTop;
Infine un'ultimo problema č quando hai caricato il tutto su NE4+ e cambi la
dimensione della finestra. Il problema č stato discusso nel post dal titolo:
"NN4+ ferma esecuzione codice se cambi dimensione finestra!" del 24/03.
A questo punto vedrai che splendore:-)))
Ciao
Thierry

 ha scritto nel messaggio
news:8c0qcq$97r$1...@pegasus.tiscalinet.it...
