[JS] Objecten / Arrays / Loops etc.

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Ik heb het volgende scriptje in mekaar geflanst
code:
1
2
3
4
5
var menuItems = new Array("Leerlingen", "leerlingen/", "Leraren", "leraren/", "AlgemeneInformatie", "algemene_info/");

var menuItems[0] = new Array("Basisroosters", "leerlingen/basisroosters.html", "Roosterwijzigingen", "leerlingen/roosterwijzigingen.html", "Huiswerk", "leerlingen/huiswerk.html");

var menuItems[0][4][0] = new Array("Werkstukken", "leerlingen/huiswerk/werkstukken.html", "Antwoorden", "leerlingen/huiswerk/antwoorden.html", "Begeleiding", "leerlingen/huiswerk/begeleiding.html");

Enzovoort.. Dus gewoon voor ieder onderwerp (link) weer subonderwerpen en voor sommige subonderwerpen ook nog weer een subonderwerp enz.
code:
1
2
3
4
5
6
7
8
9
10
11
for (var a = 0; a < menuItems.length; a += 2) {
   if (menuItems[a][0]) {
    for (var b = 0; b < menuItems[a].length; b += 2) {
       if (menuItems[a][b][0]) {
        for (var c = 0; c < menuItems[a][b].length c += 2) {
          ...... enzomaardoor ........
        }
       }
    }
   }
}

Ik heb hier dus voor ieder subitem een aparte for-loop, maar ik weet natuurlijk nooit hoe diep dat aantal subitems zijn (ik bedoel dus Onderwerp > SubOnderwerp > SubOnderp = 2 diep)

Daarom lijkt me dit niet echt het ideale script.
Eigenlijk moet er net zo vaak een for-loop worden gedaan, als dat de ..array menuItems diep is.

Hopenlijk is het een beetje te begrijpen ...

... want ik kom zelf niet echt tot een nette oplossing ..

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 18:23

Pelle

🚴‍♂️

Dit heeft weinig met objects te maken; dit zijn gewoon arrays namelijk. Zelf heb ik hier laatst ook mee zitten stoeien (voor een dynamisch menu met childs enzo).

drm kwam met de hint om voor elk menuitem bij te houden of hij childs heeft, en zo ja, welke. Zo kun je recursief alle menuitems doorlopen totdat je ze allemaal gehad hebt.

Voorbeeldje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function menuItem(name,href) {
    this.name        = name;
    this.href        = href;
    this.childs    = new Array();
    this.numberOfChilds = 0;
    this.addChild    = addChild;
    this.showChilds     = showChilds;

    function addChild(name) {
     this.childs[++this.numberOfChilds] = name;
    }
    
    function showChilds() {
      for (i in this.childs) {
        document.write(this.name + " child " + i + " = " + this.childs[i] + "<br>\n");
        if (eval(this.childs[i]).numberOfChilds > 0) eval(this.childs[i]).showChilds();
      }
    }
}

leerlingen = new menuItem('leerlingen','leerlingen.html');
blaat   = new menuItem('blaat','blaat.com');
melp     = new menuItem('melp','www.melpisgoedvoorelp.nu');
koe   = new menuItem('koe', 'www.distributed.net');
leerlingen.addChild('blaat');
leerlingen.addChild('melp');
melp.addChild('koe');
leerlingen.showChilds();

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 23:32

RM-rf

1 2 3 4 5 7 6 8 9

ik denk dat recursie je hier kan helpen, een functie definieren die een loop doorloopt (om bv child-elements te vinden) en binnen deze functie deze functie weer aanroepen:

voorbeeldje een obj-zoek functie voor netscape4
code:
1
2
3
4
5
6
7
8
9
10
function getObj(name, doc)
{
   if (!doc) doc = document
   for (var i=0; doc.layers[i] ;i++)
   {
    obj = doc[name]
    if (!obj && doc.layers) obj = getObj(name, doc.layers[i];.document)
   }
   return obj
}

edit: scriptje is ook fout (haastige spoed is als een warme tong in je nek op een koude morgen)

juistere code is:
code:
1
2
3
4
5
6
7
8
9
10
function getObj(name, doc)
{
   if (!doc) doc = document
   obj = doc[name]
   for (var i=0; doc.layers[i] && !obj;i++)
   {
    obj = getObj(name, doc.layers[i].document)
   }
   return obj
}

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Pelle > Met die object was ik nog aan het stoeien dus die had ik nog maar even weggelaten, maar dat scriptje is inderdaad 'precies' wat ik probeerde :)

Dankje! Zal ik wel even met dat script aan het knoeien gaan :)

RM-rf > Pff .. die van Pelle lijkt me iets makkelijker, maar dat is denk ik omdat ie wat meer voorgekauwd wordt :) Ik zal wel even met beide scriptjes gaan stoejen ..

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 18:23

Pelle

🚴‍♂️

Op woensdag 12 december 2001 16:01 schreef r0bert het volgende:
RM-rf > Ben nog even naar het scriptje aan het turen :) kvat 'm nog niet helemaal .. zal zo nog wel weer even editten
Scriptje slaat niet op jouw specifieke geval, maar legt recursie uit. Een recursieve functie is een functie die zichzelf aanroept, en pas stopt als aan een bepaalde voorwaarde is voldaan.
Als je een geneste layer in NS4 wilt aanroepen dan moet dat met document.layers["parentName"].document.layers["deLayerNaam"].

Maar als je geen zin hebt om dat te doen, of als je niet weet of de layer genest is of niet, dan kun je dus zo'n functie gebruiken om de aanroep van die layer te bepalen.

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Okj .. ksnap nu de werking van het scriptje (RM-rf's) en het nut ervan :)

Ik ga nou even m'n digitale bijbel verlaten, want m'n broertje wil één of ander barbaars spel spelen.
Pagina: 1