Ajax,后退按钮和DOM更新

时间:2009-07-28 17:05:49

标签: javascript ajax firefox

如果javascript修改了页面A中的DOM,则用户导航到页面B,然后点击返回按钮返回页面A.对页面A的DOM的所有修改都将丢失,并向用户显示最初从该页面检索到的版本服务器

它在stackoverflow,reddit和许多其他热门网站上的工作方式。 (尝试在此问题中添加测试评论,然后导航到不同页面并点击返回按钮返回 - 您的评论将“消失”)

这是有道理的,但有些网站(apple.com,basecamphq.com等)以某种方式迫使浏览器为用户提供最新的页面状态。 (转到http://www.apple.com/ca/search/?q=ipod,单击顶部的“下载”链接,然后单击“返回”按钮 - 将保留所有DOM更新)

来自哪里的不一致?

7 个答案:

答案 0 :(得分:104)

一个答案:除其他外,卸载事件会导致后退/转发缓存无效

某些浏览器将整个网页的当前状态存储在所谓的“bfcache”或“页面缓存”中。这允许他们在通过后退和前进按钮导航时非常快速地重新呈现页面,并保留DOM的状态和所有JavaScript变量。但是,当页面包含onunload事件时,这些事件可能会使页面进入非功能状态,因此页面不会存储在bfcache中,必须重新加载(但可以从标准缓存加载)并重新加载从头开始渲染,包括运行所有onload处理程序。当通过bfcache返回页面时,DOM保持其先前的状态,而不需要触发onload处理程序(因为页面已经加载)。

请注意,bfcache的行为与Cache-Control和其他HTTP标头的标准浏览器缓存不同。在许多情况下,浏览器会将页面缓存在bfcache中,即使它不会将其存储在标准缓存中。

jQuery会自动将卸载事件附加到窗口,因此不幸的是,使用jQuery会使您的页面无法存储在bfcache中以保存DOM并快速返回/转发。 [更新:这已在jQuery 1.4中修复,因此它仅适用于IE]

答案 1 :(得分:13)

我一直在尝试让Chrome的行为与Safari一样,而我发现有效的唯一方法就是在标题中设置Cache-control: no-store。这会强制浏览器在用户按下后退按钮时从服务器重新获取页面。不理想,但比显示过时的页面更好。

答案 2 :(得分:3)

Facebook通过修改ajax请求的URL中的哈希标识符来记住页面状态。这些更改记录在浏览器历史记录中,因此当用户单击后退按钮时,哈希值将更改为之前的更改。因此,暗示您需要一些Javascript来监视has标识符,并在浏览器更改时做出反应。 Andreas Blixt has a hash monitoring script available

答案 3 :(得分:3)

这与哈希(#)符号无关。

如果要检查apple的HTTP标头,它只是缓存页面。

答案 4 :(得分:2)

使用URL散列/片段标识符是一种在依赖Ajax和DOM更新的Web应用程序中挂钩/记忆状态的常用方法。

查看Really Simple History项目以获取一些想法。可以监视URL以更改哈希值,rsh会这样做,同时考虑到浏览器差异。

答案 5 :(得分:1)

对于任何遇到Rails问题的人而言 - 你的问题不是bfcache(我以为是) - 它是turbolinks宝石。 Here是如何删除它。

希望这样可以节省一些时间并将头撞在墙上。

答案 6 :(得分:0)

您正在寻找的是某种类型的URL哈希管理。 url中的#仅供客户端使用。

当您使用JS更改背面的状态时,则更新网址的#中的数据。

此外,您还添加了一些监视散列是否已更改的轮询,并根据散列中的新数据加载页面状态。

看看这个:

http://ajaxpatterns.org/Unique_URLs