Avatar billede tipsen Nybegynder
27. november 2003 - 19:19 Der er 2 kommentarer og
2 løsninger

True / False / Cookies - fungerer ikke ordentligt!

Hej Eksperter

Jeg har følgende JavaScript til at lave "snevejr":

/******************************************
* Snow Effect Script- By Altan d.o.o. (snow@altan.hr, http://www.altan.hr/snow/index.html)
* Visit Dynamic Drive (http://www.dynamicdrive.com/) for full source code
* Modified Dec 31st, 02' by DD. This notice must stay intact for use
******************************************/
function GetCookie(name) {
    var namestr = name + "=";
    var namelen = namestr.length;
    var cooklen = document.cookie.length;
    var i = 0;
    while (i < cooklen) {
        var j = i + namelen;
        if (document.cookie.substring(i, j) == namestr) {
            endstr = document.cookie.indexOf (";", j);
            if (endstr == -1) {
                endstr = document.cookie.length;
            }
            return Boolean(unescape(document.cookie.substring(j,endstr)));
        }
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0) break;
    }
    return true;
}

function snowStart() {
    if(snow_on && ie4up) {
        document.images['snow_on'].style.visibility = 'hidden';
        document.images['snow_off'].style.visibility = 'visible';
        var expdate = new Date ();
        expdate.setTime(expdate.getTime() + (7 * 24 * 60 * 60 * 1000 * 365));
        document.cookie = "snowenabled=" + snow_on + "; expires=" + expdate.toGMTString();
        snow_on = !snow_on;
        for (i = 0; i < no; ++ i) {
            document.all['dot'+i].style.visibility = 'visible';
        }
        snowIE();
    }
    else {
        document.images['snow_on'].style.visibility = 'visible';
        document.images['snow_off'].style.visibility = 'hidden';
    }
}


function snowStop(){
    if(!snow_on && ie4up) {
        document.images['snow_on'].style.visibility = 'visible';
        document.images['snow_off'].style.visibility = 'hidden';
        var expdate = new Date ();
        expdate.setTime(expdate.getTime() + (7 * 24 * 60 * 60 * 1000 * 365));
        document.cookie = "snowenabled=" + snow_on + "; expires=" + expdate.toGMTString();
        for (i = 0; i < no; ++ i) {
            document.all['dot'+i].style.visibility = 'hidden';
        }
        snow_on = !snow_on;
    }
    else {
        document.images['snow_on'].style.visibility = 'hidden';
        document.images['snow_off'].style.visibility = 'visible';
    }
}

function snowIE() {  // IE main animation function
    if (!snow_on) {
        for (i = 0; i < no; ++ i) {  // iterate for every dot
            yp[i] += sty[i];
            if (yp[i] > doc_height-50) {
                xp[i] = Math.random()*(doc_width-am[i]-30);
                yp[i] = 0;
                stx[i] = 0.02 + Math.random()/10;
                sty[i] = 0.7 + Math.random();
                doc_width = document.body.clientWidth;
                doc_height = document.body.clientHeight;
            }
            dx[i] += stx[i];
            document.all["dot"+i].style.pixelTop = yp[i];
            document.all["dot"+i].style.pixelLeft = xp[i] + am[i]*Math.sin(dx[i]);
        }
        setTimeout("snowIE()", 5);
    }
}

var ie4up = (document.all) ? true : false;
var snow_on = GetCookie("snowenabled") || true;

if (ie4up) {
    //Configure below to change URL path to the snow image
    var snowsrc="snow.gif";
    // Configure below to change number of snow to render
    var no = 20;
    var dx, xp, yp;    // coordinate and position variables
    var am, stx, sty;  // amplitude and step variables
    var i;

    doc_width = document.body.clientWidth;
    doc_height = document.body.clientHeight;

    dx = new Array();
    xp = new Array();
    yp = new Array();
    am = new Array();
    stx = new Array();
    sty = new Array();

    for (i = 0; i < no; ++ i) {
        dx[i] = 0;                        // set coordinate variables
        xp[i] = Math.random()*(doc_width-50);  // set position variables
        yp[i] = Math.random()*doc_height;
        am[i] = Math.random()*20;        // set amplitude variables
        stx[i] = 0.02 + Math.random()/10; // set step variables
        sty[i] = 0.7 + Math.random();    // set step variables
        document.write("<div id=\"dot"+ i +"\" style=\"POSITION: absolute; Z-INDEX: "+ i +"; VISIBILITY: hidden; TOP: 15px; LEFT: 15px;\"><img src='"+snowsrc+"' border=\"0\"><\/div>");
    }
}

Kombineret med følgende html-kode:

    <body onload="snowStart();">
    <script src="snow.js" language="javascript" type="text/javascript"></script>
    <img id="snow_on" src="snow_on.gif" alt="Start snevejret" onclick="snowStart();" /><img id="snow_off" src="snow_off.gif" alt="Stop snevejret" onclick="snowStop();" />

Ideen er at man skal kunne slå snevejret til eller fra og indstillingen skal kunne huskes på tværs af flere sider - men det fungerer ikke og jeg fatter absolut ikke hvorfor!

Problemet er vistnok evalueringen af true/false i snowStart() og snowStop() funktionerne - det fungerer vist ikke helt som jeg forventer!

Jeg er mega-dårlig til at lave fejlsøgning i javascripts, så jeg har ikke været i stand til at finde fejlen - håber I kan hjælpe!

Mvh Tipsen
Avatar billede roenving Novice
29. november 2003 - 05:12 #1
-- et umiddelbart gæt er at du forveksler id'er med class'es, for du har vel et snevejr med mere end eet snefnug ?-)

-- lige nu vil jeg ikke bruge en masse tid, men skriv gerne igen, senere idag regner jeg med at kunne koncentrere mig om den slags ting i et par timer !-)
Avatar billede dawin_dk Nybegynder
29. november 2003 - 07:03 #2
var snow_on = GetCookie("snowenabled") || true;

.... her henter du det ikke fra cookie alligevel men siger den bare skal være true .... så sæt den til true istedet :)
Avatar billede tipsen Nybegynder
29. november 2003 - 13:26 #3
Hej igen

Jeg fandt flere småfejl rundt omkring, hvor JavaScript ikke gjorde som forventet - det var bl.a. fortolkningen af cookie values som ikke blev korrekt fortolket til true/false.

Derudover var der fejlen som dawin.dk gjorde opmærksom på - det var efterladenskaberne fra en oprindelig cookie funktion der var "vendt om" mht. true/false.

Til sidst satte jeg så også den endelige værdi for snow_on i selve funktionskaldet, da jeg ellers fik lidt problemer med initialiseringen.

dawin: Smid et svar - så får du lidt point for din rettelse.
Avatar billede dawin_dk Nybegynder
29. november 2003 - 15:14 #4
k :)
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