Toon posts:

[Javascript] Array + <select> opties

Pagina: 1
Acties:

Verwijderd

Topicstarter
Zit met een probleempje:

Heb 3 <select>'s met daarin een aantal opties:

-land
-provincie
-departement

Het is de bedoeling dat wanneer je een land selecteerd, je alleen de provincies ziet staan die bij dat land horen. Dat gedeelte werkt inmiddels, maar nu wil ik het zo maken dat als je een ander land wil selecteren, de originele provincies weer terug komen (zodat als je een fout land selecteerd niet de hele pagina opnieuw hoeft te laden!).

Daarvoor had ik het volgende bedacht: ik backup eerst alle waardes voordat ik de waardes die niet bij het land horen verwijder mbv ".options[] = null" in javascript
Zodra dan een ander land word gekozen wordt deze backup teruggezet.

Het selecteer gedeelte werkt prima, wanneer ik een land selecteer komen keurig de juiste provincies zichtbaar, maar het backuppen kom ik niet uit!

Iemand een idee hoe ik dit het beste kan oplossen..

Javascript:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  <script type="text/javascript" LANGUAGE="JavaScript1.2">

  var selectedland = 0;
  var tmp_provincies = Array();
  var tmp_departementen = Array();
  var dobackup = true;

  function backupProvincies(arr)
  {
    if(dobackup == true)
    {
      var _tmp_prov = Array();
      var cnt = 0;
      for (var i = document.getElementById('advertentie_prov_id').options.length-1; i > 0; i--)
      {
        deze = document.getElementById('advertentie_prov_id').options[i];
        _tmp_prov[deze.value] = deze.text;
        cnt++;
      }
      alert('backupped ' + cnt + ' values    LAST: ' + deze.value);
      return _tmp_prov;
    }
    //else
    //{
    //  alert('geen backup nodig!');
    //}
  }

  function setLand(oldland, newland, arraytje)
  {
      //var arrie = tmp_provincies.copy();
      alert(typeof(arraytje));
      if (oldland != newland && oldland != 0)
      {
        alert('restoring');
        for (var i = arrie.length; i > 0; i--)
        {
            document.getElementById('advertentie_prov_id').options[i] = null;
        document.getElementById('advertentie_prov_id').options[i] = new Option(i, tmp_provincies[i]);
        }
      }
      for (var i = document.getElementById('advertentie_prov_id').options.length-1; i > 0; i--)
      {
        var waarde = document.getElementById('advertentie_prov_id').options[i].value;
        var sjoep = waarde.split("_");
        deze = document.getElementById('advertentie_prov_id');
        if (sjoep[1] != newland)
        {
          deze.options[i] = null;
        }
        else
        {
          deze.options[i].value = sjoep[0];
    }
      }
      dobackup = false;
      return newland;
  }

  function setProvincie(provincie)
  {
      var zezijner = false;
      for (var i = document.getElementById('advertentie_dep_id').options.length-1; i > 0; i--)
      {
        var waarde = document.getElementById('advertentie_dep_id').options[i].value;
        var sjoep = waarde.split("_");
        deze = document.getElementById('advertentie_dep_id');
        if (sjoep[1] != provincie)
        {
          deze.options[i] = null;
        }
        else
        {
          var zezijner = true;
          deze.options[i].value = sjoep[0];
    }
      }
      if (!zezijner)
      {
          deze.options[0] = new Option ('Geen resultaten..', '0');
      }
  }
  </script>


HTML:
code:
1
2
3
4
5
6
7
8
9
10
11
12
          <tr class="odd">
            <td>Land</td>
            <td><select name="advertentie[land_id]" onChange="tmp_provincies = backupProvincies(tmp_provincies); selectedland = setLand(selectedland, this.value, tmp_provincies); setStyleById('provincie_s', 'visibility', 'visible');" id="advertentie_land_id">OPTIES!</select></td>
            <td>Minimale capaciteit</td>
            <td><input name="advertentie[capaciteit_min]" type="text" size="3" maxlength="3" id="advertentie_capaciteit_min" /></td>
          </tr>
          <tr class="even">
            <td>Provincie <span id="provincie_s" style="color: red; visibility: hidden; font-weight: bold;">&raquo; Gesorteerd!</span> </td>
            <td><select name="advertentie[prov_id]" onChange="setProvincie(this.value); setStyleById('departement_s', 'visibility', 'visible');" id="advertentie_prov_id">OPTIES!</select></td>
            <td>Maximale capaciteit</td>
            <td><input name="advertentie[capaciteit_max]" type="text" size="3" maxlength="4" id="advertentie_capaciteit_max" /></td>
          </tr>

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Hmmm.. Waarom backups maken. Kan je niet gewoon (zoals je titel al zegt) gewoon je gegevens in arrays bijhouden en vervolgens steeds aan de hand van je array het hele spullenboel opnieuw opbouwen?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
Die keus heb ik gemaakt omdat je anders een paar enorme arrays in je pagina krijgt, terwijl je al die gegevens ook al als <options> hebt !

En het een stukje lastiger omdat de value en de text van de option niet hetzelfde is.

[ Voor 30% gewijzigd door Verwijderd op 04-12-2003 12:27 ]


Verwijderd

Verwijderd schreef op 04 december 2003 @ 12:22:
Die keus heb ik gemaakt omdat je anders een paar enorme arrays in je pagina krijgt, terwijl je al die gegevens ook al als <options> hebt !
Enorm? Dat lijkt me wel meevallen. Arrays tot enkele duizenden elementen is voor de meeste browsers/computers geen enkel probleem.
En het een stukje lastiger omdat de value en de text van de option niet hetzelfde is.
Mijn suggestie is dat de selects sowieso vanuit JS worden opgebouwd - dus dat de selects een representatie zijn van de JavaScript-data. Bouw een boom op met JavaScript objecten die de text/values van de options combineert met de bijbehorende 'kinderen' van het volgende nivo.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function treeOption( sText, sValue aKids ) {
    this.sText = sText;
    this.sValue = sValue;
    this.aKids = aKids;
}

var OPTIONS = new Array(
    new treeOption('Nederland','NL', [
        new treeOption('Utrecht','UT',[
            new treeOption('Dept 1.','NL-UT-D1',[]),
            new treeOption('Dept 2.','NL-UT-D2',[]),
            new treeOption('Dept 3.','NL-UT-D3',[])
        ])
    ]),
    new treeOption('Great Britain','GB', [
        new treeOption('Leeds','LD',[
            new treeOption('Dept 1.','BG-LD-D1',[]),
            new treeOption('Dept 2.','BG-LD-D2',[]),
            new treeOption('Dept 3.','BG-LD-D3',[]),
        ])
    ])
);

Het is vrij eenvoudig om - uitgaande van zo'n boom - de bijbehorende SELECTs te vullen met OPTIONs.

[ Voor 23% gewijzigd door Verwijderd op 04-12-2003 13:08 ]


Verwijderd

Topicstarter
Het is vrij eenvoudig om - uitgaande van zo'n boom - de bijbehorende SELECTs te vullen met OPTIONs.
Oke bovenstaand principe van die boom kan ik begrijpen, maar het omzetten naar options.. zou je me misschien een schopje in de goede richting kunnen geven, ben hier al zo lang mee bezig en heb geen zin om nog een dag bezig te zijn met dat :)

Verwijderd

Verwijderd schreef op 04 december 2003 @ 13:13:
Oke bovenstaand principe van die boom kan ik begrijpen, maar het omzetten naar options.. zou je me misschien een schopje in de goede richting kunnen geven, ben hier al zo lang mee bezig en heb geen zin om nog een dag bezig te zijn met dat :)
Is ook niet zo eenvoudig. Dat flans ik ook niet zo even in elkaar. Maar een schop in de goede richting...
JavaScript:
1
....never mind, zie onder 

Probleem is nog dat dit een nieuwe SELECT creeert elke keer als je iets nieuws selecteerd. Maar het is een schopje. (en volgens mij in de goede richting) :P

EDIT:
Als je iets doet, moet je het goed doen:
JavaScript:
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
29
30
31
32
33
34
function renderOptions( aOptions ) {
    var oSelect = document.createElement('SELECT');

    oSelect.options[0] = new Option('Kies een optie', -1);
    for(var i=0; i<aOptions.length; i++) {
        oTree = aOptions[i];
        oOption = new Option(oTree.sText, oTree.sValue);
        oOption.oTree = oTree;
        oSelect.options[oSelect.options.length] = oOption;
    }

    oSelect.onchange = function() {
        removeSubSelect(oSelect);
        oOption = oSelect.options[oSelect.selectedIndex];
        if(oOption.oTree) {
            aTree = oOption.oTree.aKids;
            if(aTree.length) {
                oSelect.oSubSelect = renderOptions(aTree);
            }
        }
    }

    document.body.appendChild(oSelect);
    return oSelect;

}

function removeSubSelect( oSelect ) {
    if(oSelect.oSubSelect) {
        removeSubSelect(oSelect.oSubSelect);
        document.body.removeChild(oSelect.oSubSelect);
        oSelect.oSubSelect = null;
    }
}

Deze code werkt volgens mij volledig en goed.

[ Voor 26% gewijzigd door Verwijderd op 04-12-2003 15:30 ]

Pagina: 1