Philip: Ein kleienr Bug, aber keine Lösung

Hallo!

Ich habe einen kleine Script gebastelt für einen Regler, danke nochmal an Jochen für die Hilfe! Jetzt hab ich aber einen Bug drin, den ich nicht rausbekomme:
Wenn ich die function "plus" aufrufe, nachdem ich die seite einmal aktualisiert habe oder wieder auf sie draufgehe, dann springt die Variabele "i" wieder auf 0 und ich muss von vorne ran...
Hoffe ihr könnt mir helfen!
Hier mal die wichtigen Teile des Codes:

<script type="text/javascript">
var b = new Array();
b[0] = new Image(); b[0].src = "sch0.gif";
b[1] = new Image(); b[1].src = "sch1.gif";
b[2] = new Image(); b[2].src = "sch2.gif";
b[3] = new Image(); b[3].src = "sch3.gif";
b[4] = new Image(); b[4].src = "sch4.gif";
b[5] = new Image(); b[5].src = "sch5.gif";
b[6] = new Image(); b[6].src = "sch6.gif";
b[7] = new Image(); b[7].src = "sch7.gif";
b[8] = new Image(); b[8].src = "sch8.gif";
b[9] = new Image(); b[9].src = "sch9.gif";
b[10] = new Image(); b[10].src = "sch10.gif";
b[11] = new Image(); b[11].src = "sch11.gif";
b[12] = new Image(); b[12].src = "sch12.gif";
b[13] = new Image(); b[13].src = "sch13.gif";
b[14] = new Image(); b[14].src = "sch14.gif";
b[15] = new Image(); b[15].src = "sch15.gif";
b[16] = new Image(); b[16].src = "sch16.gif";
b[17] = new Image(); b[17].src = "sch17.gif";
b[18] = new Image(); b[18].src = "sch18.gif";
b[19] = new Image(); b[19].src = "sch19.gif";
b[20] = new Image(); b[20].src = "sch20.gif";
var max = b.length-1;
var min = 0;
var i = 0

function plus (){
if (document.cookie !=i){
i = document.cookie;
}
if (i > 19){
i = i
}
else {
i = i + 1;
if (i > max){
i = min
}
document.cookie = i
document.images[3].src = b[i].src;
}
}

function minus () {
if (document.cookie !=i){
i = document.cookie;
}
if (i < 1){
i = i
}
else {
i = i - 1;
if (i < min){
i = max;
}
document.cookie = i
document.images[3].src = b[i].src;
}
}
function merken () {
document.images[3].src = b[i = document.cookie].src
}
function ein () {
i = 20
document.cookie = i
document.images[3].src = b[i].src;
}
function aus () {
i = 0
document.cookie = i
document.images[3].src = b[i].src;
}
</script>
  </head>
  <body background="main.gif" onload=merken()>

  1. Hallo Philip,

    das ist kein Bug, sondern ganz Normal.
    Ich habe mich dann damit beholfen, meine Werte in den
    Window Namen zu schreiben.
    Denn beim Seitenwechsel wird das Dokument und nicht das Window neu geladen.

    Es gibt natürlich noch andere Ansätze.
    Cookie, Frameset

    Bernd

  2. Hallo Philip, Stefan oder wie immer Du heißen magst,

    Ich habe einen kleine Script gebastelt für einen Regler, danke nochmal an Jochen für die Hilfe! Jetzt hab ich aber einen Bug drin, den ich nicht rausbekomme:

    die selbe Frage hast Du heute schon einmal gestellt. Glaubst Du, das fällt nicht auf? Mit Drängelei machst Du Dir weder in diesem Forum noch im Leben Freunde.

    <body background="main.gif" onload=merken()>

    Das ist ungültiges HTML.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  3. Hallo Philip,

    function merken () {
    document.images[3].src = b[i = document.cookie].src
    }

    so was habe ich noch nie gesehen. Versuch mal:

    function merken () {
     i = document.cookie;
     document.images[3].src = b[i].src;
    }

    function ein () {
    i = 20

    das dürfte "knallen", da b nur 20 einträge hat, also 0 <= i <= 19 . Also besser i = 19;

    document.cookie = i
    document.images[3].src = b[i].src;
    }

    ob noch mehr falsch ist, sehe ich auf so schnell nicht.

    Gruß, Jürgen

    1. Hallo Jürgen,

      document.images[3].src = b[i = document.cookie].src
      so was habe ich noch nie gesehen.

      ist aber durchaus erlaubt und in Ordnung. Auch eine Zuweisung darf als Teilausdruck in einem größeren Ausdruck auftreten. Der Wert dieses Teilausdrucks ist der Wert, der der Variablen zugewiesen wurde.

      i = document.cookie;
      document.images[3].src = b[i].src;

      Das ist genau dasselbe, nur in zwei Anweisungen gesplittet.

      Solche eleganten Formulierungen wie die oben zitierte wende ich auch gern an, und ich habe schon oft erlebt, dass dann Leute behaupten, "Das ist falsch". Meistens ist dieser Eindruck dann falsch.  ;-)

      i = 20
      das dürfte "knallen", da b nur 20 einträge hat, also 0 <= i <= 19 . Also besser i = 19;

      Gut beobachtet: Wenn das Array 20 Elemente hat, ist der Index ersten Elements 0, der des letzten Elements 19.

      So long,

      Martin

      1. Hallo Martin,

        » »» »» document.images[3].src = b[i = document.cookie].src

        so was habe ich noch nie gesehen.

        ist aber durchaus erlaubt und in Ordnung. Auch eine Zuweisung darf als Teilausdruck in einem größeren Ausdruck auftreten. Der Wert dieses Teilausdrucks ist der Wert, der der Variablen zugewiesen wurde.

        das kannte ich noch nicht. Danke für die Info.

        Gruß, Jürgen

    2. Guten Morgen!

      Danke für eure Antworten!

      Wie speichert man den den Wert einer variabelen im window? So wie etwas weiter unten vorgeschlagen... Kennt da jemand ein gutes Beispiel?

      Das mit der 20 knallt übrigens nicht!!! Denn, der array hat 20 einträge! Wenn man aus der 20 eine 19 macht, dann wird der Balken nicht ganz voll, also muss 20 richtig sein... 21 das wäre einer zu viel...

      1. Hallo Philip,

        Wie speichert man den den Wert einer variabelen im window?

        was meinst du damit?

        Das mit der 20 knallt übrigens nicht!!! Denn, der array hat 20 einträge! Wenn man aus der 20 eine 19 macht, dann wird der Balken nicht ganz voll, also muss 20 richtig sein... 21 das wäre einer zu viel...

        stimmt. Aber warum benutzt du nicht die Variable max?
        Wenn das mit den cookies nicht klappt, musst du debuggen. Gibt dir mal an den entsprechenden Stellen die aus dem Cookie ausgelesenen Werte mit alert(i) aus.
         Beim Blick in deinen Code ist mir noch einiges aufgefallen:

        function plus (){
        if (document.cookie !=i){
        i = document.cookie;
        }
        if (i > 19){

        warum hier nicht max? Und da der Wert aus dem Cookie kommt, muss auch gegen min geprüft werden.

        i = i

        bist du sicher?

        }
        else {
        i = i + 1;
        if (i > max){
        i = min
        }
        document.cookie = i
        document.images[3].src = b[i].src;
        }
        }

        function minus () {
        if (document.cookie !=i){
        i = document.cookie;
        }
        if (i < 1){

        warum hier nicht min? Und hier gegen max prüfen.

        i = i

        bist du sicher?

        }
        else {
        i = i - 1;
        if (i < min){
        i = max;
        }
        document.cookie = i
        document.images[3].src = b[i].src;
        }
        }

        ich glaube, dass es nicht sinnvoll ist, jedesmal vor dem Ändern i aus dem Cookie zu lesen und danach zurückzuschreiben. Am Anfang lesen und am Ende schreiben müsste reichen. Hilfsmittel sind die Eventhandler onload und onunload, die du in den body-Tag legst.

        Gruß, Jürgen

        1. Ok, danke!
          Sowas hatte ich mir schon gedacht, mache das ja erst seit nicht mal 2 Wochen, also Javascript,
          und ich hatte es mal mit logischem Überlegen probiert und das ganze auch seeeeeehr modular aufgebaut.
          Es fehlt noch an ein bisschen mehr Verschachtelung...

          1. Hallo Philip,

            Ok, danke!

            Bitte sehr.

            Bist du eigentlich jetzt der Stefan aus https://forum.selfhtml.org/?t=115996&m=741712 oder hast du nur die gleiche Hausaufgabe und bei ihm abgeschrieben?

            Gruß, Jürgen

            1. Bist du eigentlich jetzt der Stefan aus https://forum.selfhtml.org/?t=115996&m=741712 oder hast du nur die gleiche Hausaufgabe und bei ihm abgeschrieben?

              Ne bin schon der selbe, hab nur 2 Namen... mal stefan mal Philip, nach Lust...
              Aber ich werde bei Philip bleiben ist mein erster...

              1. Hallo!

                So da bin ich wieder!
                Ich habe den Fehler gefunden, aber ich weiß nicht wie er zu lösen ist!
                Also wenn ich vor dem Reload die Variable "i" den Wert 1 hat, dann mach die function "plus" aus "1" "11". Wenn der Wert vor dem reload "2" ist, dann wird es zu "21", also zu "0" durch die "min" Abfrage. Wie schaffe ich es das zu verhindern und es so zumachen, das aus "1" nicht "11" wird sonder "2"?

                hier nochmals der Script:

                <script type="text/javascript">
                var b = new Array();
                b[0] = new Image(); b[0].src = "sch0.gif";
                b[1] = new Image(); b[1].src = "sch1.gif";
                b[2] = new Image(); b[2].src = "sch2.gif";
                b[3] = new Image(); b[3].src = "sch3.gif";
                b[4] = new Image(); b[4].src = "sch4.gif";
                b[5] = new Image(); b[5].src = "sch5.gif";
                b[6] = new Image(); b[6].src = "sch6.gif";
                b[7] = new Image(); b[7].src = "sch7.gif";
                b[8] = new Image(); b[8].src = "sch8.gif";
                b[9] = new Image(); b[9].src = "sch9.gif";
                b[10] = new Image(); b[10].src = "sch10.gif";
                b[11] = new Image(); b[11].src = "sch11.gif";
                b[12] = new Image(); b[12].src = "sch12.gif";
                b[13] = new Image(); b[13].src = "sch13.gif";
                b[14] = new Image(); b[14].src = "sch14.gif";
                b[15] = new Image(); b[15].src = "sch15.gif";
                b[16] = new Image(); b[16].src = "sch16.gif";
                b[17] = new Image(); b[17].src = "sch17.gif";
                b[18] = new Image(); b[18].src = "sch18.gif";
                b[19] = new Image(); b[19].src = "sch19.gif";
                b[20] = new Image(); b[20].src = "sch20.gif";
                var max = b.length-1;
                var max2 = b.length-2;
                var min = 0;
                var min2 = 1;
                var i = 0;
                function merken () {
                document.images[3].src = b[i = document.cookie].src
                i = document.cookies
                }
                function plus (){
                if (document.cookie !=i){
                i = document.cookie;
                }
                if (i > max2){
                i = i
                }
                else {
                i = i + 1;
                if (i > max){
                i = min
                }
                document.cookie = i
                document.images[3].src = b[i].src;
                }
                }
                function minus () {
                if (document.cookie !=i){
                i = document.cookie;
                }
                if (i < min2){
                i = i
                }
                else {
                i = i - 1;
                if (i < min){
                i = max;
                }
                document.cookie = i
                document.images[3].src = b[i].src;
                }
                }
                function ein () {
                i = b.length-1;
                document.cookie = i
                document.images[3].src = b[i].src;
                }
                function aus () {
                i = 0
                document.cookie = i
                document.images[3].src = b[i].src;
                }
                </script>

                1. Hallo Philip,

                  Also wenn ich vor dem Reload die Variable "i" den Wert 1 hat, dann mach die function "plus" aus "1" "11". Wenn der Wert vor dem reload "2" ist, dann wird es zu "21", also zu "0" durch die "min" Abfrage. Wie schaffe ich es das zu verhindern und es so zumachen, das aus "1" nicht "11" wird sonder "2"?

                  das liegt daran, dass der Inhalt eines Cookies ein Text und keine Zahl ist. Wendet man auf Texte den "+"-Operator an, werden sie aneinandergehängt. Mach einfach aus dem Cookie eine Zahl, dann solte es klappen:

                  i = parseInt(document.cookie) ;

                  Hier noch die Doku dazu.

                  Gruß, Jürgen