events - 主干路由器/历史记录中带有后退按钮的 Hashchange 事件

标签 events backbone.js back-button hashchange

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

Ubuntu 11.04 上的 Chromium 14.0.835.202 使用 Backbone 0.5.3

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

, routes: {

                  '': 'handlerRoot'

                , 'second': 'handlerSecond'
}

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

  • 如果我访问“根”(家),则会调用“handlerRoot”。
    好的,这正是我所期待的。
  • 如果我转到“第二”(#second),则会调用“handlerSecond”。好的,
    这是我所期待的。
  • 如果我在'root',然后我去'second',一旦我在那里
    单击后退按钮,由于按下后退按钮两次
    正在调用回调:首先称为“handlerSecond”,然后
    下一个'handlerRoot'。事实上,我只是期待
    'handlerRoot' 被调用,导致我在推送时作为用户的意图
    后退按钮是返回上一页。
  • 如果我正在执行以下路径:'root' -> 'second' -> 'root' ->
    '第二',然后在'第二'(最后一个)中,我单击“后退”
    按钮,由于这种插入,被称为以下
    回调:第一个“handlerSecond”,下一个“handlerRoot”,下一个
    “handlerSecond”,最后是“handlerRoot”。就像之前历史中与 URL 路径关联的所有回调都被调用(以相反的顺序)。同样,我的期望只是被称为“handlerRoot”(出于同样的原因,我将从“第二”回到根,我对所有历史都不感兴趣)。


  • 我正在观看 History 的 Backbone.js 代码,我看到它正在使用“onhashchange”事件(对于兼容的浏览器)。因此,我在浏览器控制台中手动设置了以下内容:
    function locationHashChanged() {
                      console.log(window.location.toString()) 
    };
    window.onhashchange = locationHashChanged;
    

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

    我的问题是:

    哪一个是这种行为的原因(它有什么用)?原因例如,如果我的回调只是切换 View ,在示例 (4) 中,我切换 View 四次,而我真的只需要切换一次 View (更改在“秒”中呈现的 View 在“根”中呈现的 View )。有没有办法得到这种行为?

    提前致谢!

    最佳答案

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

    我创建了一个 jsFiddle 来尝试您的问题,但我没有看到问题。

  • 您可以在这里测试路线:http://jsfiddle.net/Atinux/V36ZU/show/
  • 并在此处查看代码:http://jsfiddle.net/Atinux/V36ZU/

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

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

    关于events - 主干路由器/历史记录中带有后退按钮的 Hashchange 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8653922/

    相关文章:

    javascript - 我是否在backbone.js 路由中实例化了太多对象?

    c# - uwp 标题栏中的后退按钮不可见

    javascript - 尝试更改父级的 jQuery 单击处理程序会触发新的单击事件

    css - Angular 单元测试-使用Enter键触发ngSubmit失败

    javascript - 将 String 对象转换为 Json 对象

    Javascript:历史记录未加载页面

    javascript - 浏览器后退按钮asp.net

    events - Prototype.js event.target.id 子元素

    JavaScript 闭包和变量作用域

    Backbone.js 在渲染中关闭 div 换行