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:
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: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; })()); }
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]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 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…![]()

Rispondi quotando
), e allora pace (
). Incrociamo le dita 
Giro il nuovo codice aggiornato per il test su IE. 