Avatar billede hoppe11 Nybegynder
24. januar 2010 - 20:48 Der er 20 kommentarer og
1 løsning

var i "callback"

jeg kører et objekt igennem en for-løkke og til hver forekomst i objektet skal der kobles en onmouseover funktion til.. problemet er så at at alle funktionerne kun vil henvise sidste forekomst i objektet..

hvordan kommer jeg ud over det? hvordan kan jeg angive en variabel i onmouseover funktionerne der forbliver med den samme værdi?

hvis det gav nogen mening? hehe

for(var key in acc_obj)
{
    var tr_acc = tbl.insertRow(-1);
    tr_acc.onmouseover = function()
    {
        var div_actions = document.getElementById('div_acc_actions'+acc_obj[key].id);
        if(div_actions) div_actions.style.visibility = 'visible';
    };
}
Avatar billede kdasummer Nybegynder
24. januar 2010 - 21:03 #1
lige så snart funktionen har returneret så nulstilles alle variabler. du bør lave en global variabel uden for funktionen som indeholder den værdi du vil gemme. ellers skal den kaldende funktion sørge for at sende variablens værdi med.
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:07 #2
du tænker på 'key'-variablen?

vil du prøve at lave et eksempel?
Avatar billede kdasummer Nybegynder
24. januar 2010 - 21:13 #3
<script>
var global_variabel = "global variabel";

function test() {
  global_variabel = "ny værdi";
}
</script>
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:24 #4
ja, det forstår jeg godt :)

men når min onmouseover-funktion bliver kaldt refererr div_actions altid til den sidste forekomst i det objekt jeg løber igennem
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:26 #5
- det virker som om at onmouseover virker som en callback og den først kalder værdien i det øjeblik den skal bruges.. værdien indeholder derfor den værdi fra sidste løkke i objektet..

hvordan kommer jeg ud over det?
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:28 #6
har også forsøgt at lave variablen udenfor min funktion men lige lidt hjælper det.. den henter stadig den værdi som variablen har i det øjeblik den kaldes.. altså værdien fra sidste lække :-/
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:30 #7
- altså at lave variablen global
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:34 #8
var div_actions = document.getElementById('div_acc_actions'+acc_id);
            tr_acc.onmouseover = function()
            {
                this.style.background = '#dddddd';
               
                if(div_actions) div_actions.style.visibility = 'visible';
            };
            tr_acc.onmouseout = function()
            {
                this.style.background = '';
               
                if(div_actions) div_actions.style.visibility = 'hidden';
            };
Avatar billede intenz Novice
24. januar 2010 - 21:38 #9
Jeg forstår hvad din funktion gør, men hvad for en funktionalitet er det du prøver at opnå?

Lidt mere specifik, hvad indeholder acc_obj?
Avatar billede intenz Novice
24. januar 2010 - 21:41 #10
En anden ting, det ligner at du bare sætter onmouseover eventen på det samme element hele tiden.
var tr_acc = tbl.insertRow(-1);

Jeg kan ikke hvordan det giver flere forskellige elementer, da det er den samme kode der køres hele tiden (måske overser jeg noget?). Men hvis du sætter en onmouseover event på samme element, vil det jo blive overskrevet fra gang til gang, og til sidst er der kun det sidst indsatte tilbage. Som er den værdi du får når du kører eventen.
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:43 #11
acc_obj indeholder et mysql-udtræk som jeg vil skrive en tabel ud fra..

problemet er så at onmouseover jo er en callback funktion.. hvordan kan jeg lave div_actions til noget statisk eller bare så jeg får fat i den rigtige række og ikke den sidste altid..

style.background henviser til rækken jeg står i men det gør div_actions ikke
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:44 #12
var tr_acc = tbl.insertRow(-1);

-1 indsætter bare rækker fra bunden af hvor 0 sætter ind som første række
Avatar billede hoppe11 Nybegynder
24. januar 2010 - 21:48 #13
list ala ASC vs. DESC :)
Avatar billede intenz Novice
24. januar 2010 - 21:58 #14
Ah ja, det har du nok ret i. Længe siden jeg har arbejdet med DOM tabeller :)

Måske vil dette virke (såfremt acc_obj er defineret i globalt scope)?
tr_acc.onmouseover = function(key)

Har du mulighed for evt. at lave et test eksempel, så vi kan teste det. Det bliver lidt noget gætværk :)
Avatar billede hoppe11 Nybegynder
25. januar 2010 - 00:18 #15
her er et eksempel..

http://bogfor.electrobeat.dk/_tst.php

hvis jeg smider en variabel med som parameter bliver den betragtet som en mouseevent
Avatar billede intenz Novice
25. januar 2010 - 12:51 #16
Ja, det kan jeg godt se. Jeg løste problemet ved at smide dine events in i en anonym funktion, der bliver kørt med 'key' som parameter. På den måde bliver den gemt og i den form den er i, når du sætter eventen.

Her er en ny kode til dine to events:
    (function(key){
    tr_acc.onmouseover = function()
    {
        this.style.background = '#dddddd';
        document.getElementById('spn'+acc_obj[key].id).style.visibility = 'visible';
    };
    })(key);
   
    (function(key){
        tr_acc.onmouseout = function()
        {
            this.style.background = '';
           
            document.getElementById('spn'+acc_obj[key].id).style.visibility = 'hidden';
        };
    })(key);
Avatar billede hoppe11 Nybegynder
25. januar 2010 - 13:47 #17
perfekt! :)

har du et link til noget dokumentation for den slags funktioner?
Avatar billede intenz Novice
25. januar 2010 - 14:25 #18
Nej, ikke rigtigt. Det er lidt langhåret og jeg forstår det ikke selv nok til at kunne forklare andre det :)

Du kan prøve at søge på 'javascript closures' og ser om der er noget der er til at forstå :)
Avatar billede hoppe11 Nybegynder
25. januar 2010 - 15:39 #19
nej ok.. det ser også lidt stwange ud :)
Avatar billede hoppe11 Nybegynder
12. februar 2010 - 12:28 #20
her er en god introduktions video, hvis man er helt blank på closures :)

http://www.vimeo.com/1967261
Avatar billede intenz Novice
12. februar 2010 - 12:46 #21
Cool, den vil jeg kigge på :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester