webForumDet fria alternativet

"Unobtrusive - onclick" och dölja submeny

JavaScript

2 svar · 666 visningar · startad av avbryt

Medlem sedan mars 20122 inlägg
Frågan#1

Hej,
detta funkar bra med två undantag:

-Vill att submenyerna ska vara dolda från början vilket jag ej fixar av nån anledning. Kan döljas via CSS men får då inte fram dem när jag klickar på menyn. Har oxå försökt på olika sätt via javascript...
-jag tycker att detta med onclick externt är knepigt.
Får inte fason på var onclick skall vara

<script type="text/javascript">

function showMenu(nr) { 
   
var element = document.getElementById("subMenu"+nr); 
if (element.style.display == "block") 
           {
           var show = false; // hide
           }
else 
           {
           var show = true; // show
           }

for (var i=0;i<2;i++) { 
         HideMenu(i,false); // hide
         HideMenu(nr,show); //show
         } 
}// End showMenu

function HideMenu(nr,show) { 

 var element = document.getElementById("subMenu"+nr); 
if (show) 
       {
       element.style.display = "block"; // show
       }
else 
      {
      element.style.display = "none"; // hide
      }
} 
window.onload = showMenu;

HTML

<div id="menu">
<ul id="Menu">
        <li><span onclick="showMenu(0)">Music</span>
           <ul id="subMenu0">
              <li>good</li> 
	<li>bad</li>
           </ul>
         </li>

        <li><span onclick="showMenu(1)">Film</span>
           <ul id="subMenu1">
             <li>good</li> 
             <li>bad</li>
           </ul>
       </li>
    </ul> 
</div>

:q :q

Medlem sedan aug. 20039 340 inlägg
#2

Det du bör göra är att loopa genom elementen, och kolla om id matchar. Gör det inte det, stäng menyn, annars öppna den. För detta syfte räcker följande kod got och väl.

<script type="text/javascript">

function showMenu(nr) {

	for(var i=0; i<4; i++){
		var element = document.getElementById("subMenu"+i);

		if (i==nr){
			element.style.display = "block"; // show
		}else{
			element.style.display = "none"; // hide
		}
	}
}
window.onload = showMenu;

</script>

HTML

<div id="menu_outer">
<ul id="menu_ul">
        <li><span onclick="showMenu(-1)">Close menu</span>
       </li>

        <li><span onclick="showMenu(0)">Music</span>
           <ul id="subMenu0">
              <li>good</li>
              <li>bad</li>
           </ul>
         </li>

        <li><span onclick="showMenu(1)">Film</span>
           <ul id="subMenu1">
             <li>good</li>
             <li>bad</li>
           </ul>
       </li>

        <li><span onclick="showMenu(2)">Forums</span>
           <ul id="subMenu2">
             <li>good</li>
             <li>bad</li>
           </ul>
       </li>

        <li><span onclick="showMenu(3)">Games</span>
           <ul id="subMenu3">
             <li>good</li>
             <li>bad</li>
           </ul>
       </li>

    </ul>
</div>

Här har jag även ändrat id på menu och menu - man bör inte ha flera element med samma id.

Men! Det kanske går att automatisera processen så du slipper sitta och hålla koll på individuella ID och uppdatera "for(var i=0; i<4; i++){" om du lägger till något i menyn...

<script type="text/javascript">

function showMenu(nr) {
	var element;

	// Villkoret i<1000 är en säkerhetsspärr ifall kontrollen inuti i loopen skulle sluta fungera av någon anledning.
	for(var i=0; i<1000; i++){
		// Leta efter elementet ifråga
		element = document.getElementById("subMenu"+i)

		// Om elementet saknas har vi nått slutet av listan. Lämna loopen.
		if (!element)
			break;

		// '&& element.style.display == "none"' gör att listan stängs om du klickar en andra gång
		if (i==nr && element.style.display == "none"){
			element.style.display = "block"; // show
		}else{
			element.style.display = "none"; // hide
		}
	}
}

function initMenu(){
	var menu_ul_obj = document.getElementById("menu_ul");

	// Loopa igenom listföremålen
	// Varje körning av loopen plockar ut ett barn till menu_ul (ett li-element)
	for(var i=0; i<menu_ul_obj.children.length; i++){
		// Plocka ut rubriken
		var head = menu_ul_obj.children[i].getElementsByClassName("menu_item_head");

		// Om rubriken existerar, lägg till en event-hanterare.
		if(head[0]){
			head[0].onclick = new Function(   "showMenu(" + i + ");"   );
		}

		// Plocka ut listan
		var list = menu_ul_obj.children[i].getElementsByClassName("submenu_ul");

		// Om listan existerar, ge den ett id, samt göm den.
		if(list[0]){
			list[0].id = "subMenu"+i;
			list[0].style.display = "none"; // hide
		}

	}

}

window.onload = initMenu;

</script>

<div id="menu_outer">
<ul id="menu_ul">
        <li><span class="menu_item_head">Music</span>
           <ul class="submenu_ul">
              <li>good</li>
              <li>bad</li>
           </ul>
         </li>

        <li><span class="menu_item_head">Film</span>
           <ul class="submenu_ul">
             <li>good</li>
             <li>bad</li>
           </ul>
       </li>

        <li><span class="menu_item_head">Forums</span>
           <ul class="submenu_ul">
             <li>good</li>
             <li>bad</li>
           </ul>
       </li>

        <li><span class="menu_item_head">Games</span>
           <ul class="submenu_ul">
             <li>good</li>
             <li>bad</li>
           </ul>
       </li>

    </ul>
</div>

Välkommen till forumet förresten...

Medlem sedan mars 20122 inlägg
#3

Hej!

Jag har några frågor och tankar kring det du har gjort som jag vill formulera
så jag återkommer imorgon då jag är piggare!

(y)

292 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
158 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
157 ms — ändringar (db)