2013-01-22 4 views
5

Ho una pagina che ha il contenuto pubblicato. Quando rinfresco detto pagina in Safari utilizzando uno Cmd + R o utilizzando il pulsante di aggiornamento del browser, un pop-up si presenta come di seguito: enter image description herePagina Ricarica comportamenti in Safari

Questo comportamento è anche lo stesso attraverso altri browser (Chrome, FF, ecc) .

Ma quando provo ad aggiornare la stessa pagina utilizzando JavaScript utilizzando uno window.location.href = location.href o location.reload() o window.location.reload() o addirittura window.location.reload (true) in Safari, non mostra il pop-up sopra menzionato. Ma questo comportamento è diverso in Chrome, FF ecc dove appare lo stesso pop-up.

Modifica: La conseguenza che il pop-up non viene visualizzato è che i contenuti pubblicati non vengono risentiti e quindi il comportamento cambia.

Quindi la mia domanda ora è Come ricarico la pagina su tutti i browser in modo che i contenuti del modulo pubblicato vengano nuovamente inviati.

+0

sicuro che sarete in grado di cambiare il comportamento del browser, ma hai considerato utilizzando GET invece di POST, se possibile? – sachleen

+0

Ho, il fatto è che sto postando un contenuto JSON. Sembrerà brutto durante l'utilizzo di GET. –

risposta

1

Attraverso AJAX

Per quanto ne so non c'è modo per forzare Safari di inviare nuovamente i dati POST durante un aggiornamento. L'unico modo per "risolvere" questo problema è separare la logica dal documento in cui viene visualizzato il risultato. Ciò che intendo in pratica è che potresti attivare la logica che desideri dal codice usando una richiesta AJAX, mentre il documento stesso sarà una pagina (relativamente) muta.

Quindi, quello che si otterrebbe è:

POST document.ext

#In whatever server side language you're using, the reason this can't be done 
# purely in javascript is that POST data is only available to the server. 
print "<script>" 
print "POSTdata = " + JSONEscape(POSTdata) + ";" 
print "var doAction = function(){" 
print " ajax('action.ext', POSTdata, function(result){});" 
print "});" 
print "</script>" 
print "<button onclick='doAction()'>Refresh</button>" 

POST action.ext

# all the logic you previously had in document.xxx 

Il risultato di questo è:

  • In tutti i browser, un aggiornamento avviato dall'utente invierà i dati POST e la logica verrà reinnescata.
  • Il pulsante di aggiornamento riavvierà sempre la logica direttamente senza ricaricare l'intera pagina.

Self-presentando forma

E 'appena mi ha colpito che un altro - più facile da implementare - modo per raggiungere questo obiettivo è quello di creare semplicemente una funzione <form action='?' method='POST'> e grilletto codice è submit. Avresti comunque bisogno di print il POSTdata, ma invece di attivare una chiamata Ajax, devi semplicemente attivare un reindirizzamento alla stessa pagina attraverso lo <form> nascosto. Il vantaggio di questo è che non richiede alcuna ristrutturazione, anche se personalmente penso che il metodo AJAX sembrerebbe più ordinato. Un rapido Google-fu ha mostrato these answers in dettaglio il processo.

+0

Sta iniziando a sembrare un aggiornamento basato su JS di una richiesta di pagina 'POST' non è fattibile. Problemi di compatibilità cross-browser Pesky! – andrewb

0

Se si desidera veramente aggiornare la pagina senza conferma, è necessario utilizzare il reindirizzamento.Quindi pubblichi i dati sulla pagina A e salvi le informazioni sul post in sessione o cookie, quindi reindirizza la pagina B al rendering.

Oppure puoi fare tutto per la tua logica aziendale sulla pagina A, e usare la pagina B come una semplice pagina di ringraziamento.

Quindi, è possibile aggiornare senza conferma a pagina B.

Non
+0

La domanda non riguardava la mancata conferma, si trattava di ottenere lo stesso completo comportamento di un aggiornamento basato su JS in Safari come con altri browser. Avere un'altra lettura attraverso la domanda. – andrewb