2012-11-06 10 views
6

Meine Website hat nur Pushstates in Backbone.js implementiert und die gesamte Website bricht für IE. Wie sollte ich einen Fallback für IE erstellen?Backbone.js PushStates: Fallback für Internet Explorer funktioniert nicht

Was ich versuche

Haupt URL zu erreichen: http://mydomain.com/explore

Eine andere URL: 'http://mydomain.com/explore/1234

Die Hauptseite der Website ist http://mydomain.com/explore, die die Router-Funktion explore auslöst.

Wenn ein Benutzer besucht http://mydomain.com/explore/1234, Routers Backbone wird die Funktion viewListing, auslösen, die die gleiche wie Funktion ist explore, sondern auch Details für Artikel-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: '/' 
    }) 
} 

Problem: Wie Sie im obigen Code sehen können, habe ich versucht, pushstates mit pushState: false zu deaktivieren, wenn es sich um ein nicht kompatiblen Browser ist.

Doch damit IE auf das zugreifen kann, was normalerweise für einen normalen Browser funktioniert (http://mydomain.com/explore), muss IE zu http://mydomain.com/explore/#explore gehen, was Dinge verwirrend macht! Weitere Informationen zu http://mydomain.com/explore/1234 IE muss http://mydomain.com/explore/#explore/1234 gehen

Wie soll das behoben werden?

Antwort

2

Wenn Sie nicht wollen http://mydomain.com/explore/#explore URL, dann müssen Sie umleiten zu http://mydomain.com/#explore so Backbone wird stattdessen damit beginnen.

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

UPD: Sie werden wahrscheinlich den führenden Schrägstrich zu entfernen, wenn Pfad als window.location.pathname.substr(1)

UPD2 Hash-Einstellung: Wenn Sie /explore/ wollen die Wurzel für Ihre Backbone-Strecken werden Sie es dann ausschließen haben von Routen und in History.start({root: "/explore/"})

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

Dank als Wurzel gesetzt, habe ich versucht, diese und leitet es (wie erwartet) von 'http: // mydomain.com/explore' zu' http://mydomain.com/#/erforschen ". "Http: // mydomain.com" ist jedoch die Begrüßungsseite und nicht die App-Seite ("http: // mydomain.com/explore") – Nyxynyx

+0

Dann müssen Sie '/ explore /' wahrscheinlich aus Ihren Backbone-Routen entfernen , setze es als Root in 'Backbone.history.start ({root: '/ explore /'})'. –

Verwandte Themen