Hvis man har åbnet et menupunkt med tilhørende undermenuer og herefter åbner et andet menupunkt skal den første "colapse", således at man ikke hele tiden åbne og lukke menupunkter.
<SCRIPT> function MenuClick(MenuID) { var txt = document.all("txt_" + MenuID); if (txt.style.display == 'none') { txt.style.display = ''; } else { txt.style.display = 'none'; } } </SCRIPT>
</HEAD> <BODY BGCOLOR="#FFFFFF">
<% Function BygUnderMenu(MenuID) UnderSQL = "SELECT ID, Navn, Link FROM Menu WHERE MenuID = " & MenuID & " ORDER BY [Order]" Call OpenRS(Conntemp,UnderSQL,UnderRS)
Response.Write "<DIV ID=""txt_" & MenuID & """ STYLE=""display: none; margin-left: 10px;"">" While Not UnderRS.EOF If CountSubs(UnderRS("ID")) > 0 Then Response.Write "<A HREF=""#"" OnClick=""MenuClick(" & UnderRS("ID") & ")""><B>" & UnderRS("Navn") & "</B></A><BR>" BygUnderMenu UnderRS("ID") Else Response.Write "<A HREF=""" & UnderRS("Link") & """ TARGET="""">" & UnderRS("Navn") & "<BR>" End If UnderRS.MoveNext Wend Response.Write "</DIV>" End Function
Function CountSubs(MenuID) CountSQL = "SELECT ID FROM Menu WHERE MenuID = " & MenuID & "" Call OpenRS(Conntemp,CountSQL,CountRS) CountSubs = CountRS.RecordCount End Function
LavDatabase Conntemp
SQL = "SELECT ID, Navn, Link FROM Menu WHERE MenuID = 0 ORDER BY [Order]" Call OpenRS(Conntemp,SQL,RS)
If RS.BOF AND RS.EOF Then Response.Write "FEJL" Else RS.MoveFirst While Not RS.EOF If CountSubs(RS("ID")) > 0 Then Response.Write "<A HREF=""#"" OnClick=""MenuClick(" & RS("ID") & ")""><B>" & RS("Navn") & "</B></A><BR>" BygUnderMenu RS("ID") Else Response.Write "<A HREF=""" & RS("Link") & """>" & RS("Navn") & "<BR>" End If RS.MoveNext Wend End If
Nu har du jo to undermenuer så det gør det vist lidt "sjovere" Men det må kunne lade sig gøre ved at rette i denne her vil jeg tro: ------------------ <SCRIPT> function MenuClick(MenuID) { var txt = document.all("txt_" + MenuID); if (txt.style.display == 'none') { txt.style.display = ''; } else { txt.style.display = 'none'; } } </SCRIPT> --------------- Hver gang den kaldes så folder den en menu ud eller ind Så den kan jo laves om til en løkke som folder alle ind og een ud hvis du forstår?
fx noget ala ---------------- <SCRIPT> function MenuClick(MaxID, MenuID) { for (i = 0; i <= MaxID; i++){ var txt = document.all("txt_" + i); txt.style.display == 'none'; } var txt = document.all("txt_" + MenuID); txt.style.display = ''; } </SCRIPT>
Den vil så løbe alle ID igennem og lukke dem for dernæst at åbne det ønskede ID Men da du har 2 undermenuer så nytter det ikke noget at hvis man klikker på en undermenu at den så lukker "over menuen", Men da de nummereres i rækkefølge så må overmenuen have ID = MenuID-1 ----------------- <SCRIPT> function MenuClick(MaxID, MenuID) { for (i = 0; i <= MaxID; i++){ var txt = document.all("txt_" + i); txt.style.display == 'none'; } if (MenuID == 1){ var txt = document.all("txt_" + MenuID); txt.style.display = ''; }else{ var txt = document.all("txt_" + (MenuID-1)); txt.style.display = ''; var txt = document.all("txt_" + MenuID); txt.style.display = ''; } } </SCRIPT>
Derudover skal der så laves en sql som tæller alle id´er..således at alle de steder du nu kalder MenuClick(" & RS("ID") & ") Skal kalde MenuClick("& MaxID & "," & RS("ID") & ") ---------- Håber du kan gennemskue min ide til en løsning :o)
Du er nød til at vide hvor mange ID du har at gøre godt med for at løbe dem alle igennem jo. Derfor er du nød til at finde MaxID som er det antal ID du har Det må du lave med en sql
hmm bob bob. Kan godt se det ikke holder det jeg har skrevet I den menu man kan hente kan jeg jo se at følgende elemter findes txt_1,txt_2,txt_5,txt_6 Så når du åbner txt_1 så skal alle andre lukke Men åbner du txt_2 så skal kun txt_5 og txt_6 lukke Det jeg gav dig ville tælle hele vejen igennem og også lave en txt_4 mm
ok har et forslag: Hvis du giver dine <DIV> et name="txt" og i deres ID fjerner txt_ så ID =" & MenuID & Så kan du løbe alt igennem med navnet txt og lukke dem Dernæst kan du så åbne den med det givne ID: ----------- <SCRIPT> function MenuClick(MenuID) { var x=document.getElementsByName("txt") for (i = 0; i <= x.length; i++){ x[i].style.display == 'none'; } var y = document.getElementById(MenuID); y.style.display = ''; } </SCRIPT>
ok du må undskylde min hurtighed Først troede jeg de blev nummereret fra txt_1 til txt_maxid Men der viste sig at være "huller" imellem Dernæst tænkte jeg mig ikke om og gav en div et navn Håber du tilgiver :o)
en sidste mulighed kunne være at bruge getElementsByTagName("tag") til at fange alle DIV´s med Men der er to ulemper. 1) det er ikke rekomenderet fra W3C så der kan komme problemer i diverse browsere .. 2) hvis du har andre DIV på din side end dem i denne kode så vil de nok også gøres usynlige
Koden skal bruges på et lokalt intranet, så det bliver ikke noget problem med W3C (Internet Explorer). Jeg ikke er den stærke ASP programmør. Jeg vil derfor spørge dig om du har mulighed for at hvorhenne i den øvrige kode der skal ændres. Foreløbig har vi kun ændret i funktionen MenuClick.
Hvis det eneste du har rettet i er funktionen så ret den til: ----------- <SCRIPT> function MenuClick(MenuID) { var x=document.getElementsByTagName("DIV") for (i = 0; i < x.length; i++){ x[i].style.display = 'none' } var txt = document.all("txt_" + (MenuID-1)); if(txt != null){ txt.style.display = ''; } var txt = document.all("txt_" + MenuID); txt.style.display = ''; } </SCRIPT> ----- Det virker næsten efter hensigten hos mig i IE Mangler lige at få kolapset hvis man klikker på en undermenu
Sådan.. så får du ikke mere for den 25øre ;o).. det virker i al fald i min IE -------------- <SCRIPT> function MenuClick(MenuID) { var y = document.all("txt_" + MenuID); var lukket = "True" if(y.style.display == ''){ lukket = "False" } var x=document.getElementsByTagName("DIV") for (i = 0; i < x.length; i++){ x[i].style.display = 'none' } var txt = document.all("txt_" + (MenuID-1)); if(txt != null){ txt.style.display = ''; } if(lukket == "True"){ var txt = document.all("txt_" + MenuID); txt.style.display = ''; }else{ var txt = document.all("txt_" + MenuID); txt.style.display = 'none'; } } </SCRIPT>
Både ja og nej....:-( Hvis jeg har flere under menuer og åbner en og herefter åbner den ander lukker den første og den anden åbner ikke. Så har jeg problemer med at i nogle tilfælde åbnes 2 menupunkter på engang. Hvis du er interesseret kan jeg sende databasen til dig, hvis du ikke kan gennemskue det udfra det jeg skriver.
Nu har jeg den så det virker på alle steder hvor der ikke er en undermenu Skal lige lure hvad sammenhængen i Id er på en undermenu og dens "overmenu" ?
Det er lidt noget øv fordi der ikke er den struktur i det som jeg troede der var Hvis man klikker på nyhedder fx Så klikker man på 5 og den åbner 6 og 16. Klikker man så på 6 så skal den jo åbne den og holde 5 åben Det er sådan det jeg lavede før virker..at den holder et tal før åben Men det kikser jo ved 16 for der skal den jo så ikke holde nummer 15 åben for det er et helt andet sted Hmm og der er jo desværre ikke meget konsistens over det Hmmmm tænker lige lidt :o)
Så prøver vi igen... puha...håber ikke du har fundet en anden løsning ;o) Det her virker hos mig nu med din database ------------------ <!-- #INCLUDE FILE="inc.asp" --> <HTML> <HEAD> <TITLE></TITLE>
<SCRIPT> function MenuClick(tal) { var tal_str = "" + tal var tal_arr = tal_str.split(",") var y = document.all("txt_" + tal_arr[0]); var lukket = "True" if(y.style.display == ''){ lukket = "False" } var x=document.getElementsByTagName("DIV") for (i = 0; i < x.length; i++){ x[i].style.display = 'none' } if(lukket == "True"){ var txt = document.all("txt_" + tal_arr[0]); txt.style.display = ''; } for (i=1; i<tal_arr.length; i++){ var txt = document.all("txt_" + tal_arr[i]); txt.style.display = ''; } } </SCRIPT>
</HEAD> <BODY BGCOLOR="#FFFFFF">
<% Function BygUnderMenu(MenuID,Liste) UnderSQL = "SELECT ID, Navn, Link FROM Menu WHERE MenuID = " & MenuID & " ORDER BY [Order]" Call OpenRS(Conntemp,UnderSQL,UnderRS) Response.Write "<DIV ID=""txt_" & MenuID & """ STYLE=""display:none; margin-left: 10px;"">"&vbCrLf While Not UnderRS.EOF If CountSubs(UnderRS("ID")) > 0 Then Response.Write "<A HREF=""#"" OnClick=""MenuClick('" & UnderRS("ID") & "," & Liste & "')""><B>" & UnderRS("Navn") & "</B></A><BR>"&vbCrLf Call BygUnderMenu (UnderRS("ID"), Liste) Liste = UnderRS("ID") & "," & Liste Else Response.Write "<A HREF=""" & UnderRS("Link") & """ TARGET="""">" & UnderRS("Navn") & "<BR>"&vbCrLf End If UnderRS.MoveNext Liste = MenuID Wend Response.Write "</DIV>" End Function
Function CountSubs(MenuID) CountSQL = "SELECT ID FROM Menu WHERE MenuID = " & MenuID & "" Call OpenRS(Conntemp,CountSQL,CountRS) CountSubs = CountRS.RecordCount End Function
LavDatabase Conntemp
SQL = "SELECT ID, Navn, Link FROM Menu WHERE MenuID = 0 ORDER BY [Order]" Call OpenRS(Conntemp,SQL,RS)
If RS.BOF AND RS.EOF Then Response.Write "FEJL" Else RS.MoveFirst While Not RS.EOF If CountSubs(RS("ID")) > 0 Then Response.Write "<A HREF=""#"" OnClick=""MenuClick(" & RS("ID") & ")""><B>" & RS("Navn") & "</B></A><BR>"&vbCrLf Call BygUnderMenu (RS("ID"),RS("ID")) Else Response.Write "<A HREF=""" & RS("Link") & """>" & RS("Navn") & "</A><BR>"&vbCrLf End If RS.MoveNext Wend End If
Jeg har mod på det men jeg skal til jobsamtale her idag af sådan en som varer hele dagen åbenbart..så jeg kan først svare i morgen. Så hvis du kan vente en dag så er jeg klar :o)
mik >> jo tak det gik oki :o) ... jeg er på i morgen frisk og det hele..tror jeg...hehe Men læg evt lige en post her når det er..så ser jeg den jo på mailen :o)
Hej busschou, jeg har oprettet et andet spørgsmål http://www.eksperten.dk/spm/607677, hvis du har løst, jeg har et par ønsker mere til forbedring, som du sikkert også selv kan bruge.
Synes godt om
Ny brugerNybegynder
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.