Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Menu espandibile in Javascript

Link copiato negli appunti

Tra gli elementi centrali di un buon sito Internet, la navigabilità è uno dei più importanti. Un sito facilmente navigabile è un sito che prevede un menu di risorse facile ed intuitivo. In altre parole il visitatore deve essere nella condizione di arriavare subito alla pagina che desidera senza troppi passaggi intermedi. Da questo punto di vista la soluzione ottimale appare quella dei sistemi Windows, che attraverso menu espandibili riescono ad indicizzare ordinatamente un gran numero di risorse.

Con gli strumenti di HTML non è possibile ottenere un risultato del genere, che si raggiunge invece con l'uso di sintassi JavaScript. In questo esempio, viene spiegato nei dettagli come creare un menu espandibile all'interno di una pagina Web.

L'esempio si compone di 4 file:

  • esempio.htm è la pagina HTML dell'esempio
  • collapsd.gif è l'icona che indica le voci principali del menu, quando queste non sono espanse
  • exploded.gif è l'icona che indica le voci principali del menu, quando queste sono espanse
  • child.gif è l'icona che indica le voci minori del menu, che in questo caso rappresentano link a risorse esterne

Per una più semplice comprensione di questo script è utile fare riferimento a questi file, verificando le procedure e i dati. In questo modo, con un continuo confronto, è più semplice comprendere le peculiarità di questo Javascript.

Il file HTML contiene tutto il codice necessario al corretto funzionamento dello script. Nel tag <head> abbiamo definito il codice Javascript vero e proprio, e nel <body> quello relativo ai necessari richiami.

Codice da inserire nel tag <head>

<script language="javascript">
<!--
var caution = false;

function setcookie(name, value, expires, path, domain, secure) 
{
  var curcookie = name + "=" + escape(value) + 
      ((expires) ? "; expires=" + expires.togmtstring() : "") +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      ((secure) ? "; secure" : "");
  
  if (!caution || (name + "=" + escape(value)).length <= 4000)
    document.cookie = curcookie;
  else
    if (confirm("cookie exceeds 4kb and will be cut!"))
      document.cookie = curcookie;
}

function getcookie(name)
{
  var prefix = name + "=";
  
  var cookiestartindex = document.cookie.indexof(prefix);
  if (cookiestartindex == -1) return null;
  
  var cookieendindex = document.cookie.indexof(";", cookiestartindex + prefix.length);
  if (cookieendindex == -1) cookieendindex = document.cookie.length;

  return unescape(document.cookie.substring(cookiestartindex + prefix.length, cookieendindex));
}

function deletecookie(name, path, domain)
{
  if (getcookie(name))
  {
    document.cookie = name + "=" +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=thu, 01-jan-70 00:00:01 gmt";
  }
}

function fixdate(date)
{
  var base = new date(0);
  var skew = base.gettime();
  
  if (skew > 0) date.settime(date.gettime() - skew);
}

function item(parent, text, depth)
{
  this.parent = parent;
  this.text = text;
  this.depth = depth;
}

function makearray(length)
{
  this.length = length;
}

function makedatabase()
{
  outline = new makearray(10);
  outline[0] = new item(true, 'html.it', 0);
  outline[1] = new item(false, '<a href="https://www.html.it/jscript">320 javascript</a>', 1);
  outline[2] = new item(true, 'graficà, 1);
  outline[3] = new item(false, '<a href="https://www.html.it/grafica/gif.htm">gif animate</a>', 2);
  outline[4] = new item(false, '<a href="https://www.html.it/grafica/sfondi.htm">background</a>', 2);
  outline[5] = new item(false, '<a href="https://www.html.it/java">200 applet java</a>', 1);
  outline[6] = new item(true, 'informatica italianà, 0);
  outline[7] = new item(false, '<a href="http://www.hwupgrade.it">hardware upgrade</a>', 1);
  outline[8] = new item(false, '<a href="http://www.in-it.com">sito ufficiale</a>', 1);
  outline[9] = new item(false, '<a href="http://www.freeonline.org">free on line</a>', 1);
  
  setstates();
  setimages();
}

function setstates()
{
  var storedvalue = getcookie("outline");
  if (!storedvalue)
  {
    for (var i = 0; i < outline.length; ++i)
    {
      if (outline[i].depth == 0)
        outline[i].state = true;
      else
        outline[i].state = false;
    }
  } else {
    // extract current states from cookie (0 => false, 1 => true) 
    for (var i = 0; i < outline.length; ++i)
    {
      if (storedvalue.charat(i) == '1')
        outline[i].state = true;
      else
        outline[i].state = false;
    }
  }
}

function setimages()
{
  for (var i = 0; i < outline.length; ++i)
  {
    if (outline[i].state)
      if (outline[i].parent)
        if (outline[i + 1].state) // outline[i] is exploded
          outline[i].pic = '<a href="javascript:toggle(' + i + ')"><img src="exploded.gif" border=0></a>';
        else
          outline[i].pic = '<a href="javascript:toggle(' + i + ')"><img src="collapsd.gif" border=0></a>';
      else // outline[i] is only a child (not a parent)
        outline[i].pic = '<img src="child.gif" border=0>';
  }
}

function toggle(num)
{
  for (var i = num + 1; i < outline.length && outline[i].depth >= outline[num].depth + 1; ++i) 
  {
    if (outline[i].depth == outline[num].depth + 1) 
      outline[i].state = !outline[i].state; // toggle state
  }
  setstorage();
  history.go(0);
}

function setstorage()
{
  var text = "";
  for (var i = 0; i < outline.length; ++i)
    text += (outline[i].state) ? "1" : "0";
  
  setcookie("outline", text);
}

makedatabase();
// -->
</script>

La riga di codice:

outline = new makeArray(10);

è di fondamentale importanza in quanto stabilisce il numero di elementi del menu, che in questo caso è pari a 10. Questo numero include sia le voci principali del menu, sia quelle minori. Nel caso in cui al numero di voci non corrispondesse il valore stabilito come new makeArray, la pagina darebbe messaggio di errore e lo script non potrebbe funzionare.

Ogni elemento è accompagnato da un valore "outline" progressivo, che da 0 arriva a 9. Le voci principali del menu sono contrassegnate da un valore logico true pari a 0.

outline[0] = new item(true, 'HTML.it', 0);
outline[6] = new item(true, 'INFORMATICA ITALIANA', 0)

Mentre le voci minori annidate all'interno di quelle principali sono contrassegnate da un valore logico false pari a 1.

outline[1] = new item(false, '<a href="https://www.html.it/jscript">320 Javascript</a>', 1);
outline[2] = new item(true, 'GRAFICA', 1);
outline[7] = new item(false, '<a href="http://www.hwupgrade.it">Hardware Upgrade</a>', 1);
outline[8] = new item(false, '<a href="http://www.in-it.com">Sito ufficiale</a>', 1);
outline[9] = new item(false, '<a href="http://www.freeonline.org">Free On Line</a>', 1);

Per annidare ulteriori voci principali all'interno di quelle visualizzate all'apertura della pagina è necessario assegnare un valore logico false pari a 2:

outline[3] = new item(false, '<a href="https://www.html.it/grafica/gif.htm">GIF animate</a>', 2);
outline[4] = new item(false, '<a href="https://www.html.it/grafica/sfondi.htm">Background</a>', 2);

In altre parole queste due voci non vengono annidate all'interno di quella principale "HTML.it" ma all'interno della voce "GRAFICA".

Impostato il codice nel tag <head> è necessario inserire il seguente codice nel punto della pagina dove si vuole visualizzare il menu:

Script da inserire nel <body> al posto del menu

<script language="javascript">
<!--
document.write('<pre><h4>');

for (var i = 0; i < outline.length; ++i)
{
  if (outline[i].state)
  {
    for (var j = 0; j < outline[i].depth * 3; ++j)
      document.write(' ');

    document.write(outline[i].pic, ' ', outline[i].text, '');
  } else {
    var previous = i;
    for (var k = i + 1; k < outline.length && outline[k].depth>= outline[previous].depth; ++k)
      ++i;
  }
}

document.write('</h4></pre>');
// -->
</script>

Ti consigliamo anche