Newsgroup: it.comp.lang.javascript
Titolo: Disabilitare pulsante back per far eseguire percorso ciclico

Avrei bisogno arrivato su una certa pagina di impedire il back dal 
browser (per far eseguire una serie di operazioni cicliche (seguendo 
quindi link e non utilizzano avanti dietro del browser.
E' possibile farlo magari in maniera compatibile con tutti i browser ?
Grazie
MB


Sembra che location.replace() faccia al caso tuo! e in pratica non inserisce il link nell'history...
es.:
<a href="#" onClick="location.replace("mypage.htm");
return false">Link</a>
Ovviamente la cosa funzionerebbe meglio server-side e qualche variabile di sessione, comunque...

 Ovviamente la cosa funzionerebbe meglio server-side e qualche variabile di sessione, comunque...
Ti ringrazio ma come potrei usarlo ?
Mi spiego
Ho una pagina che visualizza dei risultati . Se questi risultati sono 
corretti per l'utente , l'utente procede al salvataggio (preme un 
pulsante submit che richiama una pagina salvataggio.php che procede al 
salvataggio su MYSQL) e quando ha salvato reindirizza in automatico 
l'utente con location in una nuova pagina dove vede i risultati dei dati 
salvati.
A questo punto io vorrei che in questa pagina l'utente non potesse piu' 
premere back per richiamare la pagina che ha salvato i dati , ma che 
prosegua seguendo i link nella pagina stessa per inserire un nuovo utente.
Come posso applicare cio' che mi dici tu ?
Grazie Nuovamente
Michele B.

 Come posso applicare cio' che mi dici tu ?
Vorrei capire bene di cosa si tratti....
e vorrei sapere di che mole di dati stiamo parlando; infatti un modo che mi viene in mente sarebbe quello di usare la funzione che
ti ho detto creando una bella querystring (quindi invio di dati in GET)

 ti ho detto creando una bella querystring (quindi invio di dati in GET)
In sostanza funziona cosi'
Ho pagina :
distribuisci_ore.php
dove l'utente vede se gli sta bene le ore come sono state distribuite in 
base a una form compilata in precedenza (in realta' dietro ci sono 
diverse pagine a mo' di wizard che aiutano nella compilazione e si 
trascinano dietro un po' di variabili di sessione)
Se l'utente preme salva allora richiamo la pagina con submit/post
salvataggio.php
dove fatte alcune verififiche (se sono settate le variabili 
corrispondenti al tasto salva etc ..  eseguo diverse query per il 
salvataggio  nel database, e dato che i periodi sono spesso anche lunghi 
e le ore spesso tante ci impiega anche un po' di tempo (qualche secondo 
ma credo che qui non si possa limare e a dir il vero per il momento non 
ho avuto problemi in questo.)
Finito il salvataggio metto un
header ("Location: personale.php");
nella stessa pagina (salvataggio.php)
che mi manda alla pagina personale.php
dove propongo un report di tutti i dati inseriti e metto il link per 
inserire altri utenti
Se si seguono tali link si ritorna all'inizio del wizard (nella prima 
pagina dove elimino tutti i dati di sessione precedenti con 
sesison_unset mi sembra .. ) e comincio l'impostazione dei nuovi dati di 
sessione.
Ho notato pero' che spesso gli utenti non seguono questa mia 
impostazione ciclica ma quando sono sulla pagina di riepilogo finale 
premono back e ripercorrono il wizard all'indietro e cio' mi da problemi 
con le variabili di sessione , laddove non causi ulteriori salvataggi 
(richiamando la pagina precedente salvataggio.php) da qui la mia idea di 
disabilitare il back fornendo un percorso forzato che mi pulisca le 
sessione come previsto.
Questo e' quanto .
Secondo te/voi come si puo' fare ?
Ti ingrazio per l'interessamento.
Ciao
MB


Ok, mi sembra di aver capito il problema....
<premessa>
devi assolutamente risolvere la cosa server-side, magari aggiungendo qualche variabile di sessione in piu' e fare qualche controllo
su queste e sulle altre...insomma dovresti rivedere la cosa e consentire la revisione usando i tasti back e next...
</premessa>
comunque il problema si puo' risolvere come ti dicevo...
inserisci ne tuo form qualcosa tipo:
<form ... action=".." onSubmit="go(this);return false">
dove go() e' una funzione tipo:
function go(myform)
{
    var str=myform.action;
    for(var i=0,j=0,max=myform.elements.length;i<max;++i)
        if(myform.elements[i].name && (((myform.elements[i].type=='checkbox' || myform.elements[i].type=='radio') &&
myform.elements[i].checked) || (myform.elements[i].type!='checkbox' && myform.elements[i].type!='radio'))){
            str+=(j++)?"&":"?";
            str+=myform.elements[i].name+"="+escape(myform.elements[i].value);
        }
    location.replace(str);
}
Questa rappresenterebbe una funzione del tutto generica che andrebbe messa in tutti i form, ricordando di mettere sempre
onSubmit="go(this);return false". Così in pratica non viene messo niente nell'history.
mi sembra che funzioni, pero'...

 </premessa>
Ribadisco...
Comunque ho perfezionato la funzione di prima.
Ora funziona come se fosse un form in GET vero e proprio, ho risolto il
problema col le select e dei bottoni!
Poi, non so se era strettamente necessario, comunque per sicurezza ho
aggiunto dei toLowerCase() per individuare il tipo ad es.:
myform.elements[i].type.toLowerCase()!='button'
L'unica cosa che manca e' se fosse presente una select con selezione
multipla, in questo caso personalizzatelo tu, per altro io non sarei
capace...
function go(pulsante)
{
    var myform=pulsante.form,str=myform.action;
    for(var i=0,j=0,max=myform.elements.length;i<max;++i)
        if(myform.elements[i].name &&
myform.elements[i].type.toLowerCase()!='button' &&
myform.elements[i].type.toLowerCase()!='submit')
            if(((myform.elements[i].type.toLowerCase()=='checkbox' ||
myform.elements[i].type.toLowerCase()=='radio') &&
myform.elements[i].checked) ||
(myform.elements[i].type.toLowerCase()!='checkbox' &&
myform.elements[i].type.toLowerCase()!='radio')){
                str+=(j++)?"&":"?";
str+=myform.elements[i].name+"="+escape(myform.elements[i].value);
if(myform.elements[i].type.toLowerCase().indexOf('select')>=0 &&
!myform.elements[i].value)
str+=escape(myform.elements[i].options[myform.elements[i].options.selectedIn
dex].text);
            }
    if(
pulsante.name
){
        str+=(j++)?"&":"?";
        str+=
pulsante.name
+'='+pulsante.value;
    }
    location.replace(str);
}
e il <form> ora deve essere:
<form method="GET" action="form_nohistory.htm" onSubmit="return false">
in modo che funzioni anche se JS e' disattivato!
e la funzione va messa nel pulsante di invio:
<input type="submit" name="S1" value="Next" onClick="go(this)">
(funzionerebbe pure se fosse un "button" pero' no se JS disat...)