Ripristiniamo l'accettazione di dati dal dominio html.it, impostando l'archiviazione come indicato nella figura, cioè a 0 kB.
Per farlo, usiamo il seguente il filmato:
Attualmente la dimensione massima di Shared Objects salvabili in locale dal dominio html.it è di 0 KB. Se cercheremo di scrivere più di 0 KB, si aprirà automaticamente il pannello con la scelta relativa alla concessione o alla negazione di spazio aggiuntivo.
In questo caso, la variabile risposta vista nei codici precedenti, non restituisce ne true
, ne false
, ne undefined
, bensì la stringa "pending".
Solo questa informazione non ci aiuta più di tanto, perchè sia che l'utente accetti, sia che non accetti, il valore di "risposta" rimane "pending". In questo modo, non possiamo valutare la scelta dell'utente per decidere cosa fare.
Risolviamo il problema utilizzando un evento dell'oggetto Shared Object, SharedObject.onStatus
Associamo all'evento una funzione da eseguire a seconda della scelta dell'utente, basandoci sui due tipi di messaggio di risposta che vengono generati.
La funzione può essere impostata così:
mioCookie.onStatus = function(errore){
// valutazione della scelta
};
All'oggetto "errore", verranno associate due variabili, code e level. Otterremo:
errore.code = "SharedObject.Flush.Failed";
errore.level = "error";
nel caso venga data risposta negativa, ed:
errore.code = "SharedObject.Flush.Success";
errore.level = "status";
nel caso venga data risposta positiva.
La Macromedia sembra preferire il code, per la valutazione della risposta, quindi consideriamo questa variabile nel nostro script. Una versione possibile questa:
on(release){
mioCookie = SharedObject.getLocal(""sharedCookie4", "/guide/");
mioCookie.onStatus = function(errore){
if(errore.code == "SharedObject.Flush.Failed"){
display.text = "spazio non sufficiente";
} else {
display.text = "spazio concesso";
}
}
if(mioCookie.data.nome != undefined){
display.text = mioCookie.data.nome;
} else {
mioCookie.data.nome = "cookie trovato!";
var risposta = mioCookie.flush()
if(risposta == false){
display.text = "non è possibile scrivere";
} else if(risposta == true){
display.text = "il cookie è stato salvato";
} else if(risposta == undefined){
display.text = "il percorso è errato";
}
}
}
Bisogna però considerare che la funzione viene richiamata, come citato in documentazione, "ad ogni messaggio di errore, avvertimento, o nota informativa". Per questo motivo definiremo la funzione solo nel caso in cui "risposta" sia "pending", per renderla indefinita subito dopo la risposta:
on(release){
mioCookie = SharedObject.getLocal("sharedCookie4","/guide/");
if(mioCookie.data.nome != undefined){
display.text = mioCookie.data.nome;
} else {
mioCookie.data.nome = "cookie trovato!";
var risposta = mioCookie.flush()
if(risposta == false){
display.text = "non è possibile scrivere";
} else if(risposta == true){
display.text = "il cookie è stato salvato";
} else if(risposta == undefined){
display.text = "il percorso è errato";
} else if(risposta == "pending"){
mioCookie.onStatus = function(errore){
if(errore.code == "SharedObject.Flush.Failed"){
display.text = "spazio non sufficiente";
} else {
display.text = "spazio concesso";
}
this = undefined
}
}
}
}
Vediamo il significato del codice, riga per riga:
// alla pressione del tasto sinistro del mouse sul pulsante
on(release){
// assegniamo alla variabile mioCookie un riferimento allo
// Shared Object "sharedCookie4", nel percorso "/guide/"
mioCookie = SharedObject.getLocal("sharedCookie4","/guide/");
// se la variabile mioCookie.data.nome è definita
if(mioCookie.data.nome != undefined){
// ne scriviamo il valore nel campo di testo display
display.text = mioCookie.data.nome;
// altrimenti
} else {
// assegniamo alla variabile "nome" la stringa tra virgolette
mioCookie.data.nome = "cookie trovato!";
// creiamo la variabile "risposta", che conterrà la risposta
// alla chiamata del metodo flush()
var risposta = mioCookie.flush()
// se "risposta" è falsa (negazione permanente dello spazio)
if(risposta == false){
// scriviamo il messaggio...
display.text = "non è possibile scrivere";
// se "risposta" è vera (il cookie è stato salvato)
}else if(risposta == true){
// scriviamo il messaggio...
display.text = "il cookie è stato salvato";
// se "risposta" è undefined (percorso non valido nel getLocal)
}else if(risposta == undefined){
// scriviamo il messaggio...
display.text = "il percorso è errato";
// altrimenti se "risposta" è uguale a "pending" ( si è aperto
// il pannello delle impostazioni per la richiesta di spazio
}else if(risposta == "pending"){
// definiamo la funzione legata all'evento on status
// passando "errore" come parametro
mioCookie.onStatus = function(errore){
// se errore.code è uguale a... (l'utente ha
// negato lo spazio aggiuntivo
if(errore.code == "SharedObject.Flush.Failed"){
// scriviamo il messaggio...
display.text = "spazio non sufficiente";
// altrimenti (l'utente ha concesso lo spazio
}else{
// scriviamo il messaggio...
display.text = "spazio concesso";
}
// rendiamo indefinita la funzione legata all'evento
this = undefined
}
}
}
}
Possiamo provare i vari risultati con questo filmato, il cui fla, leggermente
modificato, può essere scaricato da qui: scarica l'esempio
Naturalmente tutto questo script può essere omesso. La visualizzazione
delle risposte non è necessaria, e nemmeno l'utilizzo di diverse
opzioni. In alcuni casi, può essere sufficiente usare il getLocal
e il flush
, e nulla più.
In altri, a discrezione di chi crea il filmato, si potranno usare script
più complessi, che prevedano scelte più mirate, come ad
esempio l'apertura del pannello delle impostazioni tramite il System.showSettings(1)
nel caso in cui l'archiviazione sia stata negata in modo permanente...