Avatar billede jgp Nybegynder
21. december 2001 - 09:58 Der er 17 kommentarer og
1 løsning

Menu bygget op over childs

Jeg har en menu som er bygget op over childs. Hver child indeholder en variable som fortæller om den er foldet ud eller ej. Hver child har også en unik id.

Jeg kunne godt tænke mig at få lavet en funktion som når folder et punkt ud, folder alle andre punkter ind.

Menuen er bygget således at der kan være et ubestemt nummer af childs og et ubestemt nummer af childs på childs.

Hvis du/i har behov for at se dele af koden, så bare spørg.

Håber i kan hjælpe mig
Mvh og god jul
JGP

Avatar billede tobias_cool Nybegynder
21. december 2001 - 10:27 #1
XML-childs eller hva\' ja det bliver nok lidt nemmere *GG*

jeg har også meget XML på min side www.friserverplads.dk/tubesign

tobias@home1.gvdnet.dk
Avatar billede jgp Nybegynder
21. december 2001 - 10:32 #2
tobias_cool: Menuen er lavet udelukekt i JavaScript. Dette er gjort, for at siden ikke skal reloades og derved belaste serveren hver gang en bruger bruger menuen.
Avatar billede kasseper Nybegynder
21. december 2001 - 11:41 #3
når du nu siger childs er det så DOM, eller hur ???
Avatar billede jgp Nybegynder
21. december 2001 - 11:46 #4
kasseper: jeg er ike sikekr på hvad du mener, men jeg håber dette kan svare på spørgsmålet:
var julemand
julemand.child[0]
julemand.child[0].child[0]
julemand.child[1]
Avatar billede kasseper Nybegynder
21. december 2001 - 12:18 #5
Ja så bruger du DOM, document object model til at referere rundt på siden.
Men koden ville nok være en fordal at se...!
Avatar billede zeptic Nybegynder
21. december 2001 - 12:19 #6
jeg synes ikke det giver meget mening. hvad er det for en variabel hvert child indeholder? jeg tror det ville være rart at se mere af den kode du har.
Avatar billede jgp Nybegynder
21. december 2001 - 12:37 #7
function Node(_text,_url) {
  this.text = _text;
  this.url = _url;
  this.unfold = 0;
  this.child = [];
  this.cchild = 0;
  this.childs = Node_childs;
  this.notlastchild = Node_notlastchild;
  this.movefirst = Node_movefirst;
  this.movenext = Node_movenext;
  this.getchild = Node_getchild;
  this.name = Math.random();
  this.lastclick = 0;
  return this;
};

function Node_childs() { return this.child.length; };
function Node_movefirst() { this.cchild = 0; };
function Node_movenext() { this.cchild++; };
function Node_notlastchild() { if ( this.cchild < this.childs() ) return 1; else return 0; };
function Node_getchild() { return this.child[this.cchild]; };

function findnode(node,name) {
  if ( node.name == name ) return node;
  if ( node.childs() > 0 ) {
    for (node.movefirst(); node.notlastchild() ; node.movenext() ) {
      temp = findnode(node.getchild(),name);
      if ( temp != null ) { return temp; }
    }
  } return null;
};

var menu = new Node(\"NAVN\",\"URL\");
menu.child[0] = new Node(\"NAVN\",\"URL\");
menu.child[0].child[0] = new Node(\"NAVN\", \"URL\");
menu.child[0].child[0].child[0] = new Node(\"NAVN\", \"URL\");

function toggle(name) {
  node = findnode(eval(whatnode),eval(name));
  if ( node.unfold == 0 ) { node.unfold = 1; node.lastclick = 1;}
  else { node.unfold = 0; node.lastclick = 0; }
  updatemenu();
};

function repstr(_in,_rep) {
  out = \"\";
  for(_c=0; _c<_rep; _c++) out = out + _in;
  return out
};

function showtree(node,level,str,expand) {
if ( node.childs() == 0 ) {
  if ( node.lastclick == 1 ) txtclass = \"menutextlastpush\"; else txtclass = \"menutext\"
  str = str + repstr(\"&nbsp;\",level*2) + \"<A target=content id=\'\" + node.text + \"\' class=\'\" + txtclass + \"\' onclick=\\\"java script:toggle(\'\" + node.name + \"\');\\\" HREF=\\\"\" + node.url + \"\\\" onMouseOver=\\\"window.status=\'\" + node.text + \"\';return true\\\" onMouseOut=\\\"window.status=\'\';return true\\\">- \" + node.text + \"</A><BR>\";
  node.lastclick = 0; node.unfold = 0;
}
else {
  if ( expand == 0 ) {
    if ( node.lastclick == 1 ) txtclass = \"menutextlastpush\"; else txtclass = \"menutext\"
    str = str + repstr(\"&nbsp;\",level*2) + \"<A class=\'\" + txtclass + \"\' HREF=\\\"java script:toggle(\'\" + node.name + \"\');\\\" onMouseOver=\\\"window.status=\'\" + node.text + \"\';return true\\\" onMouseOut=\\\"window.status=\'\';return true\\\">\" + node.text + \"</A><BR>\";
  }
}
if ( ( node.unfold == 1 ) && ( node.childs() > 0 ) ) {
  for (node.movefirst() ; node.notlastchild() ; node.movenext() ) {
    str = showtree(node.getchild(),level + 1,str,expand);
  }
}
return str;
}

Dette er mere eller mindre hele koden
Avatar billede jgp Nybegynder
21. december 2001 - 12:37 #8
Beklager den lidt rodet opstilling
Avatar billede Slettet bruger
21. december 2001 - 14:07 #9
Det er nok ikke andet, end at du bare skal køre en løkke, som løber alle childs igennem og tildeler dem en værdi, der siger, at de er foldet ind, og så til sidst kalde updatemenu();
Desværre har du ikke inkluderet funktionen updatemenu() i den kode, du viser, så det er lidt svært at sige.
Det ville være nemmest med en URL!

Min idé er således (jeg har ikke tid til at granske din kode for de rigtige navne til variablerne):

for (i = 0; i < antalChilds; i++) {
childNavn.foldetUd = false;
}
updatemenu();
Avatar billede jgp Nybegynder
21. december 2001 - 14:25 #10
phoenixv: tak for svaret:

function updatemenu() {
str = \'<P>\'; display(whatmenu,showtree(eval(whatnode),0,str,0) + \"</P>\"); };
function display(id, str) {
if (NS4) { with (document[id].document) { open(); write(str); close(); } }
else { document.all[id].innerHTML = str; }
}

Der er en variable som viser om mappen skal være foldet ud, den hedder \"node.unfold\".

Det er intet problem for mig at sætte unfold til false/0, problemet er at lade de noder som skal være foldet ud hava værdien true/1.

Husk på at der skal tages højde for at der kan være et ubegrænset antal childs der har childs.

Avatar billede tobias_cool Nybegynder
21. december 2001 - 14:57 #11
Det er bare fordi de fleste tænker på XML childs og dertil er der noget der hedder DOM XSLT sådan noget formattering
Avatar billede Slettet bruger
21. december 2001 - 15:03 #12
Ja, det kræver jo nok et større indgreb. Jeg må stadig insistere på en URL, selv om jeg ikke kan garantere at jeg prøver før efter jul!
Avatar billede jgp Nybegynder
21. december 2001 - 15:51 #13
phoenixv: Sorry, jeg havde overset du spurte efter en url. Jeg kan desvære ikke give dig sådan, da siden ligger på en intranet server, bag vores firewall.
Avatar billede Slettet bruger
21. december 2001 - 16:12 #14
Kan du så ikke bare smide et eksempel af scriptet i funktion ud på friserverplads.dk eller noget lignende?
Avatar billede jgp Nybegynder
21. december 2001 - 16:27 #15
phoenixv: vil jeg gøre, dog smutter jeg på juleferie nu, så vi må se hvad det blvier til :-)
Avatar billede Slettet bruger
21. december 2001 - 16:30 #16
Yes, wir mussen gören dass!
God ferie!
Avatar billede jgp Nybegynder
02. januar 2002 - 09:11 #17
Håber i alle har haft en rigtig god ferie.

Jeg har fået løst mit problem, dog valgte jeg at skrive koden om helt fra bunden.

Menuen er nu bygget op over at man add\'er child\'s via en function. På denne måde får man mulighed for at i hvert parent at holde styr på hvilket childs den har og hvilken af dem der skal være udfoldet.

Hvis i gerne vil se koden, så sig til, så smider jeg den her ud :-)
Avatar billede kla Nybegynder
12. december 2002 - 07:51 #18
Skal til at lave en XML - menu i JS og vil da gerne have lidt input fra nogen som har lavet en før ... Den menu jeg skal have strikket sammen skal være dynamisk så man til tilknytte og fjerne punkterne OnTheFly ;-) så hvis du havde lidt kode til inspiration ville det da være dejligt !
/mvh KLA@
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