Avatar billede cmau Nybegynder
23. oktober 2005 - 13:15 Der er 23 kommentarer og
1 løsning

Hvordan gør jeg sådan at der kun er en åben ad gangen?

Hejsa

Jeg er ved at lave en menu, med overskrifer når man så klikker på dem skal der være et billede ud for teksten med plus på, når man så klikker skal submenuen komme frem og billedet skal blive til et minus, javascriptet skal så tjekke om andre submenuer er åbne og hvis de er skal de lukkes, så der kun kan være en åben ad gangen.

Min kode indtil videre:

<script type="text/javascript">
<!--
function menu(submenu){
menus=document.getElementById('submenu_'+submenu);
menus.style.display=(menus.style.display=='none')?'block':'none';
}
-->
</script>



<p><img src="plus.gif"><a href="#" onClick="menu('1');">3!</a></p>
<div align="center" id="submenu_1" style="position:absolute;display:none;top:0px;left:0px;position:relative">
</div>



<p><img src="plus.gif"><a href="#" onClick="menu('2');">3!</a></p>
<div align="center" id="submenu_2" style="position:absolute;display:none;top:0px;left:0px;position:relative">
</div>



<p><img src="plus.gif"><a href="#" onClick="menu('3');">3!</a></p>
<div align="center" id="submenu_3" style="position:absolute;display:none;top:0px;left:0px;position:relative">
</div>
Avatar billede softspot Forsker
23. oktober 2005 - 13:20 #1
Du kan gemme en reference til den aktuelt åbne i en variabel og lukke denne (hvis nogen er åben) inden du åbner den nye...
Avatar billede cmau Nybegynder
23. oktober 2005 - 13:21 #2
Jeg tænkte også på noget med et array hvor jeg skev alle dem der fandtes i, hvor den så lukkede alle først også bagefter åbnede en han har valgt, men er ikke så god il array's :S
Avatar billede softspot Forsker
23. oktober 2005 - 13:22 #3
Noget i stil med dette:

<script type="text/javascript">
<!--
var isOpen = null;
function menu(submenu){
  if(isOpen) isOpen.style.display='none';
  menus=document.getElementById('submenu_'+submenu);
  menus.style.display=(menus.style.display=='none')?'block':'none';
  if(menus.style.display!='none') isOpen = menus;
}
-->
</script>
Avatar billede softspot Forsker
23. oktober 2005 - 13:24 #4
Hvis der kun kan være en åben ad gangen, er der ikke nogen grund til at lave arrays og fedte rundt med...
Avatar billede cmau Nybegynder
23. oktober 2005 - 13:26 #5
jo det virker faktisk, men hvis man klikker på den samme igen, skal den gerne lukkes, så ingen er åbne, som den gjorde det først.
Avatar billede softspot Forsker
23. oktober 2005 - 13:31 #6
<script type="text/javascript">
<!--
var isOpen = null;
function menu(submenu){
  if(isOpen) isOpen.style.display='none';
  menus=document.getElementById('submenu_'+submenu);
  menus.style.display=(menus.style.display=='none')?'block':'none';
  if(menus.style.display!='none') isOpen = menus;
  else isOpen = null;
}
-->
</script>
Avatar billede softspot Forsker
23. oktober 2005 - 13:31 #7
Så bliver isOpen sat til null, hvis du lige lukkede den der var åben...
Avatar billede cmau Nybegynder
23. oktober 2005 - 13:34 #8
Den bliver stadig ikke lukket igen.
Avatar billede softspot Forsker
23. oktober 2005 - 13:45 #9
Der er i øvrigt lidt konflikt i din style på de forskellige menupunkter

style="position:absolute;display:none;top:0px;left:0px;position:relative"

du har både position:absolute og position:relative... det skal være enten eller (jeg vil tro du mener position:absolute).
Avatar billede softspot Forsker
23. oktober 2005 - 13:46 #10
Jeg forstår ikke helt... siger du at de ændringer jeg har foreslået har gjort at det ikke fungerer længere...?
Avatar billede cmau Nybegynder
23. oktober 2005 - 13:50 #11
position:relative og position:absolute skal bruges begge 2 ellers er div'erne oppe i hjørnet.

Men nej det du har ændret har ikke ødelagt det hele, det eneste fejl der er nu er at den ikke kan lukkes, kun ved at åbne en anden.
Avatar billede softspot Forsker
23. oktober 2005 - 13:55 #12
Ja, jeg kan godt se fejlen nu. Jeg har jo faktisk lukket for elementet inden man kan checke på om det et åben eller lukket, så jo jeg havde ødelagt det. Det har jeg dog rådet bod på her :)

    <script type="text/javascript">
    <!--
    var isOpen = null;
    function menu(submenu){
      if(isOpen && isOpen!=submenu)
        document.getElementById('submenu_'+isOpen).style.display='none';
       
      menus = document.getElementById('submenu_'+submenu);
      menus.style.display = ((menus.style.display=='none')?'block':'none');
     
      if(menus.style.display!='none')
        isOpen = submenu;
      else
        isOpen = null;
      }
    -->
    </script>
Avatar billede cmau Nybegynder
23. oktober 2005 - 13:57 #13
Tusind tak, nu funker det, kunne du ikke tænke dig at skrive en kommentar ud for hver linje, så jeg får ldit mere ud af det?

Også lige smid et svar:D
Avatar billede softspot Forsker
23. oktober 2005 - 13:58 #14
div'erne er oppe i hjørnet fordi du positionerer dem oppe i hjørnet med left:0px og top:0px...(?)

relative betyder bare flowkontrol, hvilket gør at left og top ikke har nogen effekt. Så hvis du vil have flowkontrol kan du undlade "position:absolute;display:none;top:0px;left:0px" fra dine styles...
Avatar billede cmau Nybegynder
23. oktober 2005 - 14:01 #15
Men jeg ønsker faktisk ikke at de er i hjørnet, men lige under menu overskriften, måske 5-10 pix længere mod midten
Avatar billede softspot Forsker
23. oktober 2005 - 14:02 #16
<script type="text/javascript">
<!--
// initialiser variablen så der ikke er nogen åben fra starten
var isOpen = null;
function menu(submenu){
  // hvis der er en åben menu og det ikke er den aktuelt valgte, så luk den.
  if(isOpen && isOpen!=submenu)
    document.getElementById('submenu_'+isOpen).style.display='none';
       
  menus = document.getElementById('submenu_'+submenu);
  menus.style.display = ((menus.style.display=='none')?'block':'none');
 
  // Hvis menuen ikke er blevet lukket, så gem den til næste åben/luk-handling
  if(menus.style.display!='none')
    isOpen = submenu;
  else // ellers nulstil referencen, da der ikke er nogen åben menu længere.
    isOpen = null;
}
-->
</script>
Avatar billede softspot Forsker
23. oktober 2005 - 14:06 #17
Fair nok, men jeg siger bare at position:absolute ikke fungerer sammen med position:relative - de udelukker hinanden :)

Du kan evt. benytte margin og padding til at flytte lidt med elementet, men altså ikke de to positioneringer i kombination.
Avatar billede cmau Nybegynder
23. oktober 2005 - 14:09 #18
Hov nu glemte jeg jo også lige at sige det med at billedet skal skifte igen.
Avatar billede softspot Forsker
23. oktober 2005 - 14:22 #19
Så skal du også have et id på dine billeder, så de kan findes igen, når man åbner/lukker en menu. Det er lettest hvis du bruger værdien fra parameteren du sender med i kaldet til funktionen menu:

<p><img id="img_1" src="plus.gif"><a href="#" onClick="menu('1');">3!</a></p>
<div align="center" id="submenu_1" style="display:none;position:relative">
</div>

og så tilpasser scriptet:

<script type="text/javascript">
<!--
// initialiser variablen så der ikke er nogen åben fra starten
var isOpen = null;
function menu(submenu){
  // hvis der er en åben menu og det ikke er den aktuelt valgte, så luk den.
  if(isOpen && isOpen!=submenu) {
    document.getElementById('submenu_'+isOpen).style.display='none';
    // sæt tilstanden for det lukkede menupunkts billede
    document.getElementById('img_'+isOpen).src = 'plus.gif';
  }

  menus = document.getElementById('submenu_'+submenu);
  menus.style.display = ((menus.style.display=='none')?'block':'none');

  // sæt tilstanden for det aktuelt klikkede menupunkts billede
  document.getElementById('img_'+submenu).src = ((menus.style.display=='none')?'minus.gif':'plus.gif');

  // Hvis menuen ikke er blevet lukket, så gem den til næste åben/luk-handling
  if(menus.style.display!='none')
    isOpen = submenu;
  else // ellers nulstil referencen, da der ikke er nogen åben menu længere.
    isOpen = null;
}
-->
</script>
Avatar billede cmau Nybegynder
23. oktober 2005 - 14:32 #20
Det virker vist ikke, prøv selv med min kode her.

<script type="text/javascript">
<!--
// initialiser variablen så der ikke er nogen åben fra starten
var isOpen = null;
function menu(submenu){
  // hvis der er en åben menu og det ikke er den aktuelt valgte, så luk den.
  if(isOpen && isOpen!=submenu) {
    document.getElementById('submenu_'+isOpen).style.display='none';
    // sæt tilstanden for det lukkede menupunkts billede
    document.getElementById('img_'+isOpen).src = 'REKLAME GRÅ.gif';
  }

  menus = document.getElementById('submenu_'+submenu);
  menus.style.display = ((menus.style.display=='none')?'block':'none');

  // sæt tilstanden for det aktuelt klikkede menupunkts billede
  document.getElementById('img_'+submenu).src =

((menus.style.display=='none')?'REKLAME.gif':'REKLAME GRÅ.gif');

  // Hvis menuen ikke er blevet lukket, så gem den til næste åben/luk-handling
  if(menus.style.display!='none')
    isOpen = submenu;
  else // ellers nulstil referencen, da der ikke er nogen åben menu længere.
    isOpen = null;
}
-->
</script>



<img id="img_1" src="REKLAME GRÅ.gif" width="10" height="10" alt=""><a href="#"

onClick="menu('1');">1!</a><br>
<div id="submenu_1" style="display:none;">
- df<br>
- df<br>
- df<br>
- df<br>
- df<br>
- df
</div>

<img id="img_2" src="REKLAME GRÅ.gif" width="10" height="10" alt=""><a href="#"

onClick="menu('2');">2!</a><br>
<div id="submenu_2" style="display:none;">
- df<br>
- df<br>
- df<br>
- df<br>
- df<br>
- df
</div>

<img id="img_3" src="REKLAME GRÅ.gif" width="10" height="10" alt=""><a href="#"

onClick="menu('3');">3!</a><br>
<div id="submenu_3" style="display:none;">
- df<br>
- df<br>
- df<br>
- df<br>
- df<br>
- df
</div>
Avatar billede softspot Forsker
23. oktober 2005 - 14:40 #21
Det virker super fint... hvis du lader være med at bytte rundt på billederne i scriptet.

  document.getElementById('img_'+submenu).src = ((menus.style.display=='none')?'REKLAME GRÅ.gif':'REKLAME.gif');
Avatar billede softspot Forsker
23. oktober 2005 - 14:41 #22
Hvis altså vi er enige om at REKLAME GRÅ.gif er for lukkede menupunkter...
Avatar billede cmau Nybegynder
23. oktober 2005 - 14:44 #23
Så virker det sgu, tusind tak
Avatar billede softspot Forsker
23. oktober 2005 - 14:46 #24
Velbekomme - og tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester