Ciao a tutt*,
chi ha seguito questa discussione avrà notato che avevo provato a scrivere un codice di compatibilità dell'oggetto localStorage attraverso l'uso dei cookies. Il codice (leggermente corretto) l'ho postato qua: https://developer.mozilla.org/en/dom...e#localStorage

e lo ritrascrivo sul forum:

codice:
if (!window.localStorage) {
	Object.defineProperty(window, "localStorage", new (function () {
		function encode(sEncTxt) {
			return String(sEncTxt).replace(/[;\r\n= %]/g, function(sEncChr) { return "%" + ";\r\n= %".indexOf(sEncChr); });
		}
		function decode(sDecTxt) {
			return sDecTxt.replace(/%[0-5]/g, function(sDecChrs) { return ";\r\n= %".charAt(parseFloat(sDecChrs.slice(1))); });
		}
		var aKeys = [], oStorage = {};
		Object.defineProperty(oStorage, "getItem", {
			value: function (sKey) { return this[sKey]; },
			writable: false,
			configurable: false,
			enumerable: false
		});
		Object.defineProperty(oStorage, "key", {
			value: function (nKeyId) { return aKeys[nKeyId]; },
			writable: false,
			configurable: false,
			enumerable: false
		});
		Object.defineProperty(oStorage, "setItem", {
			value: function (sKey, sValue) {
				if(!sKey) { return; }
				document.cookie = encode(sKey) + "=" + encode(sValue) + "; path=/";
			},
			writable: false,
			configurable: false,
			enumerable: false
		});
		Object.defineProperty(oStorage, "length", {
			get: function () { return aKeys.length; },
			configurable: false,
			enumerable: false
		});
		Object.defineProperty(oStorage, "removeItem", {
			value: function (sKey) {
				if(!sKey) { return; }
				var sExpDate = new Date();
				sExpDate.setDate(sExpDate.getDate() - 1);
				document.cookie = encode(sKey) + "=; expires=" + sExpDate.toGMTString() + "; path=/";
			},
			writable: false,
			configurable: false,
			enumerable: false
		});
		this.get = function () {
			var iThisIndx;
			for (var sKey in oStorage) {
				iThisIndx = aKeys.indexOf(sKey);
				if (iThisIndx === -1) { oStorage.setItem(sKey, oStorage[sKey]); }
				else { aKeys.splice(iThisIndx, 1); }
				delete oStorage[sKey];
			}
			for (var iDelId = 0; iDelId < aKeys.length; iDelId++) {
				oStorage.removeItem(aKeys[iDelId]);
				aKeys.splice(iDelId, 1);
			}
			for (var iCouple, iKey, iCouplId = 0, aCouples = document.cookie.split(/;\s*/); iCouplId < aCouples.length; iCouplId++) {
				iCouple = aCouples[iCouplId].split("=");
				if (iCouple.length > 1) {
					oStorage[iKey = decode(iCouple[0])] = decode(iCouple[1]);
					aKeys.push(iKey);
				}
			}
			return oStorage;
		};
		this.configurable = false;
		this.enumerable = true;
	})());
}
Adesso mi sorgono due dubbi. Il primo riguarda i cookies. Non ho mai dovuto farci cose particolarmente complesse e mi chiedevo se qualcuno di voi sa quali caratteri devo filtrare. Ovviamente i caratteri ; e = servono alla dichiarazione del cookie, quindi andranno filtrati. Ma ho anche notato che i caratteri \n e \r non vengono ricopiati nel cookie, quindi andranno filtrati anche quelli. Vi giro le due funzioni che servono una a codificare la stringa da salvare come cookie e l'altra a decodificare il contenuto del cookie letto:

codice:
		function encode(sEncTxt) {
			return String(sEncTxt).replace(/[;\r\n= %]/g, function(sEncChr) { return "%" + ";\r\n= %".indexOf(sEncChr); });
		}
		function decode(sDecTxt) {
			return sDecTxt.replace(/%[0-5]/g, function(sDecChrs) { return ";\r\n= %".charAt(parseFloat(sDecChrs.slice(1))); });
		}
La mia prima domanda è: qualcun@ sa se devo codificare altri caratteri oltre ai seguenti: ";\r\n= %"??? [Il simbolo di percentuale la devo codificare perché mi serve da metacaratere]

La seconda domanda è: è possibile che non funzioni con IE per quello che sta scritto qua: https://developer.mozilla.org/en/Jav..._specific_case?? Io non ho la possibilità di provarlo con IE 8, c'è qualcun@ che abbia voglia di postare almeno il messaggio di errore? È un peccato che non debba funzionare anche su quel browser per due o tre booleani settati male&hellip;