Sigi: Webkit verhindert Ausführung

Hallo zusammen,

bin neu hier und unfähig einen Fehler zu finden, der JavaScript Ausführungen in Webkit Browsern (Safari/Chrome)verhindert, während Firefox, Opera und IE "normal" funktionieren.

Der folgende Code ermöglicht einfaches Speichern, Auslesen und Löschen von Cookies (auch in Safari und Chrome). Seit Einfügen des Codes zum Anzeigen der noch verfügbaren Zeichen funktioniert nur noch das Auslesen. Wie geschrieben - in nicht Webkit basierenden Browsern - funktioniert Speichern und Löschen weiterhin.

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title></title>
<script type="text/javascript">
function saveCookie (cTitle, cValue, cExpiration) {
  var now = new Date();
  var endTime = new Date(now.getTime() + cExpiration);
  document.cookie = cTitle+"="+escape(cValue)+"; expires="+endTime.toGMTString()+";";
}
function readCookie (cTitle) {
  var dcookie = document.cookie;
  var cname = cTitle+"=";
  var clen = dcookie.length;
  var cbegin = 0;
  while (cbegin < clen) {
    var vbegin = cbegin + cname.length;
if (dcookie.substring(cbegin, vbegin) == cname) {
  var vend = dcookie.indexOf(";", vbegin);
  if (vend == -1) vend = clen;
  return unescape(dcookie.substring(vbegin, vend));
}
    cbegin = dcookie.indexOf(" ", cbegin) + 1;
    if (cbegin == 0) break;
  }
  return null;
}
function killCookie (cTitle) {
  document.cookie = cTitle+"="+"; expires=Thu, 01-Jan-70 00:00:01 GMT;";
}
function CheckLen(Target) {
 StrLen = Target.value.length
 if (StrLen == 1 && Target.value.substring(0,1) == " ") {
  Target.value = ""; StrLen = 0;
 }
 if (StrLen > 4000 ) {
  Target.value = Target.value.substring(0,4000);
   CharsLeft = 0;
 }
 else {
  CharsLeft = 4000 - StrLen;
 }
 document.memo.numb.value = CharsLeft;
}
</script>
</head>
<body>
<h2>Memo</h2>
<form name="memo">
<p><label for="cTitle">Title:</label><br />
<input type="text" id="cTitle" name="cTitle" size="37" value="Cookie01" /></p>
<p><label for="cValue">Content:</label><br />
<textarea id="cValue" name="cValue" cols="50" rows="10" onChange="CheckLen(this)" onFocus="CheckLen(this)" onKeyDown="CheckLen(this)" onKeyUp="CheckLen(this)">Memos will be saved in your browser as cookies - with a lifetime of 12 month!</textarea></p>
<p><input type="button" onClick="javascript:cValue.value=(readCookie(document.forms[0].elements[0].value))" value="read memo" />
<input type="button" onclick="javascript:saveCookie(document.forms[0].elements[0].value, document.forms[0].elements[1].value, 1000*60*60*24*365)" value="save memo" />
<input type="button" onClick="javascript:killCookie(document.forms[0].elements[0].value)" value="delete memo" /> Characters left: <input type="text" name="numb" size="4" maxlength="4" readonly /></p>
</form>
</body>
</html>

Nachdem ich definitiv kein JavaScript King bin, kann ich auch nicht abschätzen, ob das ein Webkit Bug ist. Was auch nicht wirklich wichtig ist, nur, was muss man ändern, um in jedem Browser eine einwandfreie Funktion zu bekommen?

Schon mal vielen Dank für Eure Hilfe!
Sigi

  1. Hi,

    Der folgende Code ermöglicht einfaches Speichern, Auslesen und Löschen von Cookies (auch in Safari und Chrome). Seit Einfügen des Codes zum Anzeigen der noch verfügbaren Zeichen funktioniert nur noch das Auslesen.

    Was sagt die Fehlerkonsole dazu, und was hat dein Debugging ergeben?

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi,

      Der folgende Code ermöglicht einfaches Speichern, Auslesen und Löschen von Cookies (auch in Safari und Chrome). Seit Einfügen des Codes zum Anzeigen der noch verfügbaren Zeichen funktioniert nur noch das Auslesen.

      Was sagt die Fehlerkonsole dazu, und was hat dein Debugging ergeben?

      MfG ChrisB

      Mache wahrscheinlich etwas falsch, denn dass die Fehlerkonsole vom Firefox leer bleibt versteh ich (dort funktioniert der Code ja), aber auch das Debugging im Safari ergibt nix?!

      Schönen Gruß
      Sigi

  2. Hi!

    Nachdem ich definitiv kein JavaScript King bin, kann ich auch nicht abschätzen, ob das ein Webkit Bug ist. Was auch nicht wirklich wichtig ist, nur, was muss man ändern, um in jedem Browser eine einwandfreie Funktion zu bekommen?

    Dazu musst du, wie ChrisB schon sagte, Debugging betreiben, um erst einmal zu ermitteln, ws die Ursache ist. Im einfachsten Fall verfolgt man die zu verarbeitenden Werte mit Kontrollausgaben. Also kontrolliere mit ein paar alert()s, ob die Werte, die du da tatsächlich verarbeitest auch deinen Vorstellungen entsprechen.

    <textarea id="cValue" name="cValue" cols="50" rows="10" onChange="CheckLen(this)" onFocus="CheckLen(this)" onKeyDown="CheckLen(this)" onKeyUp="CheckLen(this)">Memos will be saved in your browser as cookies - with a lifetime of 12 month!</textarea></p>
    <input type="button" onclick="javascript:saveCookie(document.forms[0].elements[0].value, document.forms[0].elements[1].value, 1000*60*60*24*365)" value="save memo" />

    1000 Jahre sind etwas mehr als 12 Monate. Und das in Sekunden ausgedrückt übersteigt 32-Bit, was vielleicht ein Fehler sein kann, den du jedoch mit einer Kontrollausgabe entdecken könntest. Es müssten, wenn die 32 Bit zuschlagen, falsche Datumswerte in der Folgeverarbeitung auftauchen.

    Außerdem ist das "javascript:" in den Eventhandlern unnötig, siehe bei der textarea, da hast du auch keine drin. Es wird nur bei Links im href-Attribut benötigt, aber auch da kann man stattdessen Eventhandler verwenden.

    Lo!

    1. Hi!

      Nachdem ich definitiv kein JavaScript King bin, kann ich auch nicht abschätzen, ob das ein Webkit Bug ist. Was auch nicht wirklich wichtig ist, nur, was muss man ändern, um in jedem Browser eine einwandfreie Funktion zu bekommen?

      Dazu musst du, wie ChrisB schon sagte, Debugging betreiben, um erst einmal zu ermitteln, ws die Ursache ist. Im einfachsten Fall verfolgt man die zu verarbeitenden Werte mit Kontrollausgaben. Also kontrolliere mit ein paar alert()s, ob die Werte, die du da tatsächlich verarbeitest auch deinen Vorstellungen entsprechen.

      Das ist das Problem - alle Werte sind absolut korrekt. Also auch Safari und Chrome geben bei den Alerts die korrekten Daten wieder. Nur das "Schreiben" des Cookies (setzen/löschen) macht der Browser nicht. Auslesen wie gesagt schon.

      <textarea id="cValue" name="cValue" cols="50" rows="10" onChange="CheckLen(this)" onFocus="CheckLen(this)" onKeyDown="CheckLen(this)" onKeyUp="CheckLen(this)">Memos will be saved in your browser as cookies - with a lifetime of 12 month!</textarea></p>
      <input type="button" onclick="javascript:saveCookie(document.forms[0].elements[0].value, document.forms[0].elements[1].value, 1000*60*60*24*365)" value="save memo" />

      1000 Jahre sind etwas mehr als 12 Monate.

      Öh, sorry, das sind 1000 Millisekunden mal 60 Sek. mal ....

      Außerdem ist das "javascript:" in den Eventhandlern unnötig, siehe bei der textarea, da hast du auch keine drin. Es wird nur bei Links im href-Attribut benötigt, aber auch da kann man stattdessen Eventhandler verwenden.

      Korekt, da hab ich gepennt. Löst aber natürlich nicht das Problem.

      Das Verflixte an diesem Problem ist ja, dass ich irgendwie keinen Grund für das Nichtfunktionieren in den Webkit Browsern finden kann. Wahrscheinlich brauche ich einen JavaScript König, der auf Mac zuhause ist. Nur kenne ich leider keinen.

      Lo!

      Verzweifelte Grüße
      Sigi

      1. Hi!

        Das ist das Problem - alle Werte sind absolut korrekt. Also auch Safari und Chrome geben bei den Alerts die korrekten Daten wieder. Nur das "Schreiben" des Cookies (setzen/löschen) macht der Browser nicht. Auslesen wie gesagt schon.

        Also auch der Datumswert für die Expiration des Kekses?

        Öh, sorry, das sind 1000 Millisekunden mal 60 Sek. mal ....

        Stimmt, hast Recht. Ich wollte ja nur mal sehen, ob du aufpasst ...

        Das Verflixte an diesem Problem ist ja, dass ich irgendwie keinen Grund für das Nichtfunktionieren in den Webkit Browsern finden kann. Wahrscheinlich brauche ich einen JavaScript König, der auf Mac zuhause ist. Nur kenne ich leider keinen.

        Schau doch mal nach, ob es in den Weiten des Webs ein Javascript-Beispiel speziell für Webkit gibt, das einen Keks setzt.

        Lo!

        1. Hi!

          Das ist das Problem - alle Werte sind absolut korrekt. Also auch Safari und Chrome geben bei den Alerts die korrekten Daten wieder. Nur das "Schreiben" des Cookies (setzen/löschen) macht der Browser nicht. Auslesen wie gesagt schon.

          Also auch der Datumswert für die Expiration des Kekses?

          Si senior

          Öh, sorry, das sind 1000 Millisekunden mal 60 Sek. mal ....

          Stimmt, hast Recht. Ich wollte ja nur mal sehen, ob du aufpasst ...

          =;-))

          Das Verflixte an diesem Problem ist ja, dass ich irgendwie keinen Grund für das Nichtfunktionieren in den Webkit Browsern finden kann. Wahrscheinlich brauche ich einen JavaScript König, der auf Mac zuhause ist. Nur kenne ich leider keinen.

          Schau doch mal nach, ob es in den Weiten des Webs ein Javascript-Beispiel speziell für Webkit gibt, das einen Keks setzt.

          Na ja, ein spezielles konnte ich nicht finden und es funktioniert ja auch wenn ich den Code zum Zählen der verbleibenden Zeichen wieder entferne. Aber einen Grund, warum der eine Code den anderen stört kann ich nicht finden. Auch alle anderen Browser finden ja keinen!  =;-(

          Lo!

          Sigi, der Gefrustete

  3. Ich hab jetzt einen anderen Ansatz beim Anzeigen der noch verfügbaren Zeichen gewählt (siehe Code). Selbes Ergebnis: webkitbasierende Browser verweigern das setCookie.

    <!doctype html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <title></title>
    <script type="text/javascript">
    function saveCookie (cTitle, cValue, cExpiration) {
      var now = new Date();
      var endTime = new Date(now.getTime() + cExpiration);
      document.cookie = cTitle+"="+escape(cValue)+"; expires="+endTime.toGMTString()+";";
    }
    function readCookie (cTitle) {
      var dcookie = document.cookie;
      var cname = cTitle+"=";
      var clen = dcookie.length;
      var cbegin = 0;
      while (cbegin < clen) {
        var vbegin = cbegin + cname.length;
    if (dcookie.substring(cbegin, vbegin) == cname) {
      var vend = dcookie.indexOf(";", vbegin);
      if (vend == -1) vend = clen;
      return unescape(dcookie.substring(vbegin, vend));
    }
        cbegin = dcookie.indexOf(" ", cbegin) + 1;
        if (cbegin == 0) break;
      }
      return null;
    }
    function killCookie (cTitle) {
      document.cookie = cTitle+"="+"; expires=Thu, 01-Jan-70 00:00:01 GMT;";
    }
    function CheckLen() {
      var maxlaenge = 4000;
      var feldinhalt = document.memo.cValue.value;
      var rest = maxlaenge -feldinhalt.length;
      if(rest<=0) {
        document.memo.numb.value = 0;
        document.memo.cValue.value = feldinhalt.substring(0,maxlaenge);
      }
    document.memo.numb.value = rest;
    }
    </script>
    </head>
    <body>
    <h2>Memo</h2>
    <form name="memo">
    <p><label for="cTitle">Title:</label><br />
    <input type="text" id="cTitle" name="cTitle" size="37" value="Cookie01" /></p>
    <p><label for="cValue">Content:</label><br />
    <textarea id="cValue" name="cValue" cols="50" rows="10" onChange="CheckLen()" onFocus="CheckLen()" onKeyDown="CheckLen()" onKeyUp="CheckLen()">Memos will be saved in your browser as cookies - with a lifetime of 12 month!</textarea></p>
    <p><input type="button" onClick="cValue.value=(readCookie(document.forms[0].elements[0].value))" value="read memo" />
    <input type="button" onclick="saveCookie(document.forms[0].elements[0].value, document.forms[0].elements[1].value, 1000*60*60*24*365)" value="save memo" />
    <input type="button" onClick="killCookie(document.forms[0].elements[0].value)" value="delete memo" /> Characters left: <input type="text" name="numb" size="4" maxlength="4" value="4000" readonly /></p>
    </form>
    </body>
    </html>

    Wäre echt dankbar, wenn das irgend jemand peilt!!!

    Schönen Gruß
    Sigi