【问题标题】:Is there any Backbone-friendly way to detect back button presses?是否有任何 Backbone 友好的方法来检测后退按钮按下?
【发布时间】:2013-06-24 19:20:33
【问题描述】:

Stack Overflow 有几个与检测后退按钮按下相关的问题,其中最相关的一个是用于执行此操作的库列表:

https://stackoverflow.com/questions/116446/what-is-the-best-back-button-jquery-plugin

问题是,当我尝试使用该线程(和其他地方)中的库时,它们都是:

  • 没有工作(不再工作;他们一定工作过一次)
  • 不支持 IE8
  • 破坏了 Backbone 的路由器

问题似乎是 Backbone 的路由器监视 hashchange 事件,这些其他库也是如此,它们这样做的方式会影响 Backbone 的路由器(例如,使后退按钮完全停止工作)。

所以,我的问题是,有没有人知道一种检测后退按钮按下的方法,该方法适用于 IE8+,并且(这是关键部分)不会破坏主干路由器?

或者如果做不到这一点,任何人都可以解释或指出如何在 Backbone.Router 支持的网站上实现自己的后退按钮预防吗?

【问题讨论】:

  • 您在视图之间导航时是否使用了哈希。 caniuse.com/#feat=hashchangeIE8及以上有支持
  • 您是否有任何特殊原因无法利用pushState API?看起来 Backbone.js 支持这个开箱即用 - backbonejs.org/#History
  • 问题恰恰在于:Backbone 的路由器使用 pushState API,所以如果我尝试检测返回按钮点击的常用技巧,我最终会破坏 Backbone。

标签: internet-explorer backbone.js backbone-routing


【解决方案1】:

如果您试图避免使用后退按钮重新触发特定点击(例如删除事件),最简单的方法是首先使用 preventDefault() 作为 onclick 事件的一部分来防止它们被添加到历史记录中功能。

如果这是您的问题,这将是一篇不错的文章:http://lostechies.com/derickbailey/2011/08/03/stop-using-backbone-as-if-it-were-a-stateless-web-server/

这里有一个相当简单的方法来检测 Backbone 的后点击:backbone routing detecting whether forward or back pressed

【讨论】:

  • 感谢您的建议,但在我的情况下,我真的更关心以下情况:1)用户在我们网站上的一个巨大表单中输入大量信息,2)用户点击返回按钮意外,3)用户失去了所有的工作。我知道有一些技巧可以将特殊状态推送到堆栈上,这样当用户点击返回时,他们不会返回一页,而是转到他们所在的页面(并且不会丢失他们的数据).. . 但是当我尝试自己实现这种事情时,我最终破坏了 Backbone 的路由(这是我们网站不可或缺的):-(
  • 为此你可能想使用window.onbeforeunload
【解决方案2】:

如果你使用pushState,可以使用window.onpopstate

window.onpopstate = function(event) {
  console.log(document.location);
};

【讨论】:

  • 谢谢,但您错过了使用 Backbone 的要点。在不影响主干路由器的情况下仅“使用 window.onpopstate”并非易事。
猜你喜欢
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2016-12-08
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多