【问题标题】:Hashchange events with the Back Button in the Backbone Router/History主干路由器/历史记录中带有后退按钮的 Hashchange 事件
【发布时间】:2012-01-29 01:10:10
【问题描述】:

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


Ubuntu 11.04 上的 Chromium 14.0.835.202 使用 Backbone 0.5.3

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

, routes: {

                  '': 'handlerRoot'

                , 'second': 'handlerSecond'
}

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


  1. 如果我访问“根”(家庭),则调用“handlerRoot”。 好的,这正是我所期待的。
  2. 如果我转到“秒”(#second),则会调用“handlerSecond”。好的, 这是我所期待的。
  3. 如果我在“root”中,接下来我会转到“second”,一旦我在 单击后退按钮,由于按下后退按钮两次 正在调用回调:首先称为“handlerSecond”,然后 下一个'handlerRoot'。事实上,我只是期待 'handlerRoot' 被调用,导致我在推送时作为用户的意图 后退按钮用于返回上一页。
  4. 如果我正在执行以下路径:'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' 行为。

我的问题是:

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

提前致谢!

【问题讨论】:

  • 感谢 Andreas,现在文字看起来更清晰了 :)
  • 在 Chrome 中使用主干 0.5.3,以下代码按预期工作:code var MainRouter = Backbone.Router.extend({ , routes: { '': 'handlerRoot' , 'second' :'handlerSecond'},handlerRoot:函数(动作){警报('handlerRoot');},第二个:函数(动作){警报('第二')}}); code我认为您的代码还有其他问题...也许您的问题出在您在视图中而不是在路由器中执行的操作?
  • 我同意@Robert。当我第一次阅读这篇文章时,它开始听起来像僵尸视图。您能否发布更多代码,也许是您在 handlerRoot 和 handlerSecond 中所做的事情?
  • @Robert,正如 Atinux 所指出的,这确实是 Chromium 的一个问题。我在 Ubuntu 11.04 上的 Firefox 8.0 中进行测试,它按预期工作(仅调用一个回调)。

标签: events backbone.js back-button hashchange


【解决方案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

【讨论】:

  • 所以,问题不仅在于您正在测试的 Chromium 15.0.874.106,还在于 14.0.835.202 版本(我的版本)。
  • 好的,我明白了,Chromium 在 console.log 上只有一个带有后退按钮的错误,但是您的路由只执行一次,就像其他 Web 浏览器一样。看看我的 jsFiddle,我实现了它。如您所见,每个路由触发器都会创建
    并添加到列表中,在 Chromium 上测试 jsfiddle,您会看到即使控制台上存在错误,示例上也没有问题。
猜你喜欢
  • 2013-01-14
  • 2021-10-27
  • 2018-10-02
  • 2015-05-18
  • 2015-10-13
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多