Avatar billede stane Nybegynder
16. november 2004 - 13:16 Der er 2 kommentarer og
1 løsning

Favoritliste med cookies

Når jeg vil slette et objekt i min cookie, bliver det sidste objekt altid slettet i stedet for det objekt, som jeg klikker på. Kan i hjælpe? Her er den komplette kode:

<SCRIPT language=javascript type=text/javascript>
    function CheckBrowser(){
        this.bolIsDom            = document.getElementById ? 1:0
    }
   
    var objBrowser = new CheckBrowser()

    function OpbygCookie(StrNavn, StrIndhold, StrUdloeber, StrSikkerhed) {
        var ObjDenneCookie = StrNavn + '=' + escape(StrIndhold) + '; path=/' +
        ((StrUdloeber) ? '; expires=' + StrUdloeber.toGMTString() : '') +
        ((StrSikkerhed) ? '; secure' : '');
        document.cookie = ObjDenneCookie;
    }

    function HentCookie(StrNavn) {
        var ObjCookie = document.cookie;
        var StrFortegn = StrNavn + '=';
        var StrStart2 = ObjCookie.indexOf('; ' + StrFortegn);
        if (StrStart2 == -1) {
            StrStart2 = ObjCookie.indexOf(StrFortegn);
            if (StrStart2 != 0) return null;
        } else {
            StrStart2 += 2;
        }
        var StrSlut = document.cookie.indexOf(';', StrStart2);
        if (StrSlut == -1)
            StrSlut = ObjCookie.length;
        return unescape(ObjCookie.substring(StrStart2 + StrFortegn.length, StrSlut));
    }

    function SletCookie(StrNavn) {
        if (HentCookie(StrNavn)) {
            document.cookie = StrNavn + '=' +
            '; expires=Thu, 01-Jan-70 00:00:01 GMT';
        }
    }
   
    function SkrivDato(){
        var StrDenneDato = new Date();
        FixDato(StrDenneDato);
        return new Date((StrDenneDato.getTime() +  28 * 24 * 60 * 60 * 1000));
    }

    function FixDato(dtmDate) {
        var objBase = new Date(0);
        var objSkew = objBase.getTime();
        if (objSkew > 0)
            dtmDate.setTime(dtmDate.getTime() - objSkew);
    }

    function SkiftKnapFavorit(StrBilledeID, StrBilledeNavn){
        objButton = new favClientElement(StrBilledeID);
        objButton.imgUrl(StrBilledeNavn);
    }
   
    function TilfoejTilFavoritter(StrObjektNr, StrStartDato, StrAntalDage, StrBilledeID){
        var ObjektFavoritter = HentCookie('favFavoritter');
        var StrObjektID = '' + StrObjektNr + ',' + StrStartDato + ',' + StrAntalDage + '';
        if(!FindObjektIFavoritter(StrObjektNr, StrStartDato, StrAntalDage)){
            if (!ObjektFavoritter){
                OpbygCookie('favFavoritter', StrObjektID, SkrivDato(), false);
            } else {
                var StrCookieIndhold = HentCookie('favFavoritter');
                OpbygCookie('favFavoritter', StrCookieIndhold + ';' + StrObjektID, SkrivDato(), false)
            }
            SkiftKnapFavorit(StrBilledeID, 'btn_fjern_favoritter.gif');
        } else {
            SletObjektFraFavoritter(StrObjektNr, StrStartDato, StrAntalDage);
            SkiftKnapFavorit(StrBilledeID, 'btn_tilfoej_favoritter.gif');
        }
    }
   
    function SletObjektFraFavoritter(StrObjektNr, StrStartDato, StrAntalDage){
        var ObjektFavoritter = HentCookie('favFavoritter');
        var StrObjektID = '' + StrObjektNr + ',' + StrStartDato + ',' + StrAntalDage + '';
        var StrNyListe = '';
        if(ObjektFavoritter){
            var ArrDenneListe = ObjektFavoritter.split(';');
            for(i=0;i<ArrDenneListe.length;i++){
                if(ArrDenneListe[i] != StrObjektID){
                    (StrNyListe!='') ? StrNyListe += ';' : StrNyListe += '';
                    StrNyListe += ArrDenneListe[i];
                }
            }
        }
        SletCookie('favFavoritter');
        OpbygCookie('favFavoritter', StrNyListe, SkrivDato(), false);
    }
   
    function FindObjektIFavoritter(StrObjektNr, StrStartDato, StrAntalDage){
        var ObjektFavoritter = HentCookie('favFavoritter');
        var StrObjektID = '' + StrObjektNr + ',' + StrStartDato + ',' + StrAntalDage + '';
        var FindesObjekt = false;
        if(ObjektFavoritter){
            var ArrDenneListe = ObjektFavoritter.split(';');
            for(i=0;i<ArrDenneListe.length;i++){
                if(ArrDenneListe[i] == StrObjektID){
                    return FindesObjekt = true;
                }
            }
        }
    }

function favClientElement(strId){
    this.id = strId;
    (objBrowser.bolIsDom == 1) ? this.element = document.getElementById(strId) : this.element = document.all[strId] ;
    this.style = this.element.style;
}

favClientElement.prototype.imgUrl = function(strUrl){
    this.element.src = strUrl;
}


var ObjektFavoritter2 = HentCookie('favFavoritter');

if (ObjektFavoritter2 == null)
{
document.write("Der er ingen huse i din favoritliste!");
}
else
{
// opdeler data i objekter
var ArrAlleHuse = ObjektFavoritter2.split(';');
for (y=0; y<ArrAlleHuse.length; y++)
{

// opdeler objektet i tre segmenter; objektnr, startdato og varighed
var ArrHeleListen = ArrAlleHuse[y].split(',');
for (i=0; i<ArrHeleListen.length; i++)
{
var Objektnummer = (ArrHeleListen[i])
document.write ("PD"+Objektnummer+"&nbsp;&nbsp;");
i = i + 1
var StartDato = (ArrHeleListen[i])
i = i + 1
var Varighed = (ArrHeleListen[i])

// link til at slette objekt fra favoritlisten
document.write('<a href="#" onclick="SletObjektFraFavoritter(Objektnummer,StartDato,Varighed,y);document.location.reload();"><img src="btn_fjern_favoritter.gif" border="0" id="'+y+'" alt=""></a><br>');

}
}
}
</SCRIPT>

Jeg regner med, det går galt i det sidste loop et eller andet sted, men jeg kan ikke regne den ud... :'(
Avatar billede luzk Nybegynder
16. november 2004 - 16:55 #1
Jeg har lavet lidt om på din kode til følgende, der ser ud til at virke:

======

<SCRIPT language=javascript type=text/javascript>
    function CheckBrowser(){
        this.bolIsDom            = document.getElementById ? 1:0
    }
 
    var objBrowser = new CheckBrowser()

    function OpbygCookie(StrNavn, StrIndhold, StrUdloeber, StrSikkerhed) {
        var ObjDenneCookie = StrNavn + '=' + escape(StrIndhold) + '; path=/' +
        ((StrUdloeber) ? '; expires=' + StrUdloeber.toGMTString() : '') +
        ((StrSikkerhed) ? '; secure' : '');
        document.cookie = ObjDenneCookie;
    }

    function HentCookie(StrNavn) {
        var ObjCookie = document.cookie;
        var StrFortegn = StrNavn + '=';
        var StrStart2 = ObjCookie.indexOf('; ' + StrFortegn);
        if (StrStart2 == -1) {
            StrStart2 = ObjCookie.indexOf(StrFortegn);
            if (StrStart2 != 0) return null;
        } else {
            StrStart2 += 2;
        }
        var StrSlut = document.cookie.indexOf(';', StrStart2);
        if (StrSlut == -1)
            StrSlut = ObjCookie.length;
        return unescape(ObjCookie.substring(StrStart2 + StrFortegn.length, StrSlut));
    }

    function SletCookie(StrNavn) {
        if (HentCookie(StrNavn)) {
            document.cookie = StrNavn + '=' +
            '; expires=Thu, 01-Jan-70 00:00:01 GMT';
        }
    }
 
    function SkrivDato(){
        var StrDenneDato = new Date();
        FixDato(StrDenneDato);
        return new Date((StrDenneDato.getTime() +  28 * 24 * 60 * 60 * 1000));
    }

    function FixDato(dtmDate) {
        var objBase = new Date(0);
        var objSkew = objBase.getTime();
        if (objSkew > 0)
            dtmDate.setTime(dtmDate.getTime() - objSkew);
    }

    function SkiftKnapFavorit(StrBilledeID, StrBilledeNavn){
        objButton = new favClientElement(StrBilledeID);
        objButton.imgUrl(StrBilledeNavn);
    }
 
    function TilfoejTilFavoritter(StrObjektNr, StrStartDato, StrAntalDage, StrBilledeID){
        var ObjektFavoritter = HentCookie('favFavoritter');
        var StrObjektID = '' + StrObjektNr + ',' + StrStartDato + ',' + StrAntalDage + '';
        if(!FindObjektIFavoritter(StrObjektNr, StrStartDato, StrAntalDage)){
            if (!ObjektFavoritter){
                OpbygCookie('favFavoritter', StrObjektID, SkrivDato(), false);
            } else {
                var StrCookieIndhold = HentCookie('favFavoritter');
                OpbygCookie('favFavoritter', StrCookieIndhold + ';' + StrObjektID, SkrivDato(), false)
            }
            SkiftKnapFavorit(StrBilledeID, 'btn_fjern_favoritter.gif');
        } else {
            SletObjektFraFavoritter(StrObjektNr, StrStartDato, StrAntalDage);
            SkiftKnapFavorit(StrBilledeID, 'btn_tilfoej_favoritter.gif');
        }
    }
 
    function SletObjektFraFavoritter(StrObjektNr, StrStartDato, StrAntalDage){
        var ObjektFavoritter = HentCookie('favFavoritter');
        var StrObjektID = '' + StrObjektNr + ',' + StrStartDato + ',' + StrAntalDage + '';
        var StrNyListe = '';
        if(ObjektFavoritter){
            var ArrDenneListe = ObjektFavoritter.split(';');
            for(i=0;i<ArrDenneListe.length;i++){
                if(i != StrObjektNr){
                    (StrNyListe!='') ? StrNyListe += ';' : StrNyListe += '';
                    StrNyListe += ArrDenneListe[i];
                }
            }
        }
        SletCookie('favFavoritter');
        OpbygCookie('favFavoritter', StrNyListe, SkrivDato(), false);
    }
 
    function FindObjektIFavoritter(StrObjektNr, StrStartDato, StrAntalDage){
        var ObjektFavoritter = HentCookie('favFavoritter');
        var StrObjektID = '' + StrObjektNr + ',' + StrStartDato + ',' + StrAntalDage + '';
        var FindesObjekt = false;
        if(ObjektFavoritter){
            var ArrDenneListe = ObjektFavoritter.split(';');
            for(i=0;i<ArrDenneListe.length;i++){
                if(ArrDenneListe[i] == StrObjektID){
                    return FindesObjekt = true;
                }
            }
        }
    }

function favClientElement(strId){
    this.id = strId;
    (objBrowser.bolIsDom == 1) ? this.element = document.getElementById(strId) : this.element = document.all[strId] ;
    this.style = this.element.style;
}

favClientElement.prototype.imgUrl = function(strUrl){
    this.element.src = strUrl;
}


var ObjektFavoritter2 = HentCookie('favFavoritter');

if (ObjektFavoritter2 == null)
{
document.write("Der er ingen huse i din favoritliste!");
}
else
{
// opdeler data i objekter
var ArrAlleHuse = ObjektFavoritter2.split(';');
for (y=0; y<ArrAlleHuse.length; y++)
{

// opdeler objektet i tre segmenter; objektnr, startdato og varighed
var ArrHeleListen = ArrAlleHuse[y].split(',');
var Objektnummer = (ArrHeleListen[0])
document.write ("PD"+Objektnummer+"&nbsp;&nbsp;");
var StartDato = (ArrHeleListen[1])
var Varighed = (ArrHeleListen[2])

// link til at slette objekt fra favoritlisten
var strObj = ""+y
document.write('<a href="#" onclick="SletObjektFraFavoritter(' + strObj + ',StartDato,Varighed,y);document.location.reload();"><img src="btn_fjern_favoritter.gif" border="0" id="'+y+'" alt=""></a><br>');

}
}
</SCRIPT>
=======

Følgende er lavet om:
generelt set er der ændret så der benyytes objektets plads i arrayet

I SletObjektFraFavoritter har jeg ændret til if(i != StrObjektNr) for at den looper igennem hele arrayet og kigger efter pladsen. Der er ændret så der benyttes selve nummeret istedet for hele objektet

I udskriftsdelen er der ændret så der ikke loopes igennem objekterne. Du kender pladserne af elementerne i objektet, og derfor sparer du noget tid/CPU kraft på denne måde.

Derudover skriver jeg pladsen på objektet ud som et string object istedet, da det den ellers er en reference til det sidst indsatte objekt istedet for det nummer du reelt vil have skrevet

Håber det er forståeligt :o)

/Luzk
Avatar billede stane Nybegynder
16. november 2004 - 20:34 #2
Tusind tak for svaret. Koden virker perfekt, men der er opstået et lille problem efter din rettelse.
Når jeg bruger følgende kald til henholdsvis at skrive og slette et enkelt objekt, kan jeg kun klikke tilføj/fjern to gange. Derefter virker funktionen ikke mere. Jeg kan se problemet opstår omkring den linie, du har ændret i SletObjektFraFavoritter.

<SCRIPT language=javascript src="favoritliste.js" type=text/javascript></SCRIPT>

<SCRIPT language=javascript type=text/javascript>
if(FindObjektIFavoritter('22','27-12-2004','14')){
    document.write('<a href="java script:void(0);" onclick="TilfoejTilFavoritter(\'22\',\'27-12-2004\',\'14\',\'1\');"><img src="btn_fjern_favoritter.gif" border="0" id="1" alt=""></a>');
} else {
    document.write('<a href="java script:void(0);" onclick="TilfoejTilFavoritter(\'22\',\'27-12-2004\',\'14\',\'1\');"><img src="btn_tilfoej_favoritter.gif" border="0" id="1" alt=""></a>');
}
</SCRIPT>

Du får pointsene under alle omstændigheder, men det ville være lækkert, hvis du også ville knække dette problem. *-=:-)
Avatar billede luzk Nybegynder
17. november 2004 - 10:20 #3
Tak for point :o) men hmm - havde ikke lige set du ville give så meget for det - sikker på du ikke vil have nogle af dem igen?

Anyway, så tror jeg det er pga du ikke reloader dit site efter at have klikket på tilføj.

prøv følgende:

===================
<SCRIPT language="javascript" src="favoritliste.js" type=text/javascript></SCRIPT>

<SCRIPT language=javascript type=text/javascript>
if(FindObjektIFavoritter('22','27-12-2004','14')){
    document.write('<a href="java script:void(0);" onclick="TilfoejTilFavoritter(\'22\',\'27-12-2004\',\'14\',\'1\');document.location.reload();"><img src="btn_fjern_favoritter.gif" border="0" id="1" alt=""></a>');
} else {
    document.write('<a href="java script:void(0);" onclick="TilfoejTilFavoritter(\'22\',\'27-12-2004\',\'14\',\'1\');document.location.reload();"><img src="btn_tilfoej_favoritter.gif" border="0" id="1" alt=""></a>');
}
</SCRIPT>

===================

Håber det virker, ellers hopper vi på den til den lader være med at give problemer :o)

/Luzk
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