Javascript 监控location.hash是XHR应用程序中历史记录的解决方案吗?

Javascript 监控location.hash是XHR应用程序中历史记录的解决方案吗?,javascript,ajax,browser-history,xmlhttprequest,Javascript,Ajax,Browser History,Xmlhttprequest,众所周知,在XHR(又名AJAX)web应用程序中,不会生成应用程序的历史记录,单击刷新按钮通常会将用户移出当前活动。我偶然发现location.hash(例如http://anywhere/index.html#somehashvalue)以避免刷新问题(使用location.hash通知应用程序其当前状态,并使用页面加载处理程序重置该状态)。这真的很好,很简单 这让我开始考虑使用location.hash来跟踪我的应用程序的历史记录。我不想使用现有的库,因为它们使用iFrame等。下面是我的

众所周知,在XHR(又名AJAX)web应用程序中,不会生成应用程序的历史记录,单击刷新按钮通常会将用户移出当前活动。我偶然发现location.hash(例如
http://anywhere/index.html#somehashvalue
)以避免刷新问题(使用location.hash通知应用程序其当前状态,并使用页面加载处理程序重置该状态)。这真的很好,很简单

这让我开始考虑使用location.hash来跟踪我的应用程序的历史记录。我不想使用现有的库,因为它们使用iFrame等。下面是我的五分钱:当应用程序页面加载时,我开始:

setInterval(
       function(){
           if (location.hash !== appCache.currentHash) {
               appCache.currentHash = location.hash;
               appCache.history.push(location.hash);
               /* ... [load state using the hash value] ... */
               return true;
           }
           return false;
       }, 250
 );

(appCache是包含应用程序变量的预定义对象)其思想是从哈希值触发应用程序中的每个操作。在体面的浏览器中,哈希值更改会在历史记录中添加一个条目,在IE中(我想你很难知道用户是前进还是后退。 假设url starts/myapp#page1,则开始跟踪状态。 然后用户做了一些事情来创建url/myapp#page2 然后用户做了一些事情来再次创建url/myapp#page1。现在,他们的历史记录不明确,你不知道删除或不删除什么

历史框架使用iFrame来解决您提到的浏览器不一致问题。您只需要在需要它们的浏览器中使用iFrame

另一个缺点是,用户在选择自定义的后退按钮之前,总是会选择浏览器的后退按钮。我感觉每隔250毫秒读取历史记录的延迟也会很明显。也许你可以将间隔缩短得更紧,但我不知道这是否会使事情表现糟糕


我使用过yui的history manager,虽然它在所有浏览器(尤其是ie6)中都不能一直正常工作,但它已经被许多用户和开发人员使用。他们使用的模式也非常灵活。

大多数解决方案都会将三个问题结合在一起:

  • 后退按钮
  • 可书签性
  • 刷新按钮
  • 基于
    window.location.hash
    的解决方案在大多数情况下都可以解决这三个问题:
    hash
    中的值映射到应用程序/网页的状态,因此用户可以按“后退”/“前进”/“刷新”中的一个键并跳到哈希中的当前状态。他们还可以添加书签,因为地址栏中的值已更改。(请注意,与哈希相关的IE需要一个隐藏的
    iframe
    ,而不影响浏览器的历史记录)

    不过,我只想指出,对于非常有效的解决方案,可以在不监视
    window.location.hash
    的情况下使用iframe-only解决方案

    谷歌地图就是一个很好的例子。为每个用户操作捕获的状态太大,无法放在window.location.hash(地图质心、搜索结果、卫星与地图视图、信息窗口等)中。因此,他们将状态保存到嵌入隐藏的
    iframe
    中的表单中。顺便说一句,这解决了[软]“刷新”问题他们还通过“链接到此页面”按钮分别解决了书签功能问题


    我只是认为了解/分离您正在考虑的问题域是值得的。

    所有这些对于支持全套浏览器都很重要,但希望对它的需求会消失。IE8和FF3.6都引入了对的支持。我想其他人也会效仿。检查可用性是一个好主意在使用超时或iFrame之前,此功能的可用性,因为它确实是目前最好的解决方案-甚至在IE中也能工作!

    我考虑过。可能混乱的历史记录也是应用程序控制的问题-确保用户最终到达应用程序引导他/她的位置,以便他/她的位置始终清晰?实际有4个问题y、 你错过了“状态”。