2012-11-06 14 views
6

Il mio sito ha appena implementato i pushstates in Backbone.js e le interruzioni dell'intero sito per IE. Come dovrei creare un fallback per IE?Backbone.js PushStates: Fallback per Internet Explorer non funziona

Quello che sto cercando di realizzare

URL principale: http://mydomain.com/explore

un altro URL: 'http://mydomain.com/explore/1234

La pagina principale del sito è http://mydomain.com/explore che attiva la funzione di router explore.

Quando un utente visita http://mydomain.com/explore/1234, router di dorsale si innescherà la funzione viewListing, che è la stessa come la funzione explore, ma comprende anche dettagli per oggetto id 1234.

Backbone.js Router

// Router 
var AppRouter = Backbone.Router.extend({ 
    routes: { 
     'explore': 'explore', 
     'explore/:id': 'viewListing', 
    }, 

    explore: function() { 
     this.listingList = new ListingCollection(); 
     // More code here 
    }, 

    viewListing: function(listing_id) { 
     this.featuredListingId = listing_id; // Sent along with fetch() in this.explore() 
     this.explore(); 
    } 
}); 

App = new AppRouter(); 

// Enable pushState for compatible browsers 
var enablePushState = true; 

// Disable for older browsers (IE8, IE9 etc) 
var pushState = !!(enablePushState && window.history && window.history.pushState); 

if(pushState) { 
    Backbone.history.start({ 
     pushState: true, 
     root: '/' 
    }) 
} else { 
    Backbone.history.start({ 
     pushState: false, 
     root: '/' 
    }) 
} 

Problema: Come si può vedere nel codice di cui sopra, ho provato a disabilitare pushstates con pushState: false se si tratta di un browser compatibile.

Tuttavia per IE accedere a ciò che normalmente funzionerebbe per un normale browser (http://mydomain.com/explore), IE dovrà andare a http://mydomain.com/explore/#explore che sta rendendo le cose confuse! Ulteriore più per accedere a http://mydomain.com/explore/1234 IE deve andare a http://mydomain.com/explore/#explore/1234

Come dovrebbe essere risolto?

risposta

2

Se non si desidera l'url http://mydomain.com/explore/#explore, è necessario reindirizzare a http://mydomain.com/#explore in modo che Backbone inizi con esso.

if(!pushState && window.location.pathname != "/") { 
    window.location.replace("/#" + window.location.pathname) 
} 

UPD: probabilmente dovrete rimuovere la barra principale quando si imposta il percorso come un hash window.location.pathname.substr(1)

UPD2: se si vuole /explore/ essere la radice per i vostri percorsi backbone allora devi escluderlo da percorsi e impostare come una radice in History.start({root: "/explore/"})

routes: { 
    '': 'explore', 
    ':id': 'viewListing', 
} 
+0

Grazie, ho provato questo e reindirizza (come previsto) da 'http: // mydomain.com/explore' a' http://mydomain.com/#/explore'. Tuttavia 'http: // mydomain.com' è la pagina di benvenuto/splash e non la pagina dell'app (' http: // mydomain.com/explore') – Nyxynyx

+0

Quindi probabilmente devi rimuovere '/ explore /' dalle tue rotte Backbone , impostalo come root in 'Backbone.history.start ({root: '/ explore /'})'. –

Problemi correlati