Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Gestione degli eventi

Controllo totale sulle scelte dell'utente
Controllo totale sulle scelte dell'utente
Link copiato negli appunti

Ripristiniamo l'accettazione di dati dal dominio html.it, impostando l'archiviazione come indicato nella figura, cioè a 0 kB.

10 KB di spazio in scrittura

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...

Ti consigliamo anche