Domanda

Quando un modulo Web viene inviato e porta l'utente in un'altra pagina, è abbastanza frequente che l'utente faccia clic sul pulsante Indietro per inviare nuovamente il modulo (il modulo è una ricerca avanzata nel mio caso.)

Come posso conservare in modo affidabile le opzioni del modulo selezionate dall'utente quando fanno clic su Indietro (quindi non devono ricominciare da capo compilando nuovamente il modulo se stanno cambiando solo uno dei tanti elementi del modulo?)

Devo seguire la strada della memorizzazione delle opzioni del modulo nei dati di sessione (cookie o lato server) o c'è un modo per convincere il browser a gestirlo per me?

(L'ambiente è PHP / JavaScript - e il sito deve funzionare su IE6 + e Firefox2 +)

È stato utile?

Soluzione

Lo metterei nella sessione.
Sarà il più affidabile e anche se non vanno dritti "indietro", avranno comunque le loro opzioni di ricerca. Inserirlo nel cookie funzionerebbe anche, ma non sarebbe raccomandato a meno che non sia una forma molto piccola.

Altri suggerimenti

Credo che tu sia in balia del browser. Quando rispondi, il browser non invia una nuova richiesta al server per il contenuto, utilizza la cache (in quasi tutti i browser che ho visto comunque). Quindi è uscito tutto sul lato server.

Mi chiedo se potresti fare qualcosa di molto complicato come memorizzare il risultato della ricerca in un cookie durante l'evento onunload della pagina dei risultati, quindi leggere il cookie in javascript nella pagina di ricerca e compilare il modulo - ma questo è solo una speculazione, non so se funzionerebbe.

Dipende dal browser, ma nella maggior parte dei casi non devi fare nulla.

IE, Firefox, ecc. ricorderanno felicemente il contenuto del modulo nella pagina precedente e lo mostreranno di nuovo quando si fa clic su Indietro ... purché non si faccia nulla per impedirne il funzionamento, come fare la pagina non memorizza nella cache o crea il modulo interamente dallo script.

(L'inserimento di elementi nella sessione potrebbe confondere i browser con due schede aperte sullo stesso modulo. Fai molta attenzione quando fai qualcosa del genere.)

Il problema che hai è che il browser restituirà una versione della pagina memorizzata nella cache e probabilmente non lo chiederà di nuovo al server, il che significa che l'utilizzo della sessione sarebbe irrilevante.

È possibile tuttavia utilizzare AJAX per caricare i dettagli del modulo precedentemente inviato sull'evento di caricamento della pagina.

Dovresti sostanzialmente memorizzarlo sul tuo server in qualche modo (probabilmente nelle variabili di sessione, come suggerito) dopo il POST. Devi anche configurare Javascript nella pagina del modulo per eseguire in caricamento per emettere una chiamata AJAX per ottenere i dati dal tuo server (ad esempio, nel formato JSON) e precompilare i campi del modulo con i dati.

Esempio di codice jQuery:

$( document ).ready( function() {
  $.getJSON(
    "/getformdata.php",
    function( data ) {
      $.each( data.items, function(i,item) {
        $( '#' + item.eid ).val( item.val );
      } );
    });
} );

Il tuo /getformdata.php potrebbe restituire dati come:

{
  'items': [
    {
      'eid': 'formfield1',
      'val': 'John',
    },
    {
      'eid': 'formfield2',
      'val': 'Doe',
    }
  ]
}

e ovviamente restituirebbe un array vuoto se non fosse stato ancora salvato nulla per la sessione. Il codice sopra è approssimativo e non testato, ma questo dovrebbe darti l'idea di base.

Come nota a margine: le versioni attuali di Opera e Firefox manterranno il contenuto del campo modulo quando tornano indietro. Il tuo codice JS lo sovrascriverà, ma dovrebbe essere sicuro.

Un'altra opzione ajaxy (quindi non va bene per gli utenti senza javascript) è quella di inviare il modulo tramite javascript e quindi andare alla pagina di conferma (o mostrare il messaggio sul modulo sostituendo il pulsante con un messaggio). In questo modo non è possibile & rsquo; indietro " possibile.

Perché non memorizzare i valori in un cookie prima di inviarlo? È inoltre possibile includere un timestamp o un token per indicare quando è stato compilato. Quindi, quando la pagina viene caricata, puoi determinare se devi compilare i campi con i dati del cookie o lasciarli vuoti perché si tratta di una nuova ricerca.

Puoi anche fare tutto ciò che è locale tramite JavaScript. Quindi memorizzi un cookie con il valore di ricerca e, a pageload, controlli se il cookie esiste. Qualcosa del genere:

$('#formSubmitButton').click( function() {
    var value = $('#searchbox').val();
    var days = 1;
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
    document.cookie = "searchbox="+value+expires+"; path=/";
});

$(document).ready( function() {
    var nameEQ = "searchbox=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) var valueC = c.substring(nameEQ.length,c.length);
   }
   $('#searchbox').val(valueC);
});

Non l'ho provato ma dovrebbe funzionare. Per questo avrai bisogno di jQuery.

Le funzioni dei cookie provengono da: http://www.quirksmode.org/js/cookies. html

Dovrei dire tra l'altro che sia FireFox che IE hanno questo comportamento di default.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top