Fabian Transchel: Cookies und ihre Eigenheiten...

Moin SelferInnen,

ich habe ein fast schon chronisch reproduzierbares Problem, nämlich mit den so beliebten JS-Kekschen.

Und zwar tut es folgender Code offline ganz gut:

function theme1()
{
var theme = 1;
[...]
var Verfall = 1000*60*60*24*365;
var jetzt = new Date();
var Auszeit = new Date(jetzt.getTime() + Verfall);
document.cookie = "theme=" + theme + "; expires="+Auszeit.toGMTString()+";";
}

function theme2()
{
var theme = 2;
[...]
var Verfall = 1000*60*60*24*365;
var jetzt = new Date();
var Auszeit = new Date(jetzt.getTime() + Verfall);
document.cookie = "theme=" + theme + "; expires="+Auszeit.toGMTString()+";";
}

function theme3()
{
var theme = 3;
[...]
var Verfall = 1000*60*60*24*365;
var jetzt = new Date();
var Auszeit = new Date(jetzt.getTime() + Verfall);
document.cookie = "theme=" + theme + "; expires="+Auszeit.toGMTString()+";";
}

function checktheme()
{
 var theme = "";
 if(document.cookie)
                    {
                    var Wertstart = document.cookie.indexOf("=") + 1;
                    var Wertende = document.cookie.indexOf(";");
                    if (Wertende == -1)
                       {
                       Wertende = document.cookie.length;
                       theme = document.cookie.substring(Wertstart,Wertende);
                       }
                    }
 else
                    {
                    theme = 1;
                    }
 alert(theme);
switch(theme)
             {
             case "2":
             theme2();
             break;
             case "3":
             theme3();
             break;
             default:
             theme1();
             break;
             }
}

so weit so gut, bloß online funzt des ding net. (is n tripod-server, falls das relevant ist)

wo ist der fehler?

Fabian

ps: die fehlerfreiheit der durch [...] dargestellten befehle ist sichergestellt ;)

  1. Hallo,

    vermutlich hast du Probleme mit Wertstart und Wertende:

    var Wertstart = document.cookie.indexOf("=") + 1;
    var Wertende = document.cookie.indexOf(";");

    Das ist unsauber programmiert. Wertstart wird nur richtig gefunden, wenn "theme=" der Anfang der abgespeicherten Zeichenkette im Cookie ist. Das dürfte allerdings bei deinem online-Test der Fall sein, bis du für etwas anderes noch ein Cookie brauchst. Du solltest also für Wertstart stattdessen nach "theme=" suchen.

    Dass es aktuell nicht geht, liegt aber vermutlich an Wertende. Ein Semikolon kommt nur, wenn danach im Cookie noch mehr steht, sonst ist einfach Schluß. Zu Hause (offline) hast du sicher vom Testen her noch irgendetwas anderes hinter "theme=1" im Cookie stehen, z.B. könnte der Cookie wegen eines früheren Tippfehlers bei Testen so aussehen: "theme=1;thame=1". Dann funktioniert es, bis die Löschzeit für thame erreicht ist, und dann weiß du nicht, warum es plötzlich (bei dir nach einem Jahr) nicht mhr geht. (Nämlich, weil dann auch das Semikolon gelöscht wird!) Online wird ein ganz neues Cookie angelegt, da ist "theme=1" der einzige Eintrag, es gibt von vorn herein kein Semikolon. Lösung: bei Wertende=-1 (also: Semikolon nicht gefunden) musst du document.cookie.length+1 für Wertende nehmen, dann sollte es klappen.

    Gruß
    Hans35

    1. Hi,

      hab noch was vergessen: Bei mehreren Cookie-Eintragungen mußt du das richtige Semikolon erwischen, nämlich das erste nach "theme=".

      Wenn du willst, kannst du das bei mir unter http://www.vonSanssouci.de/snd00.htm (Cookie lesen) bzw. [http://www.vonSanssouci.de/snd0.htm] (Cookie schreiben) abkupfern, da hab ich sowas mal programmiert. Aber besser du schaust mit einem Editor in deine Cookies selbst hinein, was genau drin steht, so hab ich's auch gemacht.

      Gruß
      Hans35

      1. hi

        danke für die tipps, mittlerweile geht es. da ich weiß, welche werte theme nur haben kann (nämlich "","1","2" oder "3") hab ich eben einen switch gemacht, nu geht's :)

        Fabian