Podczas tworzenia menu nawigacyjnego do swojej strony, napotkalem nastepujace problemy:
1. Aby otworzyc menu zwyklym onClick'iem, nalezy kliknac button az dwa razy - niestety za pierwszym kompletnie nic sie nie dzieje, co moze byc nie tak ?
2. Klikniecie tla elementu w menu powoduje zamkniecie menu. Mozna to zauwazyc na przykladzie "Menu 1", gdzie "1" to rodzic, a "2" i "3" to elementy podlegle. Probowalem przeroznych sposobow aby klikniecie tych elementow nie powodowalo chowania menu, mimo ze moje starania spelzly na niczym, nasunal mi sie prosty wniosek. Przyczyna jest osadzenie elementow menu w znacznikach. Pytanie brzmi wiec, jak brac pod uwage divy zawarte w divie ?
Chodzi o ta funkcje:
document.onclick = function(e) { var obj = document.all ? event.srcElement : e.target; if (obj != menu_id && obj != ch) { var opened_menu = registered_menus.pop(); var close_menu_id = document.getElementById("sub" + opened_menu); close_menu_id.style.display = "none"; return false; } }
Link do menu: klik.
Caly kod:
<script type="text/javascript"> var registered_menus = Array(); //////////////////////// // Pokaz / ukryj menu //////////////////////// function showMenu(ch) { var menu_ident = ch.id; var menu_name = "sub" + menu_ident; var menu_id = document.getElementById(menu_name); var menu_width = menu_id.style.width.substring(0,3); var button_width = document.getElementById(menu_ident).offsetWidth; var button_height = document.getElementById(menu_ident).offsetHeight; document.onclick = function(e) { var obj = document.all ? event.srcElement : e.target; if (obj != menu_id && obj != ch) { var opened_menu = registered_menus.pop(); var close_menu_id = document.getElementById("sub" + opened_menu); close_menu_id.style.display = "none"; return false; } } if (menu_id.style.display == 'none') { var opened_menu = registered_menus.pop(); var close_menu_id = document.getElementById("sub" + opened_menu); if (opened_menu != null) { close_menu_id.style.display = "none"; } registered_menus.push(ch.id) menu_id.style.left = getposOffset(ch, 'left'); menu_id.style.top = getposOffset(ch, 'top') + button_height + "px"; menu_id.style.display = "block"; return false; } else { menu_id.style.display = "none" return false; } } /////////////////////////// // Ustal wspolrzedne menu /////////////////////////// function getposOffset(ch, t) { var totaloffset = (t == 'top') ? ch.offsetTop : ch.offsetLeft; var offParent = ch.offsetParent; while (offParent != null) { if(t == 'left') { totaloffset = totaloffset + offParent.offsetLeft; } else { totaloffset = totaloffset + offParent.offsetTop; } offParent = offParent.offsetParent; } return totaloffset; } </script> <div id="sub_menu_1" class="menu">1. </div> <div id="sub_menu_2" class="menu"> </div>