Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Menu contestuale

  1. #1

    Menu contestuale

    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:
    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>
    E questo è un esempio di menu a 5 livelli:
    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;
    Cioè, non dico altro: il cuore della generazione del menu sono solo 4 righe (la parte else del primo for)!!!
    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!
    Perché un poco sì, ma anche un poco no

  2. #2
    Ho corretto il codice. Ecco le novità:

    1: Ho fatto l'apparizione del menu con il passaggio del mouse
    2: Ho fatto in modo che spostando il mouse fuori dal menu questo sparisca
    3: Ho usato la possibilità di mettere tag HTML sulle posizioni di menu
    4: Ho utilizzato i fogli di stile incorporato per avere tutte le voci identiche

    Ecco le domande che mi sono rimaste:
    1: Come si fa il porting verso tutti i browser?
    2: Perché il codice
    <DIV id="A"><DIV id="B">xxxxxxx</DIV>
    <DIV id="C">y<SPAN align="right">z</SPAN></DIV></DIV>

    mi mette le lettere y e z appiccicate?
    3: Perché non funziona lo stile :link? Ho dovuto mettere lo stile menulink...

    Ecco la nuova pagina HTML:
    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;
      MaxIndentLev = 999;
      ActiveIndentLev = -1;
    
      function popup(ParentPopUp, IndentLev, XMin, e) {
        ActiveIndentLev = IndentLev;
    
        // Salva la posizione del mouse. Il nuovo menu sarà qui:
        var xPos = ((NS4) ? e.pageX : event.x) - 10;
        var yPos = ((NS4) ? e.pageY : event.y) - 10;
    
        // Se sono abbastanza spostato:
        if ( xPos >= XMin )
    
          // Controllo che l'oggetto MenuItem sia fatto bene
          if( !MenuItem[ParentPopUp] ) alert('Menu troppo alto');
          else if ( MenuItem[ParentPopUp].Type == 'Link' ) alert('TipoMenu errato');
          else {
            // Ha sottomenu. Li cerco e li scrivo in un div DHTML nella posizione del mouse
            NewTxt = '<DIV ID="Prova' + (IndentLev) + '" ' +
                     'Style="border:1px solid black; padding:0 0 0 0; ' +
                     'Position:absolute; Top:' + yPos + '; Left:' + xPos + ';" '+
                     'onMouseMove="ActiveIndentLev=' + (IndentLev + 1) + ';">\n';
    
            // ci scrivo tutti i sottoelementi
            for(i = 0; i < MenuItem[ParentPopUp].SubItems.length; i++) {
              Index = MenuItem[ParentPopUp].SubItems[i]; // cerco il sottoelemento
    
              // Controllo che l'elemento esista
              if ( !MenuItem[Index] ) alert('Sottomenu non trovato');
              else {
                Elmt = MenuItem[Index];
                if ( Elmt.Type == 'SubMenu' )
                  // Il sottoelemento è un menu. Scrivo il collegamento per poterlo aprire
                  NewTxt += '<Div Class="' + ((Elmt.Title.indexOf('<')>=0)?'MenuObject':'Menu') +
                            '" onMouseMove="popup(' + Index + ', ' + (IndentLev + 1) + ', ' +
                            (xPos + Elmt.MinX) + ', event);">' + Elmt.Title +
                            '<SPAN Align="Right">&gt;</SPAN></DIV>\n';
                else
                  // Il sottoelemento è un link, ne scrivo il collegamento
                  NewTxt += '<Div Class="' + ((Elmt.Title.indexOf('<')>=0)?'MenuObject':'Menulink') +
                            '" onMouseMove="ActiveIndentLev=' + (IndentLev + 1) + ';" ' +
                            'onClick="document.URL=\'' + Elmt.LinkTo.replace(/\\/g, '\\\\') + '\'">' + 
                            Elmt.Title + '</Div>\n';
              }
            }
    
            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';
          }
        else ActiveIndentLev -= 1; // PosX è troppo bassa. Cancello il menu successivo se c'è
    
        // se ci sono altri livelli successivi, li cancello (ovvero ci scrivo una stringa vuota)
        for (i = ActiveIndentLev + 1; i < MaxIndentLev; i++)
          if (document.all['Prova' + i])
            document.all['Prova' + i].outerHTML = '<DIV ID="Prova' + i + '"></DIV>\n';
          else break;
      }
    
      function popdown() { // Cancellazione di tutti i menu
        if ( ActiveIndentLev == -5 )
          // Cancello i menu solo se ho spostato il mouse per un po' sul vuoto...
          for (i = 0; i < MaxIndentLev; i++)
            if (document.all['Prova' + i])
              document.all['Prova' + i].outerHTML = '<DIV ID="Prova' + i + '"></DIV>\n';
            else break;
        else if (ActiveIndentLev >= 0 ) ActiveIndentLev = -1; else ActiveIndentLev -= 1;
      }
    </SCRIPT>
    <STYLE type="text/css">
    .Menu:link {
      background-color:#cccccc;
      padding:0 6 0 2;
      text-decoration: none;
      color:red;
      }
    .Menulink {
      background-color:#cccccc;
      padding:0 6 0 2;
      text-decoration: none;
      color:red;
      }
    .Menu {
      background-color:#cccccc;
      padding:0 6 0 2;
      text-decoration: none;
      color:black;
      }
    .MenuObject {
      background-color:#cccccc;
      padding:0 0 0 0;
      text-decoration: none;
      color:black;
      }
    </STYLE>
    </HEAD>
    <BODY onMouseMove="popdown();">
    <A onMouseMove="popup(0, 0, 30, event);">Menu</A>
    
    <A onMouseMove="popup(8, 0, 40, event);">AltroMenu</A>
    <DIV ID="Prova0"></DIV>
    </BODY>
    E questo è il nuovo esempio di costruzione di un menu:
    codice:
    var MenuItem = new Array();
    
    // L'Object 0 serve solamente per definire quali saranno i menu sul primo livello
    // È quello che fa finta di essere il collegamento sulla pagina HTML
    // Ovvero <A onMouseMove="popup(«0», 0, 30, event);">Menu</A>
    
    MenuItem[0] = new Object;
    MenuItem[0].Title = '';
    MenuItem[0].Type = 'SubMenu';
    MenuItem[0].SubItems = new Array();
    MenuItem[0].SubItems[0] = 1;
    
    MenuItem[1] = new Object;
      // Title È l'HTML di ciò che apparirà sul menù.
      // Ho scelto così perché ci posso mettere un'immagine, o qualsiasi altra cosa.
      // L'esempio può essere una cosa standard. Si consiglia di sostituirlo con un css
    MenuItem[1].Title = 'Livello 1';
    MenuItem[1].Type = 'SubMenu';    // Type o è SubMenu o è Link
    MenuItem[1].MinX = 40;           // Distanza tra l'origine del Div e dove appare il sottomenu
                                     // NB: deve essere minore della lunghezza del titolo!!!!
    MenuItem[1].SubItems = new Array();
    MenuItem[1].SubItems[0] = 2;     // Punta a un link
    MenuItem[1].SubItems[1] = 7;     // Punta a un sottomenu
    MenuItem[1].SubItems[2] = 8;
    
    MenuItem[2] = new Object;
      // Title È l'HTML di ciò che apparirà sul menù.
      // Ho scelto così perché ci posso mettere un'immagine, o qualsiasi altra cosa.
      // L'esempio può essere una cosa standard. Si consiglia di sostituirlo con un css
    MenuItem[2].Title = 'Scelta 1';
    MenuItem[2].Type = 'Link';
    MenuItem[2].LinkTo = 'link1.htm'; // A cosa punta la voce del menu
    
    MenuItem[3] = new Object;
    MenuItem[3].Title = 'Scelta 2';
    MenuItem[3].Type = 'Link';
    MenuItem[3].LinkTo = 'link2.htm';
    
    MenuItem[4] = new Object;
    MenuItem[4].Title = 'Scelta 3';
    MenuItem[4].Type = 'Link';
    MenuItem[4].LinkTo = 'link3.htm';
    
    MenuItem[5] = new Object;         // Esempio di utilizzo di HTML sul menu
    MenuItem[5].Title = '';
    MenuItem[5].Type = 'Link';
    MenuItem[5].LinkTo = 'link4.htm';
    
    MenuItem[6] = new Object;
    MenuItem[6].Title = 'Archivio Fotografico';
    MenuItem[6].Type = 'Link';        // NOTA: le barre rovesciate devono essere escapate!
    MenuItem[6].LinkTo = 'http:\\\\xoomer.virgilio.it\\lucmenci\\ArchivioFotografico';
    
    MenuItem[7] = new Object;
    MenuItem[7].Title = 'Livello 2 - 2';
    MenuItem[7].Type = 'SubMenu';
    MenuItem[7].MinX = 70;
    MenuItem[7].SubItems = new Array();
    MenuItem[7].SubItems[0] = 3;
    MenuItem[7].SubItems[1] = 4;
    
    MenuItem[8] = new Object;
    MenuItem[8].Title = 'Livello 2 - 3';
    MenuItem[8].Type = 'SubMenu';
    MenuItem[8].MinX = 70;
    MenuItem[8].SubItems = new Array();
    MenuItem[8].SubItems[0] = 9;
    MenuItem[8].SubItems[1] = 10;
    
    MenuItem[9] = new Object;
    MenuItem[9].Title = 'Livello 3 - 1';
    MenuItem[9].Type = 'SubMenu';
    MenuItem[9].MinX = 70;
    MenuItem[9].SubItems = new Array();
    MenuItem[9].SubItems[0] = 5;
    
    MenuItem[10] = new Object;
    MenuItem[10].Title = 'Livello 3 - 2';
    MenuItem[10].Type = 'SubMenu';
    MenuItem[10].MinX = 70;
    MenuItem[10].SubItems = new Array();
    MenuItem[10].SubItems[0] = 6;
    Perché un poco sì, ma anche un poco no

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.