我正在使用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)?
答案 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路由器以构建滚动功能)。