Salve a tutti,
ho scritto una procedura JavaScript che crea un menu contestuale fino a 1000 livelli (sì, fino a mille livelli).
È banalissimo, ve lo voglio far vedere. Io però l'ho creato solo per IE. Se qualcuno avesse voglia di rendermelo portabile per gli altri browser, ne sarei contento (non sono un esperto di portabilità).
Questo è il codice della pagina che visualizza il menu:
E questo è un esempio di menu a 5 livelli:codice:<HTML> <HEAD> <SCRIPT Language="JavaScript" src="MenuArray.js"> </SCRIPT> <SCRIPT Language="JavaScript"> NS4=(document.layers) ? true : false; IE4=(document.all)?true:false; ver4 = (NS4 || IE4) ? true : false; function popup(ParentPopUp, IndentLev, e) { var xPos = ((NS4) ? e.pageX : event.x) - 2; // Salva la posizione del mouse. Il nuovo menu sarà qui. var yPos = ((NS4) ? e.pageY : event.y) - 2; if( !MenuItem[ParentPopUp] ) alert('Menu troppo alto'); // Solo se è sbagliato MenuArray.js else if ( MenuItem[ParentPopUp].Type == 'Link' ) alert('TipoMenu errato'); // Solo se è sbagliato MenuArray.js else { // Ha sottomenu. Li cerco e li scrivo in un div DHTML nella posizione del mouse NewTxt = '<DIV ID="Prova' + (IndentLev) + '" Style="padding:0 6 2 2; Position:absolute; Top:' + yPos + '; Left:' + xPos + ';">\n'; // ci scrivo tutti i sottoelementi for(i = 0; i < MenuItem[ParentPopUp].SubItems.length; i++) { Index = MenuItem[ParentPopUp].SubItems[i]; // cerco il sottoelemento if ( !MenuItem[Index] ) alert('Sottomenu non trovato'); // Solo se è sbagliato MenuArray.js else { Elmt = MenuItem[Index]; if ( Elmt.Type == 'SubMenu' ) { // se il sottoelemento è un menu scrivo il collegamento per poterlo disegnare NewTxt += '<A onClick="popup(' + Index + ', ' + (IndentLev + 1) + ', event);">' + Elmt.Title + '</A>\n'; } else { // Tipo = Link, ne scrivo il collegamento NewTxt += '' + Elmt.Title + '\n'; } } } //Next NewTxt += '</DIV>' // Aggiorno il Div di quel livello di menu document.all['Prova' + IndentLev].outerHTML = NewTxt; // se non esiste il livello successivo lo creo if ( !document.all['Prova' + (IndentLev + 1) ] ) document.body.innerHTML += '<DIV ID="Prova' + (IndentLev + 1) + '"></DIV>\n'; // se ci sono altri livelli successivi, li cancello (ovvero ci scrivo una stringa vuota) for (i = IndentLev + 1; i < 999; i++) { if (document.all['Prova' + i]) document.all['Prova' + i].outerHTML = '<DIV ID="Prova' + i + '"></DIV>\n'; else break; } } } function popdown(IndentLev) { document.all['Prova' + IndentLev].innerHTML = ''; } </SCRIPT> </HEAD> </BODY> <A onClick="popup(0, 0, event);">Menu</A> <DIV ID="Prova0"></DIV> <BODY>
Cioè, non dico altro: il cuore della generazione del menu sono solo 4 righe (la parte else del primo for)!!!codice:var MenuItem = new Array(); MenuItem[0] = new Object; MenuItem[0].Title = 'Parent Menu'; // Serve solamente per definire quali saranno i menu sul primo livello MenuItem[0].Type = 'SubMenu'; MenuItem[0].SubItems = new Array(); MenuItem[0].SubItems[0] = 1; MenuItem[1] = new Object; MenuItem[1].Title = '<DIV Style="background-color=#cccccc">Livello 1</DIV>'; MenuItem[1].Type = 'SubMenu'; MenuItem[1].SubItems = new Array(); MenuItem[1].SubItems[0] = 2; MenuItem[1].SubItems[1] = 7; MenuItem[1].SubItems[2] = 8; MenuItem[2] = new Object; MenuItem[2].Title = '<DIV Style="background-color=#cccccc">Scelta 1</DIV>'; MenuItem[2].Type = 'Link'; MenuItem[2].LinkTo = 'link1.htm'; MenuItem[3] = new Object; MenuItem[3].Title = '<DIV Style="background-color=#cccccc">Scelta 2</DIV>'; MenuItem[3].Type = 'Link'; MenuItem[3].LinkTo = 'link2.htm'; MenuItem[4] = new Object; MenuItem[4].Title = '<DIV Style="background-color=#cccccc">Scelta 3</DIV>'; MenuItem[4].Type = 'Link'; MenuItem[4].LinkTo = 'link3.htm'; MenuItem[5] = new Object; MenuItem[5].Title = '<DIV Style="background-color=#cccccc">Scelta 4</DIV>'; MenuItem[5].Type = 'Link'; MenuItem[5].LinkTo = 'link4.htm'; MenuItem[6] = new Object; MenuItem[6].Title = '<DIV Style="background-color=#cccccc">Scelta 5</DIV>'; MenuItem[6].Type = 'Link'; MenuItem[6].LinkTo = 'link5.htm'; MenuItem[7] = new Object; MenuItem[7].Title = '<DIV Style="background-color=#cccccc">Livello 2 - 2</DIV>'; MenuItem[7].Type = 'SubMenu'; MenuItem[7].SubItems = new Array(); MenuItem[7].SubItems[0] = 3; MenuItem[7].SubItems[1] = 4; MenuItem[8] = new Object; MenuItem[8].Title = '<DIV Style="background-color=#cccccc">Livello 2 - 3</DIV>'; MenuItem[8].Type = 'SubMenu'; MenuItem[8].SubItems = new Array(); MenuItem[8].SubItems[0] = 9; MenuItem[8].SubItems[1] = 10; MenuItem[9] = new Object; MenuItem[9].Title = '<DIV Style="background-color=#cccccc">Livello 3 - 1</DIV>'; MenuItem[9].Type = 'SubMenu'; MenuItem[9].SubItems = new Array(); MenuItem[9].SubItems[0] = 5; MenuItem[10] = new Object; MenuItem[10].Title = '<DIV Style="background-color=#cccccc">Livello 3 - 2</DIV>'; MenuItem[10].Type = 'SubMenu'; MenuItem[10].SubItems = new Array(); MenuItem[10].SubItems[0] = 6;
Naturalmente è migliorabile: ci vorrebbe che funzionasse tramite il mouseover, di modo che il menu si può cancellare (ora rimane attivo sulla pagina ad ethernum). Ma questo è semplice da fare.
Ora no, ma quando l'avrò fatto, metterò on line questa nuova versione.
Ciao a tutti!

Rispondi quotando