Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 20
  1. #1
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.702

    Wie speicher und lade ich Strings in Cookies?

    Da das Thema immer wieder hier auftaucht will ich hier mal an exponierter Stelle meine Cookie-Verwaltung darstellen:
    Code:
    var cookie = {
    	// return value if the name is not stored in document.cookie
    	defaultReturnValue: null,
    	// this should be true if you want to be sure, that all your special characters (like ä, ö, ü, ², µ, €, \n, \t, ...) are treated in a safe way - but with this option enabled the string stored in the cookie can get much longer
    	secureEncoding: true,
    	
    	update: function(){
    		var cString = document.cookie.toString();
    		var werte = cString.split(";");
    		for (var i = 0; i < werte.length; i++){
    			var wert = werte[i].split("=");
    			var name = this.decode(wert[0].replace(/^\s+/, ""));
    			var value = this.decode(wert.slice(1).join("="));
    			this[name] = value;
    		}
    		return this;
    	},
    	
    	getValue: function(name){
    		this.update();
    		if (typeof(this[name]) == "string") return this[name];
    		return this.defaultReturnValue;
    	},
    	
    	setValue: function(name, value, att){
    		//att can contain this attributes: expire, domain, path, secure
    		if (!att) att = {};
    		var insert = this.encode(name) + "=" + this.encode(value);
    		if (att.expire && att.expire.constructor == Date){
    			insert += ";expires=" + att.expire.toGMTString();
    		}
    		if (typeof(att.expire) == "string" && att.expire){
    			insert += ";expires=" + att.expire;
    		}
    		if (typeof(att.domain) == "string" && att.domain){
    			insert += ";domain=" + att.domain;
    		}
    		if (typeof(att.path) == "string" && att.path){
    			insert += ";path=" + att.path;
    		}
    		if (att.secure){
    			insert += ";secure";
    		}
    		document.cookie = insert + ";";
    		return this;
    	},
    	
    	deleteValue: function(wert, att){
    		if (!att) att = {};
    		att.expire = new Date(0);
    		this.setValue(wert, "", att);
    		if (typeof this[wert] == "string") this[wert] = false;
    		return this;
    	},
    	encode: function encode(str){
    		if (this.secureEncoding) return str.replace(/([^a-z0-9])/ig, function(m, f){return "+" + f.charCodeAt(0).toString(36) + "/"});
    		return str.replace(/(%|=|;)/g, function(match, f){return "%" + {"%": "%%", "=": "%_", ";": "%."}[f];});
    	},
    	decode: function decode(str){
    		if (this.secureEncoding) return str.replace(/\+([a-z0-9]+?)\//g, function(m, f){return String.fromCharCode(parseInt(f, 36));})
    		return str.replace(/%(%|_|.)/g, function(match, f){return {"%": "%", "_": "=", ".": ";"}[f];});
    	}
    };
    Die Anwendung ist recht einfach:
    Code:
    var name = "³²{};=,&%+/";
    var value = ";=;()~ÄÜä\\}]/()";
    cookie.setValue(name, value);
    var newValue = cookie.getValue(name);
    alert(value + " -> " + newValue + ":" + (newValue == value));
    cookie.deleteValue(name);
    alert(cookie.getValue(name));
    - versucht das mal mit den üblichen Cookie-Skripts!

    PS: Kommentare, Verbesserungen, Fragen dazu gerne gesehen.
    Geändert von kkapsner (26-02-2010 um 15:06 Uhr) Grund: Dormilich hat ja Recht

  2. #2
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.297

    AW: Wie speicher und lade ich Strings in Cookies?

    kleine Verbesserung da att = null einen Fehler verursachen sollte.
    Code:
    	deleteValue: function(wert, att){
    		if (!(att instanceof Object)) att = {};
    		att.expire = new Date(0);
    		this.setValue(wert, "", att);
    		if (typeof this[wert] == "string") this[wert] = false;
    	},

  3. #3
    Avatar von jspit
    jspit ist offline Lounge-Member
    registriert
    19-06-2009
    Beiträge
    1.711

    AW: Wie speicher und lade ich Strings in Cookies?

    Ein schönes Beispiel, wo so alles drin ist was man so für Cookies braucht. Habe selbst noch nicht allzu viel Cookies benutzt. Hab erstmal ein wenig den Code studieren müssen um zu wissen wie ein Ablaufdatum gesetzt wird: als Object!
    PHP-Code:
    cookie.setValue(namevalue, {expire: new Date("2010/2/27 8:26")}); 
    ok ?
    Dazu eine Frage:
    Warum wird das att so ausgiebig getestet. Sollte nicht der Nutzer des Codes wissen was er will?

    Zitat Zitat von Dormilich Beitrag anzeigen
    kleine Verbesserung da att = null einen Fehler verursachen sollte.
    Wer ruft denn eine function mit den att==null auf ???
    Wenn ich att weglasse, ist der Wert intern undefined und einen Fehler gibt es auch nicht.

  4. #4
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.297

    AW: Wie speicher und lade ich Strings in Cookies?

    Zitat Zitat von jspit Beitrag anzeigen
    Wer ruft denn eine function mit den att==null auf ???
    Wenn ich att weglasse, ist der Wert intern undefined und einen Fehler gibt es auch nicht.
    das problem war der Test, da typeof null == "object"

  5. #5
    Avatar von jspit
    jspit ist offline Lounge-Member
    registriert
    19-06-2009
    Beiträge
    1.711

    AW: Wie speicher und lade ich Strings in Cookies?

    Zitat Zitat von Dormilich Beitrag anzeigen
    das problem war der Test, da typeof null == "object"
    Was soll denn bitte null sein und wann ?

  6. #6
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.297

    AW: Wie speicher und lade ich Strings in Cookies?

    ich hab grad gesehen, daß dieser Test auch in setValue() geändert werden muß.
    PHP-Code:
        setValue: function (namevalueatt)
        {
            
    //att can contain this attributes: expire, domain, path, secure
            
    if (!(att instanceof Object)) {
                
    att = {};
            }
            var 
    insert this.encode(name) + "=" this.encode(value);
            if (
    att.expire instanceof Date) {
                
    insert += ";expires=" att.expire.toGMTString();
            } 

  7. #7
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.297

    AW: Wie speicher und lade ich Strings in Cookies?

    Zitat Zitat von jspit Beitrag anzeigen
    Was soll denn bitte null sein und wann ?
    woher soll ich das wissen, es ist eine öffentliche Methode und daher nicht auszuschließen (irgendeinen DAU gibt es immer). Andernfalls sollte der Test gleich weggelassen werden.

  8. #8
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.297

    AW: Wie speicher und lade ich Strings in Cookies?

    es wäre sicher auch sinnvoll, am Ende von setValue() this.update() aufzurufen, damit die neuen Daten auch über Cookie.name abrufbar sind

  9. #9
    Avatar von jspit
    jspit ist offline Lounge-Member
    registriert
    19-06-2009
    Beiträge
    1.711

    AW: Wie speicher und lade ich Strings in Cookies?

    Zitat Zitat von Dormilich Beitrag anzeigen
    woher soll ich das wissen, es ist eine öffentliche Methode und daher nicht auszuschließen (irgendeinen DAU gibt es immer). Andernfalls sollte der Test gleich weggelassen werden.
    Wenn du schon einen DAU an solche Methoden lassen möchtest, dann ist instanceof Object auch nicht das Allheilmittel, denn:
    (function() {}) instanceof Object == true


  10. #10
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Wie speicher und lade ich Strings in Cookies?

    Naja, das macht aber nichts, da eine Funktion durchaus auch ein Object sein kann. Du brauchst in der Funktion halt einfach ein Objekt, geal was für eins.

  11. #11
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.297

    AW: Wie speicher und lade ich Strings in Cookies?

    Zitat Zitat von jspit Beitrag anzeigen
    Wenn du schon einen DAU an solche Methoden lassen möchtest, dann ist instanceof Object auch nicht das Allheilmittel, denn:
    (function() {}) instanceof Object == true
    ja und? das verursacht jedenfalls keinen Fehler, wenn ich versuche: if (att.expire). eine Funktion ist ja schließlich, im Gegesatz zu null, ein Objekt.

  12. #12
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.702

    AW: Wie speicher und lade ich Strings in Cookies?

    Das ist doch wirklich Mist, dass null den Typ Object hat...
    Hab's oben geändert - ein bisschen einfacher als Dormilich vorgeschlagen.
    Das mit dem update ist Geschmackssache, aber wenn man auf der sicheren Seite sein will sollte man ja sowieso über getValue() gehen - dann hat man nämlich auch sicherlich den defaultWert, wenn das Cookie nicht existiert.

    Edit: Normalerweise mach' ich das ja mit einer internen Funktion is.object die dann die !is['undefined'], die dann is['null'] aufruft.
    Geändert von kkapsner (26-02-2010 um 15:09 Uhr)

  13. #13
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.297

    AW: Wie speicher und lade ich Strings in Cookies?

    Zitat Zitat von kkapsner Beitrag anzeigen
    Das ist doch wirklich Mist, dass null den Typ Object hat...
    keine Ahnung, warum das noch keiner geändert hat, der Bug ist ja eigentlich schon recht lange bekannt …

  14. #14
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.702

    AW: Wie speicher und lade ich Strings in Cookies?

    Am besten gefällt mir in diesem Zusammenhang:
    Code:
    var f = null;
    alert(f);
    alert(f.toString());
    Aber man muss sich hald für seine Überprüfungen seine eigenen Routinen schreiben, die dem Problem aus dem Weg gehen.

  15. #15
    Avatar von jspit
    jspit ist offline Lounge-Member
    registriert
    19-06-2009
    Beiträge
    1.711

    AW: Wie speicher und lade ich Strings in Cookies?

    So müsste es auch gehen:
    PHP-Code:
       :
     var 
    insert this.encode(name) + "=" this.encode(value);
     if (
    att
       {   
       if (
    att.expire && att.expire.constructor == Date){
          : 
    Anstatt ein leeres Object zu setzen den ganzen Zweig garnicht erst ausführen.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Problem mit cookies
    Von bjacob im Forum JavaScript
    Antworten: 1
    Letzter Beitrag: 24-03-2009, 09:37
  2. cookies aktiviert? prüfen mit php
    Von iam_peter im Forum Serverseitige Programmierung
    Antworten: 1
    Letzter Beitrag: 04-09-2007, 23:23
  3. Cookies unter JS => Führender Punkt in Domain
    Von Tachyon im Forum Allgemeines
    Antworten: 0
    Letzter Beitrag: 12-06-2007, 13:37
  4. Cookies bei Voting
    Von slosd im Forum Serverseitige Programmierung
    Antworten: 6
    Letzter Beitrag: 26-03-2007, 20:09
  5. Cookies online anders?
    Von sanchez im Forum Serverseitige Programmierung
    Antworten: 12
    Letzter Beitrag: 23-09-2002, 17:54

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •