#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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)? + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#5 29. Januar 2008 AW: JavaScript - Dropdownmenu murdoc dein link funzt nicht mehr. würds mir gern mal anschauen, thx + Multi-Zitat Zitieren