Avatar billede zeque Nybegynder
30. december 2009 - 23:15 Der er 6 kommentarer og
1 løsning

Problem med FadeIn

Jeg har lavet 2 funktioner (FadeIn og FadeOut). Desværre er det kun FadeOut der virker. Hvad har jeg gjort forkert?

I kan se scriptet her:
http://mm-hotel.dk/jsFade.html

Tak på forhånd
Avatar billede zeque Nybegynder
31. december 2009 - 00:20 #1
Ingen der kan se hvad der skulle være galt?
Avatar billede nidyahou Praktikant
31. december 2009 - 01:32 #2
Du kan se problemet i log'en.

Problemet opstår ved følgende:

du trykker på "FadeOut" et interval starter som tager .02 af opacity efter hvert interval

Derefter klikker du på FadeIn som lægger .02 til opacity efter hvert interval

Når du klikker på FadeIn er boxens opacity = 0. så sker følgende

FadeIn-interval:
Box.opacity = .02
Fadeout-interval:
Box.opacity = .00

FadeIn-interval:
Box.opacity = .02
Fadeout-interval:
Box.opacity = .00

osv...

Dit FadeIn interval neutraliserer altså effekten af dit fadeout Interval.

Du bliver nødt til at bruge clearInterval() metoden

Du kan f.eks registerere i din Fadeout

function fadeOut(element, speed) {
5 if(!element.style.opacity) { element.style.opacity = 1; }
6 setInterval(function() {
7 if(element.style.opacity > 0) {
8 element.style.opacity -= .02;
9 console.log(element.style.opacity);
NY LINIE:}else{clearInterval();
10 }
11 }, speed / 50);
12 }
13
14 function fadeIn(element, speed) {
15 if(!element.style.opacity) { element.style.opacity = 0; }
16 setInterval(function() {
17 if(element.style.opacity != 1) {
18 element.style.opacity += .02;
19 console.log(element.style.opacity);
NY LINIE:}else{clearInterval();
20 }
21 }, speed / 50);
22 }


NB: har ikke testet koden, men dette er uden tvivl problemet
Avatar billede zeque Nybegynder
31. december 2009 - 01:58 #3
Mange tak for dit svar.
Jeg har prøvet at rette til hvad du foreslog, men det virker desværre stadigvæk ikke. Den reagere nøjagtig på samme måde som før i konsollen: http://mm-hotel.dk/jsFade.html
Avatar billede tjens Nybegynder
31. december 2009 - 11:19 #4
Her er en omskrivning, hvor der er taget højde for 3 problemstillinger:
- setInterval kører for evigt i baggrunden, som nidyahou skriver i #2
- Der er ikke beskyttelse mod at køre in og out samtidig, hvilket looper
- Vil alle browsere lave korrekt type konvertering af en style attribut så der kan regnes videre?

Ændret HTML linie:
<span onclick="fade('box', 'out');">FadeOut</span> <span onclick="fade('box', 'in');">FadeIn</span>

Helt nyt script:
var fadeWorking = false;
var speed = 10;

function fade(elementName, fadeType) {
    if (fadeWorking == true) return;
    var element = document.getElementById(elementName);
    if(!element.style.opacity) {
        if (fadeType == 'out' )
            element.style.opacity = 1
        else     element.style.opacity = 0;
    }
    fadeWorking = true;
    if (fadeType == 'out' )
            fadeOut(elementName)
        else     fadeIn(elementName);
}

function fadeOut(elementName) {
    var element = document.getElementById(elementName);
    var opaFloat = parseFloat(element.style.opacity);
    if(opaFloat > 0.0) {
        element.style.opacity = opaFloat - 0.02;
        setTimeout('fadeOut("'+elementName+'")', speed);
    } else {
        fadeWorking = false;
    }
}

function fadeIn(elementName) {
    var element = document.getElementById(elementName);
    var opaFloat = parseFloat(element.style.opacity);
    if(opaFloat < 1.0) {
        element.style.opacity = opaFloat + 0.02;
        setTimeout('fadeIn("'+elementName+'")', speed);
    } else {
        fadeWorking = false;
    }
}

Det kan optimeres yderligere, men jeg har nok ikke tid idag:
- Bruge setInterval og clearInterval for bedre performance
- "Pakke" scriptet i et JSON-objekt for at undgå globale variable m.m.
- Sætte opacity fra starten i style, så initieringen kan udgå fra script.
Avatar billede nidyahou Praktikant
31. december 2009 - 11:27 #5
jQuery ville kunne håndtere problemet på denne måde:

$("#boxid").stop().fadeIn()
$("#boxid").stop().fadeOut()

www.jquery.com
Avatar billede tjens Nybegynder
31. december 2009 - 13:29 #6
Version med JSON objekt og setInterval/clearInterval:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Javascript Fade</title>
<script type="text/javascript">
    var oFade = {
        speed:        10,
        element:    null,
        timer:        null,
       
        start:    function(elementName, fadeType) {
            if (this.element) return;
            this.element = document.getElementById(elementName);
            if (fadeType == 'out' )
                    this.timer = setInterval('oFade.fadeOut()', this.speed)
            else     this.timer = setInterval('oFade.fadeIn()',  this.speed);
        },

        fadeOut: function () {
            var opaFloat = parseFloat(this.element.style.opacity);
            if(opaFloat > 0.0) {
                this.element.style.opacity = opaFloat - 0.02;
            } else {
                clearInterval(oFade.timer);
                this.element = null;
            }
        },
           
        fadeIn:    function () {
            var opaFloat = parseFloat(this.element.style.opacity);
            if(opaFloat < 1.0) {
                this.element.style.opacity = opaFloat + 0.02;
            } else {
                clearInterval(oFade.timer);
                this.element = null;
            }
        }
    }
</script>
</head>
<body>
    <div id="box" style="width:200px; height:200px; background:red; opacity: 1;"></div>
    <button onclick="oFade.start('box', 'out');">FadeOut</button> <button onclick="oFade.start('box', 'in');">FadeIn</button>
</body>
</html>
Avatar billede zeque Nybegynder
31. december 2009 - 15:29 #7
#5
Normalt bruger jeg også jQuery, men jeg vil også lære hvordan man laver tingene i ren Js.

#6
Tusind tak for hjælpen
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