Avatar billede challenge Praktikant
19. september 2007 - 21:02 Der er 11 kommentarer og
1 løsning

"Highlight" og "de-highlight" af billede

Hej.

Jeg har en produktside hvor produktbilledet, selvfølgelig skal kunne skiftes, således at kunden kan se flere af disse.
Til at skifte mellem billederne har jeg en række "tal-billeder" (i stedet for tal/tekst). Når jeg trykker på f.eks. tallet 3 vises tal nr. 3 i rækken, samtidig med at dette tal (dvs. "tal-billedet") bliver highlighted - I dette tilfælde ved at javascript i et link ændrer på billedets src.

Mit problem er bare, at hvis jeg - herefter - vælger f.eks. billede nr. 4, bliver "tal-billedet" nr. 3 ikke "de-highlighted", dvs det går ikke tilbage, når et nyt billede vælges; Hvordan gør jeg således at dette sker, samt at tallet 1 automatisk er highlighted når siden åbnes første gang eller opdateres?

Koden ser ud som følger:

(<?php $i; ?> bruges til at udskrive selve tallet, da antallet af "billede-tal" udregnes via en while-løkke i PHP)

<script type="text/JavaScript">     
function changeImage(refElm, strImageId, strImgPath)
{
    var img = document.getElementById(strImageId);
 
    img.src = strImgPath;
 
    img.onclick = function() { window.location = refElm.href; };
}
</script>

<script type="text/JavaScript">     
function changeImageNumber(refElm, strImageId, strImgPath)
{
    var img = document.getElementById(strImageId);
 
    img.src = strImgPath;
 
    img.onclick = function() { window.location = refElm.href; };
}
</script>

<img id="productimage" src="images/products/1_thumb/1.png" alt="Click to enlarge" border="0" style="border:1px solid #b2b2b2;" />

<a onclick="changeImage(this, 'productimage', 'images/products/1_thumb/<?php echo $i; ?>.png'); changeImageNumber(this, 'number<?php echo $i; ?>', 'images/numbers/hover/<?php echo $i; ?>.png');" href="java script:void(0);">
    <img id="number<?php echo $i; ?>" src="images/numbers/<?php echo $i; ?>.png" width="11" height="7" alt="" border="0" />
</a>

Jeg håber at jeg har kunne beskrive mit problem, således at dette kan forstås!

Mvh,
Avatar billede kalp Novice
19. september 2007 - 22:07 #1
den her bør i hvertfald rettes fra
img.src = strImgPath;
til
img.setAttribute("src",strImgPath);


hvis du vil highlighte noget når siden loades så tror jeg det kan gøres hvis du tilføjer denne i din <body> tag.

<body onload="changeImageNumber(document.getElementById('mylink'), 'number1')" >

og lægger et ID på dit link

<a id="mylink" onclick="changeImage(this, 'productimage', 'images/products/1_thumb/<?php echo $i; ?>.png'); changeImageNumber(this, 'number<?php echo $i; ?>', 'images/numbers/hover/<?php echo $i; ?>.png');" href="java script:void(0);">
    <img id="number<?php echo $i; ?>" src="images/numbers/<?php echo $i; ?>.png" width="11" height="7" alt="" border="0" />
</a>
Avatar billede kalp Novice
19. september 2007 - 22:10 #2
til det andet med dehighlight billedet så ville jeg nok gøre det på en måde så jeg kan starte med at hente dem alle sammen i et array.. løbe array'et igennem når jeg skal highlighte.. køre dehightlight på dem som ikke matcher den som har kaldt functionen og kalde hightlight på den som har.
Avatar billede challenge Praktikant
19. september 2007 - 22:52 #3
Hej - mange tudinde tak; jeg vil prøve efter bedste evne!

Smid et svar, og modtag point som fortjent :)
Avatar billede kalp Novice
19. september 2007 - 22:55 #4
ingen årsag:)
Avatar billede olebole Juniormester
19. september 2007 - 22:56 #5
<ole>

Normalt sætter man en global variabel til det highlight'ede element - og reset'er det lige før, man highlight'er et nyt.

I øvrigt bør du ikke sætte onclik-handlers, som du gøre nu. Du skaber cirkulære referencer, hvilket æder hukommelse i IE ... hukommelse, der først frigives, når IE lukkes.

Skriv dem i stedet direkte i img-taggene  ;o)

/mvh
</bole>
Avatar billede challenge Praktikant
20. september 2007 - 17:38 #6
Hej Ole,

Jeg kan umiddelbart ikke forstå hvad du mener med cirkulære referencer - er det fordi der er to javascript i mine onclick's?
Avatar billede olebole Juniormester
20. september 2007 - 23:50 #7
Problemet opstår fordi, du bruger variablen 'refElm' i den indre funktion, der er medsendt som argument til den ydre funktion
Avatar billede roenving Novice
21. september 2007 - 14:40 #8
-- er det så objekt-referencen, der opbevares uendeligt ?-)
Avatar billede olebole Juniormester
21. september 2007 - 15:49 #9
Præcis! Den bliver så at sige 'hængende i scopet', uden IE evner at bryde referencen i sin hukommelse  ;o)

Det forbandede ved IE's elendige garbage-collection er, at det ofte kan være vanskeligt eller enddog uoverskueligt at erkende 'farlige' closures og cirkulære referencer ... ikke mindst i mere komplekse applikationer. Derfor kommer man ofte langt ved at holde tingene så simple, som muligt  :)
Avatar billede roenving Novice
21. september 2007 - 16:00 #10
Ok, KISS ...

-- jeg ved ikke, om du har registreret, at jeg bruger et simpelt opdaterings-script til at holde flere vinduer opdateret, men i hvert fald, så har IE spist ½ Gb, når jeg har været på i 1½-2 timer, så jeg er nødt til at starte forfra og lukke iexplore-processen manuelt ...

-- aktuelt har jeg i hukommelsesforbrug 494 Mb, men summen af aktive processer giver kun omkring ~330, tallet bliver sammenligneligt, hvis jeg lukker som nævnt ...

Jeg mistænker processer i de browsersider jeg har åbne, men kan det være min egen opdateringsfunktion ?-)

PS. Jeg udnytter, at window.open benytter windowName-parameteren til at genbruge vinduer !-)
Avatar billede olebole Juniormester
21. september 2007 - 17:56 #11
Yups ... KISS my APP ...!  ;D
- hvorfor står det i øvrigt ikke på en af mine T-shirts? Eller:

var s = "\u0052\u0054"
+"\u0046\u004d\u0021"
    window.alert(s)

- nå, en idé til en driftig iværksætter  :)

Din 'ECat-Reader' er et glimrende eksempel på det, jeg ofte skriver om i AJAX-spørgsmål her på E. Man kunne f.eks. også forestille sig, du sætter handlers på de enkelte spm-links, før de er indsat i dokumentet ... et memory-issue, vi før har talt om i en tråd.

Den slags ting betyder ikke en delle, når der hele tiden navigeres mellem dokumenter og scripting ligger på et minimum - som ved et klassisk website/web-applikation. Det betyder heller ikke noget, hvis det sker i noget AJAX-kommunikation, hvor der foretages forholdsvis få requests. Til gengæld går det let galt med en 'reader' som din.
Eller forestil dig, hvor lækkerlig en phpMyAdmin man ville kunne lave i AJAX. Sådan en app kan laves, så den fuldstændig ligner og føles som en 'ægte' Win-app - men får man ikke styr på alle de dér små hukommelsestab, går der netop Win95 i den efter et par timer og skidtet skal genstartes. AJAX-chats er et andet typsik eksempel.

Status på mine lovede AJAX-artikler er, at det ser ud, somom jeg i anden forbindelse bliver hyret til at skrive en håndfuld artikler om emnet ... den første, som allerede er på plads, omhandler dog en anden af mine skamredne kæpheste ... take a wild guess!  :)
I den forbindelse skriver jeg samtidig udvidede versioner - opdelt i endnu flere artikler - og lægger dem på www.dengodekode.dk

Jeg tror - i al falsk beskedenhed - at der vil være masser af interessant læsestof for de fleste ... fra den absolut middelmådige til den erfarne, gråskæggede scripter  ;o)

Du kender min GMail-adresse, og du er mere end velkommen til at kaste mig koden. Så skal jeg se, om ikke jeg kan finde de værste syndere  :)
Avatar billede olebole Juniormester
21. september 2007 - 18:03 #12
PS: i mine lydteknikerdage fik jeg faktisk lave et par T-shirts med teksten:
    E = m * C^2 ± 3 dB
... nåja ... er man nørd, er man vel nørd  :o|
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