Toon posts:

[JS] Huidige nummer uit loop gebruiken ?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wellicht een vreemde titel maar ik wist het niet anders te omschrijven.

Ik ben bezig met een stukje Javascript en wil wat tekst laten zien in een aparte div.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function setPreview()
{
 var li, anode, item;
 
 item=document.getElementsByTagName('div');
  for(a=0;a<item.length;a++) {
    if(/gallerylist/.test(item[a].className))
    {
     li=item[a].getElementsByTagName('li');
     for(i=0;i<li.length;i++)
     {
      anode=li[i].getElementsByTagName('a')[0];
      anode.onmouseover=function(){setText(this,a);};
      anode.onmouseout=function(){setNone(this,a);};
     }
   }
  }
}
function setText(i,a){
alert(i.firstChild.nodeValue + ': div ' +  a)
}



De regel
JavaScript:
1
anode.onmouseover=function(){setText(this,a);};

zou de huidige div (van de "a" loop) moeten aannemen bij de loop, maar hij neemt altijd 12 aan.(aantal divs is 12 en is dus de laatste).

Hoe kan ik het huidige nummer uit de loop verkrijgen om deze aan de functie door te geven ? Dit moet wel heel simpel zijn, maar ik zie het niet meer na meerdere uren staren naar code.

De page staat hier en zal dus een alert geven bij als je over een link gaat.

[ Voor 8% gewijzigd door Verwijderd op 12-12-2005 13:03 ]


  • André
  • Registratie: Maart 2002
  • Laatst online: 15-04 09:54

André

Analytics dude

Maak er eens new function van ;)

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
ik weet zeker dat dit met standaard debug werk wel op te lossen is.

doe eens dit:, en kijk wat ie zegt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function setPreview()
{
 var li, anode, item;
 
 item=document.getElementsByTagName('div');
  for(a=0;a<item.length;a++) {
   alert(/gallerylist/.test(item[a].className));  //true/false 12x
    if(/gallerylist/.test(item[a].className))
    {
     li=item[a].getElementsByTagName('li');
     alert(li.length);
     for(i=0;i<li.length;i++)
     {
       anode=li[i].getElementsByTagName('a')[0];
      anode.onmouseover=function(){setText(this,a);};
      anode.onmouseout=function(){setNone(this,a);};
     }
   }
  }
}
function setText(i,a){
alert(i.firstChild.nodeValue + ': div ' +  a)
}

[ Voor 5% gewijzigd door BasieP op 12-12-2005 13:13 ]

This message was sent on 100% recyclable electrons.


Verwijderd

Maak van a eens een local variable:
code:
1
for(var a=0;a<item.length;a++) {

Verwijderd

Topicstarter
@Andre met een new function snapt ie niet meer waar de child vandaan moet komen

@Blues local var maakt geen verschil
BasieP schreef op maandag 12 december 2005 @ 13:12:
ik weet zeker dat dit met standaard debug werk wel op te lossen is.

doe eens dit:, en kijk wat ie zegt:
En precies zoals expected: 3x een true (de gezochte div komt 3x voor).

[ Voor 68% gewijzigd door Verwijderd op 12-12-2005 13:23 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

JavaScript:
1
anode.onmouseover = new Function('setText('+a+')');

'this' doorgeven levert denk ik een verkeerde referentie op in setText aangezien 'this' in je setPreview functie verwijst naar het window object. Met bovenstaande zou setText er als volgt uitzien ('this' verwijst daar al naar je anchor):
JavaScript:
1
2
3
4
function setText(a)
{
  alert(this.firstChild.nodeValue + ': div ' +  a)
}


Blues: closures zijn references - logisch dat als je 'a' meegeeft als closure hij altijd '3' zal aangeven - het is immers maar 1 object waarnaar gerefereert wordt.

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op maandag 12 december 2005 @ 13:23:
JavaScript:
1
anode.onmouseover = new Function('setText('+a+')');

'this' doorgeven levert denk ik een verkeerde referentie op in setText aangezien 'this' in je setPreview functie verwijst naar het window object. Met bovenstaande zou setText er als volgt uitzien ('this' verwijst daar al naar je anchor):
JavaScript:
1
2
3
4
function setText(a)
{
  alert(this.firstChild.nodeValue + ': div ' +  a)
}
inderdaad die this lijkt de boosdoener:

dit werkt:

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
function setPreview()
{
 var li, atxt, anode, item, a, i;
 
 item=document.getElementsByTagName('div');
  for(a=0;a<item.length;a++) {

    if(/gallerylist/.test(item[a].className))

    {
     li=item[a].getElementsByTagName('li');
     for(i=0;i<li.length;i++)
     {
        anode=li[i].getElementsByTagName('a')[0];
        anode.onmouseover=new function(){setText(anode, a);};
        anode.onmouseout=new function(){setNone(anode,a);};

     }
    }
  }
}
function setText(i,current){
alert(i.firstChild.nodeValue + ': div ' +  current)
}


Many thankx ! :*)

[ Voor 20% gewijzigd door Verwijderd op 12-12-2005 13:33 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Vergeet niet dat dergelijke closures een recept zijn voor memory-leaks in IE...
Daarbij is het ook niet nodig aangezien je gewoon 'this' kan gebruiken in setText...

Overigens kan je die 'a' eventueel ook nog als property in het object opslaan:
JavaScript:
1
2
3
4
5
6
7
anode.a = a;
anode.onmouseover = setText;
...
function setText()
{
  alert(this.a);
}

[ Voor 75% gewijzigd door crisp op 12-12-2005 13:42 ]

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op maandag 12 december 2005 @ 13:39:
Vergeet niet dat dergelijke closures een recept zijn voor memory-leaks in IE...
Daarbij is het ook niet nodig aangezien je gewoon 'this' kan gebruiken in setText...

Overigens kan je die 'a' eventueel ook nog als property in het object opslaan:
JavaScript:
1
2
3
4
5
6
7
anode.a = a;
anode.onmouseover = setText;
...
function setText()
{
  alert(this.a);
}
Dit werkt ook erg handig moet ik zeggen, thanks! (maakt meer sense in mijn hoofd)

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
als ik even aan topic hijacking mag gaan doen:

ik heb een soortgelijk probleem (gebaseerd op zelfde structuur als TS)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function init() {
    var item, anode;
    
    item = document.getElementsByTagName('img');
    for(a=0;a<item.length;a++) {
        anode = item[a];
        if(anode.className == "dragimg") {
            anode.a = a;
            anode.onmouseover = new function() { startdrag(); };
            anode.onmouseout = new function() { stopdrag(); };
        }
    }   
}

function startdrag() {
    alert(this.a);
}


het probleem is dat nu 'startdrag' altijd uitgevoerd word als ik de pagina laad, en niet als ik met me muis over zo'n image heen ga.

verder kan ik in de startdrag() functie niet dit doen:
code:
1
this.style.etc.

maar wel dit:
code:
1
2
item = document.getElementsByTagName('img');
item[this.a].style.etc.;

[ Voor 9% gewijzigd door BasieP op 12-12-2005 14:14 ]

This message was sent on 100% recyclable electrons.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

doe dan gewoon dit:
JavaScript:
1
2
anode.onmouseover = startdrag;
anode.onmouseout = stopdrag;

Intentionally left blank


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
crisp schreef op maandag 12 december 2005 @ 14:13:
doe dan gewoon dit:
JavaScript:
1
2
anode.onmouseover = startdrag;
anode.onmouseout = stopdrag;
mm ik ziet dat het werkt.. alleen waarom met () niet, en zonder () wel :S
* BasieP snapt daar de logica niet van, het blijft toch gewoon functie aanroep?

This message was sent on 100% recyclable electrons.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
// anonymous function; wordt toegekent aan var foo:
var foo = function() { alert('foo'); }

// anonymous function, wordt uitgevoerd en de returnvalue wordt toegekent aan var foo:
var foo = new function() { alert('foo'); }

// function reference
var foo = someFunction;

// function constructor
var foo = new Function('alert(\'foo\');');

Intentionally left blank


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
en die is opgeslagen tnx :)
(geen javaboek oid hier :o)

This message was sent on 100% recyclable electrons.


Verwijderd

Topicstarter
Hij werkt, maar ik loop weer tegen iets vaags aan
JavaScript:
1
currentitem = item[a].childNodes[0].getAttribute('id');

Dit werkt in IE6 maar niet in FF:
Fout: item[a].childNodes[0].getAttribute is not a function
Hij verwacht hem in een functie ?

De context:
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
function setPreview()
{
 var li, atxt, anode, item, a, i, currentitem;
 preview = 0
 item=document.getElementsByTagName('div');
  for(a=0;a<item.length;a++) {
    if(/galleryitem/.test(item[a].className))
        {
        currentitem = item[a].childNodes[0].getAttribute('id');
        }
    if(/gallerylist/.test(item[a].className))
    {

     preview ++;
     
     li=item[a].getElementsByTagName('li');
     for(i=0;i<li.length;i++)
     {
        anode=li[i].getElementsByTagName('a')[0];
        anode.p = 'preview'+preview
        anode.img = 'image'+preview
        anode.dtext = anode.firstChild.nodeValue
        anode.mf = currentitem

        anode.onmouseover= setText;
        anode.onmouseout = setNone;
     }
    }
  }
}

De page staat hier.

[ Voor 8% gewijzigd door Verwijderd op 12-12-2005 16:19 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

http://developer.mozilla.org/en/docs/Whitespace_in_the_DOM

Je childNodes[0] is niet het element dat je verwacht, maar een textNode

[ Voor 40% gewijzigd door crisp op 12-12-2005 16:23 ]

Intentionally left blank


Verwijderd

Topicstarter
whitespace issues, daar word je niet vrolijk van.
Je childNodes[0] is niet het element dat je verwacht, maar een textNode
er zit een attribute op de h4 die ik wil uitlezen, de h4 uitlezen heeft geen zin omdat sIFR er replacement meuk in gooit.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op maandag 12 december 2005 @ 16:31:
[...]

whitespace issues, daar word je niet vrolijk van.
Er zijn goede redenen voor die daar uiteengezet worden, samen met sample code waarmee je crossbrowser wel het element kan aanspreken dat je wilt hebben.
[...]

er zit een attribute op de h4 die ik wil uitlezen, de h4 uitlezen heeft geen zin omdat sIFR er replacement meuk in gooit.
Dat snap ik; de h4 is in dit geval niet de 1e childNode maar de 2e in Firefox aangezien de 1e childNode een textNode is die enkel whitespace bevat (zie je broncode).

JavaScript:
1
currentitem = first_child(item[a]).getAttribute('id');

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op maandag 12 december 2005 @ 16:42:
Dat snap ik; de h4 is in dit geval niet de 1e childNode maar de 2e in Firefox aangezien de 1e childNode een textNode is die enkel whitespace bevat (zie je broncode).

JavaScript:
1
currentitem = first_child(item[a]).getAttribute('id');
Ik heb ondertussen dat whitespace script eringehangen en het werkt verder idd vlekkeloos.

bedankt nogmaals!
Pagina: 1