[js] variabele altijd als een referentie?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers,

ik ben tegen een probleem aangelopen bij een scriptje voor een soort van banner slider. Wat ik wil berijken is dat een aantal linkjes in een div de zelfde code bij een onclick uitvoeren maar met een andere waarde. Ik heb onderstaande code gepost als voorbeeld code. Het probleem is dat als je een loop maakt en x gebruikt in de onclick functie x als reverentie wordt gebruikt en niet als vaste waarde en dus alle links de laatste waarde gebruiken indien je op een linkje klikt. Ik heb al verschillende dingen geprobeert zoals een string er van te maken en een nieuwe variabele binnen de loop te maken maar dit helpt allemaal niet. De onclick functies blijven de laatste waarde meenemen dus lijkt of ze altijd als reverentie worden gebruikt, wat ik ook doe. Heeft iemand nog een andere suggestie?

Voorbeeld:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// voorbeeld class
function someClass(id) {
    // voorbeeld methode
    function init(placeholder_id) {
        // element
        var oElem = document.getElementById(placeholder_id);
        // array van alle linkjes
        var aLinks = oElem.getElementsByTagName('A');
        for (var x = 0; x < aLinks.length; x++) {
            aLink[x].onclick = function () {
                // en hier gaat het fout
                doeIetsAnders[x];
            } 
        }
        
    }
    this.init(id)
}

function doeIetsAnders(nummer) {
    alert(nummer);
}

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:18

crisp

Devver

Pixelated

De 'x' is inderdaad een referentie naar de variabele in de scope buiten de anonieme functie; dat noemen ze ook wel een 'closure'. Wat je kan doen is deze variabele apart 'scopen':
JavaScript:
1
2
3
4
5
6
7
aLink[x].onclick = createClickFunction(x);

// ...
function createClickFunction(x)
{
  return function() { doeIetsAnders(x); }
}

nog beter is kijken of je de handler zo kan herschrijven dat die 'x' helemaal niet nodig is of op een andere manier binnen de handler te herleiden is, je kan dan ook werken met een simpele referentie naar doeIetsAnders ipv tig anonieme functies aan te moeten maken.

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het zo gedaan als je hebt aangegeven. de instantie van me class door gegeven naar een losse functie en de waarde uit de loop en dit werkt inderaad zo als ik wil. Super bedankt voor je hulp. Ik ga nog even proberen of je laatste optie ook lukt wat misschien wel netter is.