[Script] JavaScript - Dropdownmenu

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Murdoc, 5. Dezember 2007 .

  1. 5. Dezember 2007
    JavaScript - Dropdownmenu

    es gibt ja immer wieder fragen danach, deswegen hier eine super lösung dazu von mir:

    --update
    dank prototype und mehr erfahrung hab ich die dropdown-geschichte mal von 221 zeilen auf 40 zeilen reduziert.

    Code:
    var mcMenu = {
     timeout: null,
     clearTimeout: function() {
     window.clearTimeout(this.timeout);
     this.timeout = null;
     },
     
     handleSubmenu: function(menuID, link) {
     $$('ul.submenu').each(function(menu) {
     $(menu).hide();
     });
     
     var menu = $(menuID);
     if(menu) {
     menu.show();
     menu.setAttribute('alt', 'not-active');
     menu.observe('mouseover', function() {
     menu.setAttribute('alt', 'active');
     if(mcMenu.timeout != null)
     mcMenu.clearTimeout();
     });
     
     menu.observe('mouseout', function() {
     menu.setAttribute('alt', 'not-active');
     
     mcMenu.timeout = window.setTimeout(function() {
     if(menu.getAttribute('alt') == 'not-active')
     menu.hide();
     }, 500);
     });
     
     link.observe('mouseout', function() {
     setTimeout(function() {
     if(menu.getAttribute('alt') == 'not-active')
     menu.hide();
     }, 250);
     });
     }
     }
    };
    und so gehts:
    HTML:
    <a href="#" onmouseover="mcMenu.handleSubmenu($('einmenu'), $(this));">link1.1</a>
    <ul class="submenu" id="einmenu" style="display:none;">
     <li><a href="#">link1.2</li>
    </ul>
    
    <a href="#" onmouseover="mcMenu.handleSubmenu($('einmenu2'), $(this));">link2.1</a>
    <ul class="submenu" id="einmenu2" style="display:none;">
     <li><a href="#">link2.2</li>
    </ul>
    
    zum anpassen einfach css benutzen. die submenus müssen ja eh die klasse "submenu" haben




    Spoiler
    ALT!

    ein beispiel gibts auf http://coding.murdoc.eu/dropdown/

    das script:
    Code:
    /**************************************
    * dropdown menu script von murdoc
    * kontakt: murdocc3@web.de
    * version 1.0.3
    *
    * log
    * -------
    * version 1.0.3
    * - dummen fehler bei closeHandle behoben
    * - isset() hinzugefügt
    * - dropItem() hinzugefügt und unregister() drauf angepasst
    * - attribut subc bei items hinzugefügt wo das onclick-event vom script geändert wurde
    *
    * version 1.0.2
    * - oneMenuIsOpen funktion hinzugefügt (menus bleiben offen)
    * - for syntax fehler in fetch() behoben
    *
    * version 1.0.1
    * - unregister() hinzugefügt
    *
    * version 1.0.0 
    * - release ;)
    */
    var dropDown = new Object();
    dropDown.menus = new Object();
    dropDown.shutdownTimeout = '';
    dropDown.oneMenuIsOpen = false;
    
    /**************************************
    * registiert ein dropdownmenu
    *
    * @param (string) id (element id)
    * @return id
    */
    dropDown.register = function(id) {
     var element = document.getElementById(id);
     if(element) {
     this.menus[id] = {
     'element' : element,
     'items' : new Array()
     }
     
     return id;
     } else {
     alert('Dropdown Menu - Fehler: Element id: "' + id + '" nicht gefunden!');
     }
    }
    
    /***************************************
    * testen ob menu existiert
    *
    * @param (string) id (menu id)
    */
    dropDown.isset = function(id) {
     return (typeof this.menus[id] != 'undefined' && this.menus[id] != null); 
    }
    
    /***************************************
    * fügt ein neues item zu einem menu hinzu
    *
    * @param (string) id (item id)
    * @param (string) menu (menu id)
    * @param (bool) ac (auto close => bei klick schließen)
    */
    dropDown.addItemById = function(id, menu, ac) {
     if(typeof this.menus[menu] == 'undefined') {
     alert('Kein Dropdownmenu mit id: "' + menu + '" registiert!');
     } else {
     var item = document.getElementById(id);
     if(item) {
     if(ac === true) {
     item.onclick = function() {
     dropDown.hideItems(menu);
     dropDown.oneMenuIsOpen = false;
     return true;
     }
     
     item.subc = 'added';
     }
     this.menus[menu]['items'].push(item);
     }
     }
    }
    
    /****************************************
    * löscht ein item
    *
    * @param (string) id (item eintragsnummer)
    * @param (string) menu (menu id)
    */
    dropDown.dropItem = function(id, menu) {
     if(typeof this.menus[menu] != 'undefined') {
     item = this.menus[menu]['items'][id];
     this.menus[menu]['items'][id] = null;
     if(item.onclick && item.subc == 'added') item.onclick = function() { return true; }
     item.onmouseover = function() { return true; }
     item.onmouseout = function() { return true; }
     item.style.display = '';
     delete item;
     }
    }
    
    /****************************************
    * löscht ein menu
    *
    * @param (string) id (menu id)
    */
    dropDown.unregister = function(id) {
     if(typeof this.menus[id] != 'undefined') {
     for(i in this.menus[id]['items']) {
     this.dropItem(i, id);
     }
     
     this.menus[id]['element'].onclick = function() { return true; }
     this.menus[id]['element'].onmouseover = function() { return true; }
     this.menus[id]['element'].onmouseout = function() { return true; }
     this.menus[id] = null;
     }
    }
    
    /****************************************
    * erstellt ein menu
    *
    * @param (string) id (menu id)
    */
    dropDown.fetch = function(id) {
     if(typeof this.menus[id] != 'undefined') {
     for(i in dropDown.menus[id]['items']) {
     this.menus[id]['items'][i].style.display = 'none';
     
     this.menus[id]['items'][i].onmouseout = function() {
     dropDown.shutdownTimeout = window.setTimeout(''
     + 'dropDown.hideItems(\'' + id + '\');'
     + '\ndropDown.oneMenuIsOpen = false;'
     , 1000
     );
     }
     
     this.menus[id]['items'][i].onmouseover = function() {
     window.clearTimeout(dropDown.shutdownTimeout);
     dropDown.oneMenuIsOpen = true;
     }
     }
     
     this.menus[id]['element'].onclick = function() {
     if(dropDown.menus[this.id]['items'][0].style.display == 'none') {
     dropDown.showItems(this.id);
     dropDown.oneMenuIsOpen = true;
     } else {
     dropDown.hideItems(this.id);
     dropDown.oneMenuIsOpen = false;
     }
     
     dropDown.closeMenus(this.id);
     
     return false;
     }
     
     this.menus[id]['element'].onmouseout = function() {
     dropDown.shutdownTimeout = window.setTimeout(''
     + 'dropDown.hideItems(\'' + this.id + '\');'
     + '\ndropDown.oneMenuIsOpen = false;'
     , 1000
     );
     }
     
     this.menus[id]['element'].onmouseover = function() {
     window.clearTimeout(dropDown.shutdownTimeout);
     if(dropDown.oneMenuIsOpen === true) {
     dropDown.showItems(this.id);
     dropDown.closeMenus(this.id);
     }
     }
     }
    }
    
    /********************************************
    * schließt alle items eines menus
    *
    * @param (string) id (menu id)
    */
    dropDown.hideItems = function(id) {
     if(typeof this.menus[id] != 'undefined') {
     for(i in this.menus[id]['items']) {
     if(this.menus[id]['items'][i] != null) {
     this.menus[id]['items'][i].style.display = 'none';
     }
     }
     }
    }
    
    /********************************************
    * öffnet alle items
    * 
    * @param (string) id (menu id)
    */
    dropDown.showItems = function(id) {
     if(typeof this.menus[id] != 'undefined') {
     for(i in this.menus[id]['items']) {
     if(this.menus[id]['items'][i] != null) {
     this.menus[id]['items'][i].style.display = '';
     }
     }
     dropDown.oneMenuIsOpen = true;
     }
    }
    
    /*********************************************
    * schließ offene menus außer das der angegebenen id
    *
    * @param (string) expID (menu id)
    */
    dropDown.closeMenus = function(expID) {
     if(typeof expID == 'undefined') expID = null;
     for(i in this.menus) {
     if(i == expID) continue;
     else {
     this.hideItems(i);
     }
     }
    }
    wie funktioniert es:
    HTML:
    <html>
    <head>
    <script type="text/javascript" src="./meins/framework/javascript/dropdown.menu.js"></script>
    </head>
    <body>
     <a href="#" id="menu_handle1">Klick</a>
     <a href="#" id="menu_handle2">Klick2</a>
     <div id="menu1">
     <p>blabla</p>
     </div>
     <div align="right" id="menu2">
     <p>blasbla222</p>
     </div>
     <div id="submenu1">
     <p>aadsf</p>
     </div>
     <script type="text/javascript">
     var menu; //variable definieren
     
     //ein menu registrieren
     menu = dropDown.register('menu_handle1'); //einfach die id angeben
     
     //jetzt ein submenu zum menu hinzufügen
     dropDown.addItemById('menu1', menu, true); //true = bei klick schließen
     dropDown.addItemById('menu2', menu); //ohne true bleibts offen
     
     //menu erstellen (erstellt verknüpfungen usw)
     //damit alle menus mit einander agieren können
     dropDown.fetch(menu);
     
     //noch ein menu registrieren
     menu = dropDown.register('menu_handle2'); //wieder einfach die id angeben
     dropDown.addItemById('submenu1', menu); //id des submenus
     dropDown.fetch(menu); //auch deses menu erstellen
     
     //ein vorhandenes menu überschreiben
     dropDown.unregister('menu_handle1'); //erst löschen
     menu = dropDown.register('menu_handle1'); //dann neu registrieren
     dropDown.addItemById('menu1', menu);
     dropDown.fetch(menu);
     </script>
    </body>
    </html>
    submenus schließen sich (wenn gewollt) bei klick oder wenn das submenu 1ne sekunde lang mit der maus verlassen wird.
    viel spaß damit.
     
  2. 25. Dezember 2007
    AW: JavaScript - Dropdownmenu

    Hi

    Genau nach so etwas in der Art suche ich. Nur muss der Browser dazu ja auf jeden fall javascript unterstützen.

    Hast du auch ne Lösung für eine Variante, mit "Go" bzw. "Los" Button daneben zum Absenden?

    Also so sollte es aussehen:

    {bild-down: http://www.pic-upload.de/25.12.07/8srn.GIF}



    thx
     
  3. 26. Dezember 2007
    AW: JavaScript - Dropdownmenu

    @commander: Meinst du jetzt mit einem Dropdown Menü (also so, wie's du hier auf dem screenshot hast)?
     
  4. 26. Dezember 2007
    AW: JavaScript - Dropdownmenu

    @ commander

    Das was du da hast ist nen einfaches Formular, dazu braucht man kein JavaScript.
    Hier: http://de.selfhtml.org/html/formulare/auswahl.htm selber schlau machen.

    Das ganze kann man dann per CSS Stylen.

    @ Murdoc

    saubere Arbeit
    Der IE5 spackt bei dem Ding leider total, aber was solls, die Links kann man erreichen.
     
  5. 29. Januar 2008
    AW: JavaScript - Dropdownmenu

    murdoc dein link funzt nicht mehr. würds mir gern mal anschauen, thx
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.