2011-03-06 10 views
24

Sto lavorando a un sito che serve contenuti tramite AJAX.Posso impedire a history.popstate di attivarsi al caricamento iniziale della pagina?

Se si fa clic su una voce nel menu, un div di contenuto viene aggiornato con la risposta $.get, niente di particolare.

Sto implementando history.pushState per consentire la navigazione con il pulsante Indietro/Avanti del browser.

ho il seguente per caricare contenuti su navigazione storia:

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

Il problema è che quando una pagina viene caricata per la prima volta, questa funzione non $.getScript in modo che la pagina viene caricata subito di nuovo. La prima volta che viene caricata la pagina viene visualizzata la vista HTML iniziale, quindi nel secondo caricamento viene visualizzata la vista JS, poiché è una richiesta JS.

Come posso evitare che questo evento venga attivato nelle pagine con richieste HTML?

+0

Nota: history.popstate viene chiamato una volta - subito al primo caricamento della pagina: e questo è di progettazione. (controllato in Chrome) –

risposta

37

Utilizzando l'API native HTML5 Storia si sta andando a correre in alcuni problemi, tutti i browser HTML5 gestisce l'API un po 'diverso in modo da non si può semplicemente il codice una volta e si aspettano di lavorare senza soluzioni di attuazione . History.js fornisce un'API cross-browser per l'API della cronologia HTML5 e una riserva facoltativa hashchange per i browser HTML4 se si desidera percorrere tale percorso.

Per aggiornare il proprio sito web in un RIA/Ajax-Application è possibile utilizzare questo frammento di codice: https://github.com/browserstate/ajaxify

che fa parte di questo articolo più Intelligent State Handling che va in spiegazioni circa hashbang, hash e l'API di storia HTML5.

Fammi sapere se hai bisogno di ulteriore aiuto :) Saluti.

+1

Grazie per aver menzionato History.js. Stavo per implementare pushState nel nostro framework e probabilmente avrei finito per strapparmi i capelli. – andrew

+4

Pubblicità spudorata del proprio plugin ... tsk tsk ... sto scherzando. History.js mi ha salvato la vita (e un sacco di ore di lavoro) su molti progetti ora! – Martin

+1

Anche hasherjs funziona correttamente. Funziona perfettamente bene nel nostro attuale sistema di produzione. –

4

All'avvio del browser, viene sempre generato un evento popstate. Quindi è necessario determinare se questo popstate è tuo o no.

Quando si esegue il pushState, assicurarsi di disporre di un oggetto di stato. In questo modo puoi controllarlo più tardi.

Poi, il gestore popstate, controllare l'oggetto Stato :)

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

// then add the state object 
history.pushState({isMine:true},title,url); 

Fatemi sapere se avete bisogno di più aiuto :)

8

Quando l'evento popstate è sparato al caricamento della pagina non lo farà avere una proprietà di stato nell'oggetto evento. Questo ti permette di controllare se l'evento è stato attivato per un caricamento della pagina o meno.

window.onpopstate = function (event) { 
    if (event.state) { 
    // do your thing 
    } else { 
    // triggered by a page load 
    } 
} 
+0

corretto: e si può usare: 'if (!! event.state)' senza 'else' –

23

è necessario per ottenere l'event.originalEvent

// Somewhere in your previous code 
if (history && history.pushState) { 
    history.pushState({module:"leave"}, document.title, this.href); 
} 


$(window).bind("popstate", function(evt) { 
    var state = evt.originalEvent.state; 
    if (state && state.module === "leave") { 
    $.getScript(location.href); 
    } 
}); 
+0

Questo funziona incredibilmente! Grazie :) – James

+0

Non testare l'esistenza di 'history.pushState' implica l'esistenza di' history'? Qualcuno può dire perché il test per 'history.pushState' non sarebbe sufficiente (use case)? –

+0

@OliverSchafeld appena vedendo questo. Se provi a fare riferimento a una proprietà di 'history', ma' history' non è un oggetto, genererà un errore. Quindi devi verificare che 'history' esista (ed è un oggetto, se non sei sicuro) prima di provare a usare (o verificare) le sue proprietà. –

0

Io lo uso per cambiare Bar Indirizzo e salvare stato attuale, compreso il corpo HTML corrente, e ricarico sulla schiena Bouton clic, senza alcuna altra chiamata AJAX.Tutto viene salvato nel tuo browser:

  1. $(document).ajaxComplete(function(ev, jqXHR, settings) { 
    
        var stateObj = { url: settings.url, innerhtml: document.body.innerHTML }; 
        window.history.pushState(stateObj, settings.url, settings.url); 
    }); 
    
    
    window.onpopstate = function (event) { 
        var currentState = history.state; 
        document.body.innerHTML = currentState.innerhtml; 
    }; 
    
Problemi correlati