Backbone.js :solution de contournement pour implémenter une URL basée sur une barre oblique à l'aide de pushstate dans Internet Explorer
-
12-11-2019 - |
Question
J'ai complètement gâché les choses en ce moment.J'ai mis à jour vers Backbone.js 0.9.1, mis à jour vers des URL basées sur des barres obliques et commencé à utiliser pushstate:true
.5 jours plus tard, je teste mon application sur IE9 et les URL ne collent tout simplement pas à la page vers laquelle elles renvoient.
J'ai fait quelque chose comme ceci :
main.html
<a href="/signup">Do Signup</a>
Le navigateur va à mydomain.com/signup
pendant une seconde, puis revient au main.html avec l'URL mydomain.com/#signup
.
Revenir à pushstate:true
résout le problème des liens simples mais décompose les éléments pour lesquels j'ai défini le routeur pour avoir des itinéraires comme...
SignupRouter = Backbone.Router.extend({
routes: {
'signup': 'signup',
'signup/:key': 'confirm'
}, initialize: function() {
// do some stuff here
}, signup: function() {
// signup view
}, confirm: function() {
// confirm view
}
});
Si je n'utilise pas pushstate, je dois revenir à la stratégie consistant à créer une route distincte pour chaque page et à charger le routeur en fonction d'une variable côté serveur (très primitive je sais) :
SignupRouter = Backbone.Router.extend({
initialize: function() {
// signup view
}
});
ConfirmSignupRouter = Backbone.Router.extend({
initialize: function() {
// confirm view
}
});
Existe-t-il un moyen convivial pour IE de procéder (IE7 ~ 9) ?Une solution de contournement côté serveur ?Rien?
La solution
Si la désactivation de pushState le fait fonctionner dans les navigateurs qui ne le prennent pas en charge, essayez d'utiliser le test PushState du backbone pour le désactiver de manière préventive (ce code est basé sur la variable _hasPushState dans la source Backbone) :
// Enable pushState for compatible browsers
var enablePushState = true;
// Disable for older browsers
var pushState = !!(enablePushState && window.history && window.history.pushState);
Backbone.history.start({ pushState: pushState });