2013-03-13 3 views
21

Sto usando questo tipo di linea in una risposta JSpulsante Indietro del browser non funziona correttamente dopo aver utilizzato pushState (in Chrome)

if (history && history.pushState){ 
    history.pushState(null, null, '<%=j home_path %>'); 
} 

ma quando clicco back nel browser, vedo il codice JS di la risposta invece della pagina precedente.

C'è un modo per far funzionare il pulsante indietro per cui sarebbe nuovamente richiesta la pagina dell'ultimo url (prima home_path come pushStated in

Aggiornamento:?

ho trovato this .. sembra che altri hanno lo stesso problema con .. History.js non si risolve neanche

Quindi, per confermare alcuni dei commenti lì .. Questo accade solo in cromo

Cosa penso

Penso che la radice di tutto questo è che il popstate richiede lo stesso tipo di docuemtn pushstate (risposta js). Ciò che deve essere fatto è su richiesta popstate la risposta html .. io non so come

Altri aggiornamenti:

vedendo http://railscasts.com/episodes/246-ajax-history-state si parla di utilizzare

$(window).bind("popstate", function() { 
     $.getScript(location.href); 
    }); 

questo risolve il problema ma secondo understanding jQuery $.getScript() con tout caching ajax aggiungerà timestamp .. che inquina l'url .. disattivandolo non funziona di nuovo con lo stesso effetto ..

Qualcuno sa come risolvere questo?

Ancora più Aggiornamenti

ho rintracciato i sentieri della questione in tutto l'interweb e si è conclusa con un issue in chrome che punta a un problema di rotaie (Firefox funziona bene comunque) e un issue in rails-ujs riguardanti non compresi Vary intestazione in le risposte

esempio può essere trovato here

+1

Vuoi fornire il codice sorgente completo e di uscita? Il blocco di codice che hai fornito è corretto. Ho bisogno di più informazioni per aiutare a risolvere il tuo problema. –

+1

In quale stringa viene eseguito ''<% = j home_path%>''? – Simon

+0

risulta in '/ home' –

risposta

10

Attualmente sto giocando intorno con fare

response.headers['Vary'] = 'Accept' 

che sembra risolvere il problema, al primo sguardo.

Se qualcuno ha lo stesso problema, si prega di controllare e fatemi sapere

+2

Grazie, questa intestazione ha risolto il mio problema anche. Era un problema insolito, in cui non ho riscontrato questo problema, ma il mio cliente svedese lo ha fatto. In apache, questa intestazione può essere impostata in questo modo. Spero che questo sia utile a qualcuno che sta avendo lo stesso problema. In .htaccess scrivi il seguente codice ' Header append Vary: Accept ' –

+2

Mi hai salvato la vita. – clime

+0

Che cosa significa? – Meliborn

0

ho provato questo codice sul mio browser utilizzando un file HTML locale e ho ottenuto un errore di sicurezza della console:

SecurityError: The operation is insecure. 
    history.pushState(null, null, '<%=j home_path %>'); 

Posso vedere come manipolare la cronologia del browser può essere considerato un comportamento potenzialmente pericoloso, quindi suppongo che dovresti controllare che questo non stia accadendo anche per te. Prova a utilizzare la console JavaScript di Firebug. È anche possibile che ci possano essere differenze di comportamento tra i file HTML locali e http: //.

Detto questo, per quello che ho visto l'ultimo elemento dell'array history è fondamentalmente la pagina corrente, quindi se si desidera modificare quello precedente, è possibile farlo utilizzando due comandi pushState() - prima tu spingere l'elemento precedente che desideri, quindi spingere di nuovo il percorso corrente. Se ho capito bene il tuo problema.

+0

nota che' <% = j home_path%> 'è in erb quindi dopo la preelaborazione sarà uguale a un percorso valido. forse dovrei fare un percorso completo –

+0

Non so, l'ho provato localmente e funzionerebbe solo se avessi usato un file: // percorso. Tutto al di fuori del dominio locale non funzionerebbe. Penso che controllare che non ci siano errori di sicurezza è la prima cosa, puoi usare un'istruzione 'try ... catch '. – Okarin

+0

Quale versione FF stai usando @Okarin? Il codice fornito funziona perfettamente per me in FF19. – Simon

6

è necessario aggiungere un listener per l'evento popstate

window.onpopstate = function(event) { 
    //load the page 
}; 

Quando il pulsante viene premuto di nuovo l'URL è cambiato e quindi l'evento popstate è sparato. È tua responsabilità caricare i dettagli nel listener popstate corrispondenti all'URL modificato.

A nice popstate example

Alcuni browser sparare un evento popstate quando la pagina viene caricata, causando un ciclo infinito di caricamento della pagina. Ciò può essere evitato con l'aggiunta del seguente controllo

var loadPage = window.history.state; 
window.onpopstate = function(event) { 
    if (loadPage) 
     //load the page 
}; 

quindi impostare il loadPage su true quando si chiama pushState

history.pushState(null, null, '<%=j home_path %>'); 
loadPage = true; 

questa tecnica funziona in tutti i browser che supportano HTML5 storia api.

+0

questo non funziona .. poiché lo script che carica la pagina causa loop infinito poiché ogni volta che carichi la pagina si chiama nuovamente popstate –

+0

@NickGinanto Ho modificato la mia risposta per evitare il tuo infinito problema di loop –

0

E 'successo la mia con Sinatra & cromato.

risolto con:

$.ajaxSetup({ cache: false }); 
+0

L'ho provato, ma aggiunge l'orribile timestamp all'url –

+0

Strano, anche se in console posso vedere l'ajax xhr che chiede l'urest timestamp, non viene mostrato nella barra degli indirizzi del browser. Puoi provare a togliere il timbro dal nome dell'URL che stai salvando sul pushstate – Trompa

+0

Grazie! Ho provato molte soluzioni là fuori ma questa era l'unica che funzionava per me. 100 punti per te –