Backbone.history在IE 9中没有更新。后退按钮坏了

时间:2014-03-21 14:47:35

标签: backbone.js url-routing marionette

在我们的应用程序中,我们实际上有两个Backbone SPA应用程序。第一个用于未经身份验证的用户的登录,注册和其他功能。此URL的URL类似于http://www.example.com/registration#signin。登录后,您将被重定向到http://www.example.com/ui#home的主要Backbone应用程序。

在我的主UI应用程序中,我使用Backbone.history 而不使用 pushState。 App文件类似于:

define(function (require) {    
    var App = new Marionette.Application();

    App.addInitializer(function (options) {
        ...
    });

    ...

    App.on('initialize:after', function () {
        $(function(){
            if (Backbone.history) {
                Backbone.history.start({ root: '/ui' });
            }
        });
        $.log("**WebApp**: Marionette app started.");
    });

    return App;
});

当然,除IE 9外,任何浏览器都可以正常运行(也许10个,我需要检查)。在IE 9中,所有路由工作正常。单击http://www.example.com/ui#anotherpage等链接可以正常工作。 ,当用户点击浏览器中的“后退”按钮时,它们不会被发送回上次触发的路线。相反,它们被发送到http://www.example.com/registration#signin,这是我们的Web服务器Node服务的最后一页。当我点击链接时,我可以看到history.length和Backbone.history.history.length没有更新。

所有路线都是从链接/网址中触发的。我在代码中没有使用router.navigate()。以下是我们路由器的示例:

define(function (require) {
    var Backbone = require('backbone'),
        Marionette = require('marionette');

    return Backbone.Marionette.AppRouter.extend({
        appRoutes: {
            "": "showHome",
            "home": "showHome",
            "foo": "showFoo"
        }
    });
});

和控制器:

define(function (require) {
    var Backbone = require('backbone'),
        Marionette = require('marionette');

    return Backbone.Marionette.Controller.extend({
        showHome: function () {
            require(['webapp','modules/home'], function (WebApp) {
                WebApp.module("Home").start();
                WebApp.module("Home").controller.showModule();
            });
        },
        showFoo: function () {
            require(['webapp', 'modules/foo'], function (WebApp) {
                WebApp.module("Foo").start();
                WebApp.module("Foo").controller.showModule();
            });
        }
    });
});

更新

进一步的研究表明,问题在于旧版本的IE不会记录其历史记录中的哈希变化。见 - Change location.hash and then press Back button - IE behaves differently from other browsers。但是,我仍然不确定解决方法是什么。我猜它会以某种方式涉及用jQuery Hashchange这样的插件手动处理哈希变更事件并做某事吗?手动设置IE的历史记录?或者,当我们在IE中检测到后退按钮时,制作自定义历史对象并使用它?

1 个答案:

答案 0 :(得分:0)

我在IE的一个应用程序中遇到了同样的问题。 如下所示启动骨干历史。

Backbone.history.start({
            pushState: true,
            hashChange: false
        });

更新:正如T Nguyen所说, 当您将pushState设置为true时,哈希URL不再触发路由。除非您为所有Backbone路由添加服务器端支持,否则您需要在客户端添加一个事件处理程序,它捕获适当的链接并在路由上调用.navigate()