Javascript 如何在单页应用程序中使用#-URL?

Javascript 如何在单页应用程序中使用#-URL?,javascript,html,url,singlepage,Javascript,Html,Url,Singlepage,提出了一个非常有说服力的论点,即由于URL是长期存在的(它们被标记并传递),它们应该是有意义的,因此使用哈希进行真正的路由(确定页面上显示的数据和/或应用程序的状态)是不恰当的。但是,当我尝试在单页应用程序中实际执行此操作时,遇到了一个问题:如何呈现链接,以便所有浏览器都可以使用该应用程序?在我看来,有三种选择: 所有href都有#/前缀。这在HTML4浏览器中非常有效。在HTML5浏览器中,我可以添加一个重定向到无散列版本的路由,这也非常有效。浏览器在未访问时将链接标记为已访问,或者在访问时未

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

  • 所有
    href
    都有
    #/
    前缀。这在HTML4浏览器中非常有效。在HTML5浏览器中,我可以添加一个重定向到无散列版本的路由,这也非常有效。浏览器在未访问时将链接标记为已访问,或者在访问时未将链接标记为已访问,这可能会出现问题。另一个问题是。。。错。任何通过右键单击链接并选择“复制链接URL”来共享链接的人都将发送一个有效但笨拙的URL
  • 没有
    href
    s有
    #/
    前缀。据我所知,HTML4浏览器将无法拦截这些链接点击,这意味着每一次点击都会导致页面刷新。虽然应用程序可能仍然可以运行,但由于我可以在页面加载时使用Sammy routes将无散列版本重写为散列版本,因此页面加载将扼杀单页面应用程序的性能
  • 我动态地确定是否使用
    #/
    作为前缀。这意味着我的所有链接都必须有动态标记,并使应用程序大大复杂化

  • URL的
    hash
    值从未导致整个页面重新加载。不是在HTML4和之前。哈希值始终是一个内部链接,因此可以完美地使用它(以twitter为例)。当然,当您刷新页面时,您将重新加载页面。但这是显而易见的

    使用JavaScript,您可以使用
    window.location.hash

    使用较新的浏览器,您还可以检测哈希更改,如果用户实际更改URL,这将非常有用:

    但是当你,作为一个网站,改变你不需要阅读的URL时,你已经知道了,因为你刚刚改变了它


    通过这种方式,使用散列,人们可以交换URL,您可以实际读取他们请求的URL,因此它应该可以完美地工作。

    那么您不同意这个问题的前提吗?如果在URL中使用哈希,在技术上很容易实现。我的问题更多的是关于如何避免这种情况,因为我认为这是一个难题。是的,实际上我是这样想的。如果你想让人们能够在一个单页应用程序中共享链接,你应该使用itI。我很好奇你选择了什么解决方案(我只是忽略了HTML5路由,在任何地方都使用hashbang。它很简单,而且大多数人都不在乎)。