Events 使用主干路由器/历史记录中的“后退”按钮更改Hashchange事件

Events 使用主干路由器/历史记录中的“后退”按钮更改Hashchange事件,events,backbone.js,back-button,hashchange,Events,Backbone.js,Back Button,Hashchange,我正在使用以下系统配置: Chromium 14.0.835.202在Ubuntu 11.04上使用主干网0.5.3 定义了以下路由和回调的主干路由器: , routes: { '': 'handlerRoot' , 'second': 'handlerSecond' } 在这个系统中,我有以下行为: 如果访问“根”(home),则调用“handlerRoot”。 好吧,这正是我所期待的 如果我转到“second”(

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


Chromium 14.0.835.202在Ubuntu 11.04上使用主干网0.5.3

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

, routes: {

                  '': 'handlerRoot'

                , 'second': 'handlerSecond'
}

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


  • 如果访问“根”(home),则调用“handlerRoot”。 好吧,这正是我所期待的
  • 如果我转到“second”(#second),则称为“handlerSecond”。好啊 这正是我所期待的
  • 如果我在“根”中,下一步我转到“第二”,一旦到了,我就到了 按下后退按钮两次后,单击后退按钮 调用回调:第一个称为“handlerSecond”,而 下一个“handlerRoot”。事实上,在这里,我只希望 调用'handlerRoot',因为我在推 “后退”按钮用于返回上一页
  • 如果我正在执行以下路径:'root'->'second'->'root'-> “第二次”和“第二次”(最后一次)中的一次,我在点击背面 按钮,作为按下的结果称为 回调:第一个“handlerSecond”,下一个“handlerRoot”,下一个 “handlerSecond”,最后是“handlerRoot”。它类似于调用以前历史记录中与URL路径关联的所有回调(按相反顺序)。同样,我的expectaction只是被称为“handlerRoot”(出于同样的原因,我从“第二个”回到根,我对所有的历史都不感兴趣)

  • 我正在查看Backbone.js代码的历史记录,我看到它正在使用“onhashchange”事件(适用于兼容浏览器)。因此,我在浏览器控制台中手动设置以下内容:



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

    我的问题是:

    哪一个是这种行为的原因(因为它有什么用处)?原因例如,如果我的回调只切换视图,在示例(4)中,我切换视图四次,而实际上我只需要切换一次视图(通过在“root”中显示的视图更改“second”中显示的视图)。有什么方法可以让你有这种行为吗

    提前谢谢

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


    我创建了一个JSFIDLE来尝试您的问题,但我看不出问题所在

    • 您可以在此处测试路由:

    • 请参见此处的代码:

    我在Linux 10.04上用Chrome、Firefox和Opera对此进行了测试,没有任何问题……但是Chrome(15.0.874.106)的后退按钮有缺陷。所以我认为Chromium没有正确解释主干JS中的历史对象


    我回答了GitHub存储库中的一个问题,在这里重新打开它:

    谢谢Andreas,现在文本看起来更清晰了:)使用Chrome的主干0.5.3,以下代码按预期工作:
    code
    var MainRouter=backbone.Router.extend({,routes:{'':'handlerRoot','second':'handlerSecond'},handlerRoot:函数(操作){alert('handlerRoot');},second:函数(操作){alert('second')}
    code
    我想你的代码还有其他问题……也许你的问题在于你在视图中所做的事情,而不是在路由器中?我同意@Robert。当我第一次读到这篇文章时,它开始听起来像僵尸视图。你能发布更多的代码,也许是你在handlerRoot和handlerSecon中所做的事情吗d?@Robert,正如Atinux所指出的,Chromium确实存在问题。我在Ubuntu11.04上用Firefox 8.0进行了测试,它按预期工作(只调用一次回调)。因此,问题不仅在于您测试的Chromium 15.0.874.106,还在于14.0.835.202版本(我的版本).好的,我明白了,Chromium在console.log上有一个bug,使用back按钮,但是您的路由只执行一次,就像其他web浏览器一样。看看我的JSFIDLE,我实现了它。正如您所看到的,每个路由触发器都会创建并添加到列表中,在Chromium上测试JSFIDLE,即使控制台上的bug存在,您也会看到nt,这个例子没有问题。
    function locationHashChanged() {
                      console.log(window.location.toString()) 
    };
    window.onhashchange = locationHashChanged;