在XHR应用中,监控location.hash是否是处理历史记录的解决方案吗?

19
众所周知,在XHR(又称为AJAX) Web应用程序中,没有为您的应用程序构建历史记录,并且经常点击刷新按钮会使用户退出当前活动状态。我偶然发现了location.hash(例如http://anywhere/index.html#somehashvalue),以避开刷新问题(使用location.hash告知您的应用程序其当前状态,并使用页面加载处理程序重置该状态)。这真的很好而且简单。
这让我想到使用location.hash来跟踪我的应用程序历史记录。我不想使用现有的库,因为它们使用iframes等。因此,当应用程序页面加载时,我启动了以下操作:
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(≤7)中则不会。在所有浏览器中,回退或前进到具有另一个哈希值的页面不会触发页面刷新。这就是间隔函数接管的地方。使用该函数,每次检测到哈希值更改(通过编程或单击回退或前进),应用程序可以采取适当的操作。应用程序可以跟踪自己的历史记录,我应该能够在应用程序中呈现历史按钮(特别是对于IE用户)。

据我所知,这在跨浏览器中有效,并且在内存或处理器资源方面没有成本。因此,我的问题是:这是否是管理XHR应用程序中的历史记录的可行解决方案?有哪些优点和缺点?

更新:由于我使用自制框架,所以不想使用现有框架之一。为了能够在IE中使用location.hash并将其保存在历史记录中,我创建了一个简单的脚本(是的,它需要一个iframe),这可能对您有用。我在我的网站上发布了它,随意使用/修改/批评。

3个回答

8
大多数解决方案都将以下3个问题混为一谈:
  1. 后退按钮
  2. 可书签性
  3. 刷新按钮
基于 window.location.hash 的解决方案可以解决大多数情况下的这三个问题:哈希中的值映射到应用程序/网页的状态,因此用户可以按一个“后退”/“前进”/“刷新”按钮并跳转到现在哈希中的状态。他们也可以进行书签,因为地址栏中的值已更改。(请注意,与哈希不影响浏览器历史记录有关,需要一个隐藏的 iframe 用于 IE)。
然而,我想指出,只使用 iframe 的解决方案也可以非常有效地解决问题,而无需监视 window.location.hash
Google 地图就是一个很好的例子。对于每个用户操作捕获的状态太大了,无法放入 window.location.hash(地图中心、搜索结果、卫星 vs 地图视图、信息窗口等)。因此,他们将状态保存到嵌入的隐藏表单中。顺便说一下,这也解决了[软件]“刷新”问题。他们通过“链接到此页面”按钮单独解决了书签的问题。
我只是认为知道/分离您正在思考的问题领域是值得的。

实际上有4个问题。你漏掉了“状态”。 - T9b

5
我认为你很难知道用户是后退还是前进。比如,如果url从/myapp#page1开始,你会开始跟踪状态。然后用户做了一些操作,使得url变成了/myapp#page2,接着又让url变回/myapp#page1。现在,他们的浏览历史不明确,你就无法确定要删除什么。历史框架使用iframes来解决你提到的浏览器不一致问题。只需要在需要使用iframes的浏览器中使用它们。另一个缺点是,在使用你自己的返回按钮之前,用户总是会先使用浏览器的返回按钮。我觉得每250毫秒读取历史记录的延迟也会很明显。也许你可以把时间间隔缩短,但我不知道那是否会导致性能下降。我曾经使用过YUI的历史管理器,尽管它在所有浏览器中并不总是完美运行(特别是IE6),但已经被很多用户和开发人员使用。他们使用的模式也非常灵活。

我考虑过这个问题。也许混乱的历史记录也是应用程序控制的一个问题 - 确保用户最终到达应用程序引导他/她的位置,以便他/她的位置始终清晰可见? - KooiInc

2

所有这些内容都对支持各种浏览器非常重要,但希望它们的需求会逐渐消失。IE8和FF3.6都引入了对onhashchange的支持。我想其他浏览器也会效仿。在使用超时或iframes之前,最好检查此功能是否可用,因为它是目前最好的解决方案 - 甚至可以在IE中使用!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接