Javascript 如何';联合国缓存&x27;用户离开页面时ajax加载的html

Javascript 如何';联合国缓存&x27;用户离开页面时ajax加载的html,javascript,jquery,html,ajax,Javascript,Jquery,Html,Ajax,现在,当用户单击我网站上的链接时,我使用ajax只替换主框架中的内容(页眉和侧边栏需要在页面之间保持状态,所以我不想重新加载它们)。我使用pushState和popState来更改url栏 我明确地不缓存ajax内容,我的站点运行良好——但感觉有点太慢,尤其是在“back”命令上 如果我缓存了xhr html请求,那么该站点在内部运行良好。但是,如果用户输入一个新的URL并离开站点,如果他/她点击“后退”命令,则只会从缓存中提取未设置样式、没有标题和侧栏的主视图内容,站点将无法正常显示 如果用户

现在,当用户单击我网站上的链接时,我使用ajax只替换主框架中的内容(页眉和侧边栏需要在页面之间保持状态,所以我不想重新加载它们)。我使用pushState和popState来更改url栏

我明确地不缓存ajax内容,我的站点运行良好——但感觉有点太慢,尤其是在“back”命令上

如果我缓存了xhr html请求,那么该站点在内部运行良好。但是,如果用户输入一个新的URL并离开站点,如果他/她点击“后退”命令,则只会从缓存中提取未设置样式、没有标题和侧栏的主视图内容,站点将无法正常显示


如果用户离开页面,我是否可以在内部进行缓存,但刷新缓存?

我想我现在理解了您的描述

当我在你的网站上访问/page1.html时,下载的html有主内容+标题+侧栏。 当我单击一个链接访问/page2.html时,AJAX将加载页面,下载的html仅包含主要内容

因此,此时缓存包含完整的/page1.html和部分的/page2.html

现在,当我离开您的站点,然后按“上一步”按钮返回时,浏览器会从缓存中获取/page2.html。但这只是一个部分页面,你的网站“崩溃”

理想情况下,您希望浏览器仅在使用XMLHttpRequest请求时获取部分内容。 另外,如果可以缓存部分页面和完整页面,那就太好了

通过在AJAX请求的URL查询中附加一个
\u pjax=true
参数来解决这个问题。我认为这在大多数情况下都应该有效

请注意,您没有将此参数添加到传递给
pushState()
的URL中

另一种方法是始终下载整个页面,然后在使用AJAX时提取
#主视图

当然,您可以通过切换到PJAX(您需要使用
fragment
选项)来解决其他人的问题


另一个为您处理pushState()的JS库是我的项目。使用HTMLDecor,您的页面只包含主内容+一个
到另一个(可能是共享的)包含页眉/页脚/侧边栏的HTML页面。HTMLDecor将这些从浏览器中添加到页面中。当用户点击一个链接浏览到另一个页面时,HTMLDecor使用AJAX和pushState—无需配置。当然,如果浏览器不支持pushState,则会出现正常的链接导航

您是否尝试过在domready上生成一个唯一的ID,并在文档的整个生命周期中为每个请求使用相同的唯一ID?我认为没有办法检测用户何时离开页面。Victor,这里有
窗口。onbeforeunload
,但据我所知,您只能通过弹出消息有效地阻止用户。如果我知道一种清除缓存的方法,我可以看看它是否在用户离开之前及时行动。凯文,我不确定这能解决我的问题。你是说在URL中粘贴uniqueID吗?当用户在离开我的页面后按“后退”键时,如果我让他用uniqueID缓存页面,他的浏览器仍会加载缓存的内容,而不会与我的服务器进行任何通信。如果我没有理解你的意思,请告诉我。理论上,我认为我可以在正文内容的每一部分中粘贴一个脚本标记,并让它检查标题中的dom元素。如果元素不存在,则刷新页面。这将解决问题,但似乎一定有更好的方法…谢谢肖恩的建议。不幸的是,我很难有效地实施它们。pjax演示似乎并没有做到它所说的那样,即使在在线演示中,至少在Chrome中也是如此。每次只需重新加载整个页面。它可能不再适用于最新版本的jquery。至于HTMLDecor,我在
hide
函数的
document.head.insertBefore(script,style)
中遇到了一个关于缺少DOM元素的错误,尽管我试图复制您的设置示例。不过,我会继续玩,看看能不能让它发挥作用。你的演示确实如此work@trespassers-w:pjax需要勾选复选框以启用pushState。如果在您这样做之后它仍然不起作用,我相信pjax开发人员会喜欢一份bug报告。@invaders-w:谢谢您提供的信息RE:HTMLDecor。错误消息表示页面的
中未包含HTMLDecor脚本。在HTMLDecor中,这是一个错误的假设,我将立即加以说明。如果您对HTMLDecor有更多疑问,请通过。您对pjax演示的看法是正确的,它现在可以工作了,而且我在我的页脚中加入了HTMLDecor和其他脚本。我会解决的。