BackboneJS - 干扰正常的哈希行为

时间:2014-06-24 02:24:41

标签: javascript backbone.js

我正在使用BackboneJS及其路由器提供一个简单的页面。

在我的一个DOM元素上,我有

<div id="1234">Content</div>

当我去

http://www.myhomepage.com/page#1234

我希望页面滚动到DIV所在的位置(这是预期的行为)。

但是因为我使用的是Backbone,所以它必须干扰它,因为它无法正常工作。我阅读了主干文档,似乎它没有识别哈希值,我想我可以为所有未匹配的路由设置“Catch all”路由(Is there a way to catch all non-matched routes with Backbone?

但是,我如何实际按照我的意愿行事(即让页面滚动到正确的div)?

1 个答案:

答案 0 :(得分:0)

好的,先来一点背景。在网络的早期,浏览器将这些东西称为锚点,或者您现在知道它们,a标记:

<a name="foo">

锚点允许您“标记”页面的一部分,以便您可以专门链接到该部分:

<a href="#foo">

最终,浏览器也将ID属性添加为锚点。

然后现代JS和Backbone出现了,这就是故障开始的地方,因为Backbone路由器劫持了该系统。这意味着如果你想使用Backbone的路由器,你就失去了正常锚点的能力。

然而,一切都不会丢失。一种选择是让Backbone不使用它的路由器的URL哈希,而是依赖浏览器的“推送状态”。您可以通过在启动路由器时传递额外选项来执行此操作:

 Backbone.history.start({pushState: true})

您可以在此处详细了解该方法的局限性: http://backbonejs.org/#History

但简短版本是它只适用于绿色标记的浏览器:

http://caniuse.com/#search=pushstate

另一种方法是使用jQuery重新创建自己的锚系统。基本上,您可以在没有任何路线匹配的情况下创建一个漏洞:

 if (!Backbone.history.start() {

然后在那个秋天,您可以使用jQuery手动滚动到所需的点:

     $('html, body').animate({
         scrollTop: $('#' + window.location.hash).offset().top
     }, 1000);

你也可以看中并定义自定义路线而不是使用穿透,但我会把它留给你。

除了这些选项@Pramod链接到一个问题,其中包含其他选项的答案,您也可以考虑(比如修改Backbone路由器以构建滚动功能)。