20. august 2003 - 12:07Der er
6 kommentarer og 1 løsning
Menu-træ
Hej Jeg vil gerne lave et dynamisk menu-træ. Det skal være sådan at når man klikker på et hovedmenupunkt, så kommer undermenuerne frem hængende under hovedmenuen.
Jeg bruger numre til at definerer hvilke menupunkter der hører under hvilke andre menupunkter. Problemet er at det kode, jeg har lavet ikke er dynamisk, det kan fx kun gå ned i 3 niveauer. Hvis man så laver et undermenupunkt til et menupunkt på 3 niveau vælter det.
Jeg vil gerne have at koden tager højde for x antal niveauer.
Min tabel kunne fx. se sådan her ud: -------------------------------- Nummer Menupunkt Note
1000 Tøj 0 1001 Bukser 1000 1002 Rester 1001 1003 Børnebukser 1001 1004 Shorts 1002 2000 Biler 0 2001 Audi 2000 2002 A4 2001 --------------------------------- Nummer er unik Menupunkt er navnet på menuen Note styrer hvilke menuer der er hænger sammen - 0 betyder det er en hovedmenu.
Så denne tabel giver i niveau 1: --------- Tøj Biler --------- Niveau 2 (tøj) --------- Tøj Bukser Rester Biler -------- Niveau 3 (tøj) -------- Tøj Bukser Børnebukser Rester Biler -------- Niveau 4 (tøj) -------- Tøj Bukser Børnebukser Shorts Rester Biler ---------
Når der ikke er undermenuer til et punkt skal menupunktet linke til side produkt.asp i dette tilfælde "Shorts" og "Rester". Havde vi åbnet biler ville det være "A4" der linkede til produkt.asp
Jeg har for søgt at give en så præcis forklaring at problemet som jeg kan, og jeg håber der er en der kan løse det. Jeg har som sagt en løsning men den er ikke dynamisk - den bygger bare på en række if,then,else.
Du vil nok anvende en for-løkke, der skriver html'en, og hvis du vil have mulighed for at have uendeligt antal niveauer, skal du bruge en rekursiv funktion (dvs. at den kalder sig selv). noget i stil med:
sub skrivMenu(argumenter) for i = 0 to AntalIalt if nytniveau then call skrivMenu(argumenter) else Response.write menupunkter end if next end sub
problemet med vbscript er at det ikke er et stærkt sprog hvad angår scope. Det betyder at i bliver "genbrugt", så når funktionen kaldersig selv, og vender tilbage, så har i værdien fra sidste gennemløb med sig.
Du er nødt til at udskrive menuen i javascript, der på dette punkt er stærkere end vbscript. Jeg har selv gjort det clientside, og regner med at du ogs kan gøre det med serverside javascript.
Men det er ikke let; tungen lige i munden når du laver rekursive funktioner.
Den algoritme åbner hele menuen på én gang. Den skal ikke åbne undermenuerne før man klikker på menupunktet i niveauet ovenover. Altså man kan ikke se "Børnebukser" før man klikker på "Bukser"
Idanielsen... Ja, men det er noget rod. Denne meget lange kode får min menu ned i 3 niveauer. -------------- viskategori = CStr(Replace(request.querystring("viskategori"), "'", "''")) viskategori2 = CStr(Replace(request.querystring("viskategori2"), "'", "''"))
if viskategori <> "" then viskategori = CStr(Replace(request.querystring("viskategori"), "'", "''")) else viskategori = 0 visikkehoved = 65 end if 'response.write viskategori2
'finder hovedkategorierne set rskategori=db.execute("SELECT Notes1.Txt as notesTxt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& 0 &"' order by StockLocations1.Txt")
'finder underkategorier set rskategori2=db.execute("SELECT Notes1.Txt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& viskategori &"' order by StockLocations1.Txt")
if not rskategori.eof then while not rskategori.eof %> <font face="verdana" size="2"><a href="default.asp?viskategori=<%= rskategori("StockLoc") %>" style="color: #000000" style="text-decoration:none;"><b><%= rskategori("Txt") %></b></a> <br> <% kl = CStr(viskategori) if rskategori("StockLoc") = kl AND visikkehoved <> 65 then if not rskategori2.eof then while not rskategori2.eof set rskategori3=db.execute("SELECT Notes1.Txt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& viskategori &"' order by StockLocations1.Txt") d = rskategori3("StockLoc") set rskategori32=db.execute("SELECT Notes1.Txt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& d &"' order by StockLocations1.Txt") if not rskategori3.eof AND not rskategori32.eof then while not rskategori3.eof %> <font face="verdana" size="2"><a href="default.asp?viskategori=<%= rskategori("StockLoc") %>&viskategori2=<%= rskategori3("StockLoc") %>" style="color: #000000" style="text-decoration:none;"><b> <%= rskategori3("Txt") %></b></a> <br> <% set rskategori4=db.execute("SELECT Notes1.Txt, Notes1.NotesRecId, StockLocations1.StockLoc, StockLocations1.Txt FROM StockLocations1 INNER JOIN Notes1 ON StockLocations1.RecID = Notes1.NotesRecId WHERE Notes1.Txt = '"& viskategori2 &"' order by StockLocations1.Txt") if not rskategori4.eof then while not rskategori4.eof viskat = rskategori4("StockLoc") %> <font face="verdana" size="2"><a href="produktoversigt.asp?viskategori=<%= rskategori("StockLoc") %>&kategori=<%=rskategori4("StockLoc")%>&viskategori2=<%= rskategori3("StockLoc") %>" style="color: #000000" style="text-decoration:none;"> <%= rskategori4("Txt") %></a> <br <% rskategori4.movenext wend rskategori4.close set rskategori4 = Nothing end if rskategori3.movenext wend rskategori3.close set rskategori3 = Nothing rskategori32.close set rskategori32 = Nothing else 'viskat = rskategori2("StockLoc") %> <font face="verdana" size="2"><a href="produktoversigt.asp?viskategori=<%=rskategori("StockLoc")%>&kategori=<%=rskategori2("StockLoc")%>" style="color: #000000" style="text-decoration:none;"> <%= rskategori2("Txt") %></a> <br> <% end if rskategori2.movenext wend rskategori2.close set rskategori2 = Nothing end if end if %> <% rskategori.movenext wend end if
rskategori.close set rskategori = Nothing ------------------
Jeg lukker spørgsmålet, jeg har lavet "rode" kode så den kan gå ned i 4. neveau, det må række - ellers vender jeg tilbage :)
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.