14

这篇文章提出了一个非常有说服力的论点,因为 URL 是长期存在的(它们被添加到书签并被传递),它们应该是有意义的,并且使用散列进行真正的路由(确定页面上显示的数据和/或状态)应用程序)因此是不适当的。但是,当我尝试在我的单页应用程序中实际执行此操作时,我遇到了一个问题:如何呈现我的链接以便所有浏览器都可以使用该应用程序?在我看来,有三种选择:

  1. 所有hrefs 都有一个#/前缀。这在 HTML4 浏览器中效果很好。在 HTML5 浏览器中,我可以添加重定向到无哈希版本的Sammy路由,这也很有效。浏览器将链接标记为未访问时或未将链接标记为已访问时可能存在问题。另一个问题是它……错了。通过右键单击链接并选择“复制链接 URL”来共享链接的任何人都将发送一个有效但笨拙的 URL。
  2. no hrefs 有#/前缀。据我所知,HTML4 浏览器将无法拦截这些链接点击,这意味着每一次都会导致页面刷新。尽管应用程序可能仍然可以运行,因为我可以在页面加载时使用 Sammy 路由将无哈希版本重写为哈希版本,但页面加载会降低单页应用程序的性能。
  3. 我动态确定是否添加前缀#/。这意味着我的所有链接都必须具有动态标记,这会使应用程序变得非常复杂。
4

1 回答 1

11

URL的hash值永远不会导致整个页面重新加载。不在 HTML4 和之前。哈希值一直是一个内部链接,因此可以完美地使用它(例如,看看 twitter)。当然,当你刷新页面时,你会重新加载页面。但这很明显。

使用 JavaScript,您实际上可以读取此哈希值(另请参阅此问题/答案:How can you check for a #hash in a URL using JavaScript?)使用window.location.hash

使用更新的浏览器,您还可以检测到哈希更改,这在用户实际更改 URL 时很有用:On - window.location.hash - Change?

但是,当您作为网站更改不需要的 URL 时,请阅读此内容,您已经知道,因为您只是更改了它。

通过这种方式,人们可以使用哈希值交换 URL,并且您实际上可以读取他们正在请求的 URL,因此它应该可以完美运行。

于 2011-10-11T17:45:18.850 回答