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…