Tobi: Einfache if-Abfrage schlägt fehl

Hi

der OP ist eigentlich hier, da der aber inzwischen archiviert wurde und ich keine Antwort erhielt, starte ich hier einen erneuten Versuch.

Mein Skript, das ich nun gebaut habe, sieht so aus:

  
 var zeichenkette = document.cookie;  
 var worte = zeichenkette.split(';');  
  
 for (var i in worte)  
 {  
  worte[i] = worte[i].split('=');  
  
  for (var j in worte[i])  
  {  
   document.write('worte[' + i + '][' + j + ']: ' + worte[i][j]);  
  
   if(worte[i][0]=="announceinh")  
   {  
    document.write(' - <strong>J</strong>');  
   }  
  
   if(worte[i][0]=="ta")  
   {  
    document.write(' - <strong>J</strong>');  
   }  
  
   document.write('<br>');  
  
  }  
  document.write('<br>');  
 }  

Da document.cookie ein reiner String ist, der immer nach folgendem Schema aufgebaut ist:

cookiename=cookiewert;cookiename2=cookiewert2

spalte ich ihn in ein mehrdimensionales Array.

Dieses gehe ich dann mit einer for-in-Schleife einzeln durch, und prüfe auf den Cookienamen.
Es wird immer die Position der Schleife im Array ausgegeben, dazu der Cookiename bzw der Wert. Immer wenn der Cookiename gleich "ta" oder "announceinh" ist, wird zusätzlich ein " - J" für "Ja" ausgegeben.

Ausgegeben wird aber nur:

worte[0][0]: ta - J
worte[0][1]: none - J

worte[1][0]: announceinh
worte[1][1]: none

... obwohl neben "announceinh" ein J stehen müsste. Warum tu es das nicht?

Der Cookiename "announceinh" existiert in dieser Schreibweise (Copy&Paste).

Ich erkläre mich gerade für verrückt. Bitte helft mir.

Tobi

  1. Hallo,

      
    
    >  var zeichenkette = document.cookie;  
    >  var worte = zeichenkette.split(';');  
    >   
    >  for (var i in worte)  
    >  {  
    >   worte[i] = worte[i].split('=');  
    >   
    
    

    hast du dir 'zeichenkette' schon mal ausgeben lassen, möglicherweise findest du dort noch störende Zeichen drin?

    Gruß plan_B

    --
         *®*´¯`·.¸¸.·
    1. Hi

      hast du dir 'zeichenkette' schon mal ausgeben lassen, möglicherweise findest du dort noch störende Zeichen drin?

      Ich gebe ja jedes Element aus "zeichenkette" aus. Es gibt noch mehr Cookies, die angezeigt werden, das war nun nur ein Ausschnitt (der wichtigste, um den es geht).
      Und dadrin sind keine störende Zeichen.

      Das einzige, was ich einmal bemerkt habe, ist, dass der Firefox, nachdem ein Cookie gelöscht wurde, eine "0" statt "cookiename=cookiewert" setzt. Ich benutze nicht Firefox, also besteht dieses Problem (im Moment noch) nicht.

      MfG
      Tobi

      1. Hallo,

        ich vermutete, dass nach dem Semikolon noch ein Leerzeichen oder ähnliches folgt und das wirst du mit deiner Ausgabe nicht erkennen.

          
        
        > document.write('worte[' + i + '][' + j + ']: ' + worte[i][j]);  
          
        aber vielleicht so  
          
        document.write('worte[' + i + '][' + j + ']: "' + worte[i][j]+'"');  
        
        

        Gruß plan_B

        --
             *®*´¯`·.¸¸.·
  2. Lieber Tobi,

    steht Dein JavaScript-Code in einer externen JavaScript-Datei, oder ist er im <head> eines HTML-Dokumentes notiert?

    Im zweiteren Falle würde unter syntaktischen Umständen bereits diese Zeile

    document.write(' - <strong>J</strong>');

    Deinen Scriptbereich beenden.

    Bitte sei doch so nett und vereinfache willigen Helfern das Helfen, indem Du mit etwas mehr Details um Dich wirfst!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi

      steht Dein JavaScript-Code in einer externen JavaScript-Datei, oder ist er im <head> eines HTML-Dokumentes notiert?

      Im Moment gibt es nicht mal einen <head>. Ich teste das in einer eigenen Datei namens "test.html", die besitzt nur ein <script type="text/javascript">, und am Ende ein </script>. Dazwischen der Code.
      Der Code, den ich euch gegeben habe, steht in einer Funktion. Die wird nach Funktionsende (also nach dem "}" ) aufgerufen.

      Man kann also sagen, momentan steht es noch im "head" (der nicht existiert). Aber wenn ich den Code in in mein Projekt einbaue, wird das in einer separaten JavaScript-Datei stehen.

      Im zweiteren Falle würde unter syntaktischen Umständen bereits diese Zeile

      document.write(' - <strong>J</strong>');
      Deinen Scriptbereich beenden.

      Wieso denn das?
      Das hieße ja, dass nach dem "J" gar nichts mehr stehen dürfte, weil ja (nach dir) das gesamte Script beendet wird? Dem ist aber nicht so, danach geht es noch weiter (wie du siehst).

      Bitte sei doch so nett und vereinfache willigen Helfern das Helfen, indem Du mit etwas mehr Details um Dich wirfst!

      gerne doch. Siehe oben.
      Naja, ich dachte, der Code wäre genug. Aber scheinbar doch nicht.

      Ich werde gleich mal versuchen, das in eine die separate JS-Datei zu packen.

      MfG
      Tobi

  3. Okay, Kommando zurück.
    Ich hab den Fehler gefunden. Dank dir, plan_B.

    Der Fehler besteht darin, dass ich beim Erstellen des Cookies folgenden Code benutze:

      
     a = new Date(a.getTime() +1000*60*60*24*365);  
     document.cookie=teil+'='+status+';expires='+a.toGMTString()+';';  
    
    

    Dabei sind "teil" und "status" Variabeln, die an die Funktion übergeben wurden. teil ist "announceinh" oder "ta". status ist "none" oder "block".

    Lasse ich mir danach mit "alert(document.cookie);" alle Cookies ausgeben, bemerke ich, dass der zuletzt gesetzte Cookie (es wird immer nur _ein_ Cookie gesetzt bzw aktualisiert) hintendran noch ein Leerzeichen gesetzt bekommen hat. Das sieht dann so aus:

    ta=none; announceinh=block;...
            ^
    oder andersrum:

    announceinh=block; ta=none;...
                      ^
    Also, es gibt nun zwei Möglichkeiten. Entweder ich versuche beim Setzen des Cookies irgendwie das Leerzeichen zu entfernen. Oder ich entferne es beim Auslesen.
    Aber egal, für was ich mich entscheide, ich muss immer ein Leerzeichen durch einen Leerstring ersetzen.
    Dafür stellt JavaScript keine Funktion bereit, also googelte ich und fand diesen Code (wenn euer Browser euch umleitet, dann müsst ihr einmal den Zurück-Button klicken. War bei mir so).

    Folgendes schrieb ich dann zu der Funktion, die den Cookie setzt/aktualisiert (natürlich habe ich davor die Funktion SuchenUndErsetzen in meinen Code eingefügt):

      
     document.cookie=SuchenUndErsetzen(document.cookie," ","");  
    
    

    Dies blieb ohne Effekt.

    Ich möchte schon beim Setzen des Cookies das Leerzeichen entfernen.
    Welche Möglichkeiten bieten sich mir noch?

    MfG
    Tobi

    1. Liebe(r) Tobi,

      Aber egal, für was ich mich entscheide, ich muss immer ein Leerzeichen durch einen Leerstring ersetzen.

      Du bräuchtest also eine Funktion wie trim() in PHP, stimmt's? Das hatte ich hier doch erst neulich auch gefragt...

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hi

        Du bräuchtest also eine Funktion wie trim() in PHP, stimmt's? Das hatte ich hier doch erst neulich auch gefragt...

        Richtig, genau dieselbe PHP-Funktion bräuchte ich. Hab da schon viele Google-Ergebnisse gehabt, aber immer unterschiedliche Skripts.

        Aber diese Prototypen sind mir schon zu hoch (bin noch nicht allzuweit mit JavaScript gekommen, wie ihr vielleicht schon bemerkt habt). Wie muss ich diese Prototypen anwenden?
        Ich schätze, ich setze deinen Code einfach ganz an den Anfang der JavaScript-Datei bzw dem <script>-Block. Und danach würde ich einfach

          
        document.cookie.trim;  
        
        

        schreiben. Oder vielleicht so:

          
        document.cookie=document.cookie.trim;  
        
        

        ? Oder mit Klammern, weil es ja eine Funktion ist?

          
        document.cookie=document.cookie.trim();  
        
        

        MfG
        Tobi

        1. [latex]Mae  govannen![/latex]

          ? Oder mit Klammern, weil es ja eine Funktion ist?

          document.cookie=document.cookie.trim();

            
          Üblicherweise genau so. Wobei diese Funktion -wiederum üblicherweise- nur führende und/oder angehängte Leerzeichen entfernt, wenn du also in document.cookie `"bla=yy; fasel=dd"`{:.language-javascript} als String hast, wird das LZ nicht entfernt. Also solltest du es erst nach dem Aufsplitten auf die einzelnen Teilstings anwenden. Alternativ, wenn du genau weißt, daß nie anderswo im cookie ein LZ auftreten wird, kannst du alle LZ natürlich auch direkt im gesamten String mittels [replace](http://de.selfhtml.org/javascript/objekte/string.htm#replace) entfernen  
            
          Cü,  
            
          Kai
          
          -- 
          Some things in life are bad, they can really make you mad  
          Other things just make you swear and curse.  
          When you're chewing on life's gristle, don't grumble, give a whistle  
          And this'll help things turn out for the best...  
          ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|]
          
        2. Lieber Tobi,

          document.cookie=document.cookie.trim();

          fast! Du möchtest doch Wertepaare aufsplitten und benötigst dann getrimmte Teile des jeweiligen Paars, oder nicht?

          An anderer Stelle in diesem Thread schreibst Du das hier:

          var zeichenkette = document.cookie;  
          var worte = zeichenkette.split(';');  
          for (var i in worte)  
          {  
            worte[i] = worte[i].split('=');
          

          Das könntest Du nun so weiterschreiben:

          var zeichenkette = document.cookie;  
          var worte = zeichenkette.split(';');  
          for (var i in worte)  
          {  
            worte[i] = worte[i].split('=');  
            for (var j in worte[i])  
            {  
              worte[i][j] = worte[i][j].trim();  
            }  
          }  
          // Jetzt mit "worte" weiterarbeiten!
          

          Hoffentlich ist das eine Lösung für Dein Problem.

          Liebe Grüße aus Ellwangen,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    2. Hi,

      Lasse ich mir danach mit "alert(document.cookie);" alle Cookies ausgeben, bemerke ich,

      Na endlich ... betreibst du mal ansatzweise Debugging.

      dass der zuletzt gesetzte Cookie (es wird immer nur _ein_ Cookie gesetzt bzw aktualisiert) hintendran noch ein Leerzeichen gesetzt bekommen hat. Das sieht dann so aus:

      ta=none; announceinh=block;...
              ^
      oder andersrum:

      announceinh=block; ta=none;...
                        ^
      Also, es gibt nun zwei Möglichkeiten. Entweder ich versuche beim Setzen des Cookies irgendwie das Leerzeichen zu entfernen.

      Kannste knicken. Das fuegt der Browser da ein, ohne dass du Einfluss drauf hast.

      Oder ich entferne es beim Auslesen.

      Da du bereits split() nutzt, um die einzelnen cookiename=cookiewert-Paare zu erhalten, waere es am einfachsten, einfach dort neben dem Semikolon noch ein eventuelles Leerzeichen (oder sonstigen Whitespace, falls das irgendein Browser anders handeln mag) in die Trennzeichenkette mit aufzunehmen, in dem man einen kurzen regulaeren Ausdruck zum Splitten verwendet:

      document.cookie.split(/;\s?/);

      MfG ChrisB

  4. Hi

    so, abschließend hab ich es nun doch endlich geschafft. Ich hab es sogar in das Projekt eingebaut und angepasst, es funktioniert nun ohne Probleme.

    Danke an euch, ihr seid spitze!

    MfG
    Tobi