Avatar billede mik Nybegynder
06. april 2005 - 08:31 Der er 29 kommentarer og
2 løsninger

Tilretning i ASP menu

Jeg har fundet en ASP menu på netcoders.dk ( http://www.netcoders.dk/sources.asp?mode=view_source&tech_id=1&id=1926 ). Jeg vil gerne hvis der er en der kan hjælpe mig med at tilrette den lidt.

Det jeg ønsker hjælp til er følgende:

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.
Avatar billede mik Nybegynder
06. april 2005 - 08:32 #1
Jeg glemte lidt kode:


<!-- #INCLUDE FILE="inc.asp" -->
<HTML>
<HEAD>
<TITLE></TITLE>

<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
   
    LukDatabase Conntemp
%>
</BODY>
</HTML>
Avatar billede busschou Praktikant
06. april 2005 - 09:00 #2
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?
Avatar billede busschou Praktikant
06. april 2005 - 09:05 #3
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>
Avatar billede busschou Praktikant
06. april 2005 - 09:08 #4
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>
Avatar billede busschou Praktikant
06. april 2005 - 09:12 #5
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)
Avatar billede mik Nybegynder
06. april 2005 - 09:24 #6
Du er godtnok hurtig :-)..  Jeg har set på det, men jeg er ikke helt med på hvor variablen MaxID kommer fra.
Avatar billede busschou Praktikant
06. april 2005 - 09:29 #7
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
Avatar billede busschou Praktikant
06. april 2005 - 09:36 #8
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
Avatar billede busschou Praktikant
06. april 2005 - 09:49 #9
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>
Avatar billede busschou Praktikant
06. april 2005 - 09:53 #10
Hmm måske er jeg for hurtig...kommer i tvivl om en DIV må have et name
Avatar billede busschou Praktikant
06. april 2005 - 10:04 #11
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)
Avatar billede busschou Praktikant
06. april 2005 - 10:06 #12
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
Avatar billede mik Nybegynder
06. april 2005 - 10:40 #13
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.
Avatar billede busschou Praktikant
06. april 2005 - 11:06 #14
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
Avatar billede busschou Praktikant
06. april 2005 - 11:13 #15
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>
Avatar billede busschou Praktikant
06. april 2005 - 14:00 #16
hm virker det ikke hos dig?
Avatar billede mik Nybegynder
06. april 2005 - 14:36 #17
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.
Avatar billede busschou Praktikant
06. april 2005 - 14:44 #18
det må du meget gerne...eller bare et link
Avatar billede mik Nybegynder
06. april 2005 - 14:49 #19
Her har du et link: www.1otterup.dk/test/menu.mdb
Avatar billede busschou Praktikant
06. april 2005 - 14:59 #20
ahh ok det er fordi i den jeg kiggede  i fra linket øverst der står menuid i rækkefølge...hmm
Avatar billede busschou Praktikant
06. april 2005 - 15:12 #21
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" ?
Avatar billede mik Nybegynder
06. april 2005 - 15:18 #22
Okay...Måske skal man også prøve hvis man har eks 2 undermenuer i 3. niveau
Avatar billede busschou Praktikant
06. april 2005 - 15:25 #23
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)
Avatar billede busschou Praktikant
06. april 2005 - 16:52 #24
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
   
    LukDatabase Conntemp
%>
</BODY>
</HTML>
Avatar billede busschou Praktikant
06. april 2005 - 16:54 #25
PS .. og det skulle nu gerne virke uanset hvor mange undermenuer du vælger en menu har
Avatar billede mik Nybegynder
06. april 2005 - 17:36 #26
Hej jeg kigger senere på det iaften, jeg skal lige til et lille møde.
Avatar billede mik Nybegynder
06. april 2005 - 23:35 #27
Du har gjort en virkelig stor indsats, det virkede bare, det var alle pointene værd.

Jeg har en lille tillægsspørgsmål/problem. Hvis du har mod på det vil jeg lægge et nyt spørgsmål op. Nu kender du jo ligesom menu'en. :-)
Avatar billede busschou Praktikant
07. april 2005 - 05:39 #28
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)
Avatar billede mik Nybegynder
07. april 2005 - 08:20 #29
Det lyder godt. Det vil jeg sige tak til. Held og lykke med samtalen. :-)
Avatar billede busschou Praktikant
07. april 2005 - 23:05 #30
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)
Avatar billede mik Nybegynder
08. april 2005 - 10:15 #31
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.
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
Kurser inden for grundlæggende programmering

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