2015-02-19 10 views
8

Ho un Formulario di ricerca ajax come:HTML5: Aggiorna pagina quando popstate viene licenziato

url:/ricerca/

entra

=> User una ricerca termine e clic su un pulsante

= > la ricerca è fatta e mostra i risultati via ajax in un div sulla pagina

Ma: voglio anche che l'utente sia in grado di copiare & incollare l'URL agli amici e navigare attraverso le ricerche precedenti. Così, quando si attiva la ricerca, a cambiare l'URL nel browser AddressBar da

/ricerca/

a

/ricerca/q = yourkeyword

utilizzando:?

window.history.pushState("", "Search for "+keyword, "/search/?q="+keyword); 

Cambia l'URL nella barra degli indirizzi del browser in/search /? Q = yourkeywords e funziona correttamente.

Ora, premendo il pulsante Indietro, la barra degli indirizzi del browser si sta visualizzando di nuovo/search /, che va bene. Ma il contenuto della pagina non viene ricaricato, mostra comunque i risultati di/search /? Q = yourkeyword.

così ho aggiunto:

window.addEventListener("popstate", function(e) 
{ location.reload(); 
}); 

È questo il modo corretto? Funziona perfettamente con i browser desktop come FF e Chrome, ma per esempio in iOS, l'evento popstate viene attivato al primo caricamento di searchform su/search /, con conseguente caricamento ininterrotto di quella pagina.

Qual è il modo giusto per farlo?

risposta

1

Il mio suggerimento:

window.location.href = window.location.href; 

non l'ho provato, ma penso che farà quello che vuoi.

+0

Grazie per la risposta. Penso che location.reload() e la tua soluzione siano gli stessi. Ma il problema è che iOS lancia l'evento popstate anche quando si carica una pagina, quindi basta sfogliare/search/(senza fare pushState prima) per attivare l'evento popstate. – Werner

+0

Immagino che dovrai testare diversi scenari. Immagino che la prossima cosa che farei sia creare una variabile che viene impostata dopo il caricamento della pagina. E solo ricaricare se la variabile è impostata. –

4

La soluzione più semplice è impostare una variabile globale quando si utilizza pushState. Quindi, nel tuo gestore onpopstate, controlla solo se è impostato. Es .:

window.historyInitiated = true; 
window.history.pushState("", "Search for "+keyword, "/search/?q="+keyword); 
... 
window.addEventListener("popstate", function(e) { 
    if (window.historyInitiated) { 
    window.location.reload(); 
    } 
}); 
+0

Penso che questa dovrebbe essere la risposta accettata. Funziona perfettamente per il nostro (stesso) caso d'uso. – NickGreen

Problemi correlati