使用Backbone路由器/历史记录中的后退按钮进行Hashchange事件

时间:2011-12-28 09:14:48

标签: events backbone.js back-button hashchange

我正在使用以下系统配置:


使用Backbone 0.5.3在Ubuntu 11.04上使用Chromium 14.0.835.202

定义了以下路由和回调的骨干路由器:

, routes: {

                  '': 'handlerRoot'

                , 'second': 'handlerSecond'
}

在这个系统中,我有以下行为:


  1. 如果我访问'root'(主页),则会调用'handlerRoot'。 好的,这是我所期待的。
  2. 如果我转到'秒'(#second),则会调用'handlerSecond'。好, 这是我所期待的。
  3. 如果我在“root”中,接下来我会去'第二',而在那里我就是 单击后退按钮,因为按下后退按钮两个 正在调用回调:首先称为'handlerSecond',和 下一个'handlerRoot'。事实上,我只是期待这一点 'handlerRoot'被调用,当我推动时,我的意图是作为用户 后退按钮将返回上一页。
  4. 如果我正在执行以下路径:'root' - > '第二' - > 'root' - > '秒',一旦进入'秒'(最后一个),我点击后退 按钮,由于这种推动被称为以下 回调:第一个'handlerSecond',下一个'handlerRoot',下一个 'handlerSecond',最后是'handlerRoot'。就像调用与前一个历史记录中的URL路径相关的所有回调一样(以相反的顺序)。再一次,我的期望行为只被称为'handlerRoot'(出于同样的原因,我从'第二'回到root,我对所有的历史都不感兴趣。)

  5. 我正在观看历史的Backbone.js代码,我看到它正在使用'onhashchange'事件(对于兼容的浏览器)。因此,我在浏览器控制台中手动设置以下内容:


    function locationHashChanged() {
                      console.log(window.location.toString()) 
    };
    window.onhashchange = locationHashChanged;
    

    我用这种配置做了相同的实验(1),(2),(3)和(4)。实际上,以前历史记录中的所有URL路径都以相反的顺序打印。例如在(3)中,当我按下后退按钮时,首先打印“秒”的URL,然后打印“root”的URL。因此,Backbone的行为确实是'onhashchange'行为。

    我的问题是:

    这种行为的原因是什么(为什么它有用)?例如,如果我的回调只是切换视图,在示例(4)中,我正在切换视图四次,当我真的需要仅切换视图一次时(更改视图在'秒'中显示视图以“root”呈现。有没有办法解决这个问题?

    提前致谢!

1 个答案:

答案 0 :(得分:1)

编辑: 在多次搜索之后,Chromium在控制台上只有一个带有后退按钮的错误,该路由与其他浏览器一样只触发一次。


我创建了一个jsFiddle来尝试你的问题而我没有看到问题。

我在Linux 10.04上使用Chrome,Firefox和Opera进行了测试,没有任何问题......但Chromium(15.0.874.106)有后退按钮的错误。所以我认为Chromium没有正确解释Backbone JS中的历史对象。

我回答了GitHub存储库中的一个问题,在此处重新打开它:https://github.com/documentcloud/backbone/issues/646#issuecomment-3291944