[JS] var (global?) in function

Pagina: 1
Acties:

  • X-trace
  • Registratie: Juni 2004
  • Laatst online: 02-11-2024
heb script dat in een for loop een EventListener moet toevoegen aan een link. De variabele die ik dan opvraag in de functie ziet hij blijkbaar niet.
  • readCookie is een functie dat een cookie op haalt.
  • gradaties is een array
  • arrays grad (is een split van cookie) en gradaties zijn even lang ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function elem(tag,content) {
    var newElement = document.createElement(tag);
    newElement.innerHTML = content;
    return newElement;
}

var grad = readCookie('grad').split(';');
    for(i=0;i<=(gradaties.length-1);i++) {
        var thisLink = '';
        thisLink = elem("a","&raquo;&nbsp;"+gradaties[i][0]+" "+grad[i]+"<br />");
        thisLink.setAttribute("href", 'javascript:;');
        thisLink.addEventListener("click", function(){ if(grad[i]==0) { alert('0'); } if(grad[i]==1) { alert('1'); } }, true);
        document.body.appendChild(thisLink);
    }


Probleem zit hem in "thisLink.addEventListener("click", function(){ } )". Als ik hier in de function() {} de variabele grad[i] opvraag werkt dit niet. In dit geval alert hij dus niets...

You cannot not communicate


  • Joolee
  • Registratie: Juni 2005
  • Niet online
De variable grad is wel beschikbaar in die functie, alleen de variable i niet. Een oplossing weet ik zo snel niet maar ik zal even tussen mijn scripts kijken.

//Edit:
Wat je eventueel zou kunnen doen is een attribuut toevoegen aan de anchors met de waarde van variable i erin. Binnen de functie kun je dat attribuut oproepen met this.attribuut. Echt netjes is het alleen niet denk ik.

[ Voor 42% gewijzigd door Joolee op 05-05-2007 16:23 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

De variabele i is ook beschikbaar in die functie, maar aangezien het een referentie betreft heeft die voor elke listener dezelfde waarde (namelijk die van gradaties.length).
Je zal dus eea expliciet moeten scopen, bijvoorbeeld door de eventListener door een aparte functie te laten toekennen.

Intentionally left blank


  • X-trace
  • Registratie: Juni 2004
  • Laatst online: 02-11-2024
Dus op dezelfde manier als elem() ?

[ Voor 150% gewijzigd door crisp op 05-05-2007 16:56 ]

You cannot not communicate


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

X-trace schreef op zaterdag 05 mei 2007 @ 16:25:
Dus op dezelfde manier als elem() ?
Jep, iets als:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
thisLink.addEventListener("click", generateClickHandler(grad[i]), true);

// ...

function generateClickHandler(waarde)
{
  return function()
  {
    alert(waarde);
  }
}


sorry, ik klikte eerst op 'edit' ipv 'quote' :P

Intentionally left blank


  • X-trace
  • Registratie: Juni 2004
  • Laatst online: 02-11-2024
crisp schreef op zaterdag 05 mei 2007 @ 16:56:
[...]

Jep, iets als:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
thisLink.addEventListener("click", generateClickHandler(grad[i]), true);

// ...

function generateClickHandler(waarde)
{
  return function()
  {
    alert(waarde);
  }
}


sorry, ik klikte eerst op 'edit' ipv 'quote' :P
Dank...is inderdaad de oplossing!

You cannot not communicate

Pagina: 1