在后退button上保留dynamic更改的HTML
这真是太神奇了,我经常看到这个工作在其他网站,但从来没有在我工作的网站。
我带来了一个新的Ajax内容,我知道history.js和历史API,我不想改变的URL,只是让浏览器caching新的HTML内容,所以当用户离开页面,并返回使用后退button,它仍然有更新的HTML。
我看到这个工作一直在其他网站没有URL更改或使用哈希#。
有没有一个让它工作的技巧,或者它是由浏览器随机决定的?
如果我不想使用URL来获取这些信息,有没有简单的select?
大约十年半的时间里,我一直在使用我曾经通过痛苦的尝试和错误发现的两个技巧:input字段值 – 尤其是“隐藏的”字段值 – 与URL一起保存在浏览器的历史logging中 – AND – onLoad事件通过后退(或前进)button返回到页面时被调用。
这意味着您可以在隐藏字段中存储尽可能多的“状态”(请记住将它们放在表单中),然后在“onLoad”上“重做”更改。 我通常把“渲染”部分作为一个单独的函数…换句话说,在dynamic发生的时候,我首先写入隐藏的字段 – 然后调用渲染函数。 然后,我将各种dynamic渲染函数汇集在一起,并从onLoad中调用它们。
我会强调,我从来没有去任何手册狩猎这个 – 所以不能提供任何保证 – 但我一直在可靠地使用它一段时间(因为Netscape !!!)它适用于“多”浏览器(所有的IE ,铬,FF – 但至于其他人,我从来没有尝试过。)
如果任何人有一个更正确的,而且不那么单调乏味的话,我会很高兴听到这个消息。 但是,这似乎确实有用。
RES的作者在这里,在/ r / javascript中find你的问题
显然,Firefox最近增加了自己做的function,但是当浏览器没有为你做这个时,没有什么“好”的方法可以做到这一点。
RES曾经做过的事情是添加一个#page = n标记,其中n是你的页码。 这样,在页面加载,RES知道你必须来自后退button,如果已经有一个location.hash – 不幸的是,这种特定的行为borked了Firefox和Chrome中的Ctrl-F查找,当查找导致您滚动到另一个页面(page = n + 1),因为hashchange会closures查找对话框,使用户恼火…
所以现在RES做了一些丑陋而不完美的体操来猜测你是否通过后退button来到页面。 任何时候它加载一个新的页面,它会在sessionStorage中保存这个数字(比如localStorage,但本地的标签),并通过后退button显示,它引发了该页码的请求。
但是,最近我在FF和Chrome中进行了testing,似乎哈希不再“取消”ctrl-f查找对话框,所以我的build议是使用它。 在页面加载时,如果存在散列,则加载由该散列确定的相关数据。
你可以,如果你想变得非常疯狂,将实际的HTML内容存储在localStorage中,并通过后退button重新加载到页面加载。 这可能不是最有效的做事方式,几乎肯定会导致与依赖于DOM的JavaScript冲突,所以谨慎行事!
“最好”的解决scheme实际上取决于你的网站究竟在做什么/内容看起来/行为如何。
你可以使用History.js来实现你的目标:
function manageHistory(data){ var History = window.History; if ( !History.enabled ) { return false; } History.replaceState({myData: data}, null); } $('select.select').change(function(e) { // I am using select tag here to give an example of an HTML action triggerer e.preventDefault(); // get data from your select tag manageHistory( data) }); History.Adapter.bind(window, 'statechange', function() { var State = History.getState(); // Launch the ajax call and update DOM using State.data.myData });
根据有关Mozilla网站上的History的文档,PushState的第三个参数是:
URL – …….这个参数是可选的; 如果未指定,则将其设置为文档的当前URL。
我认为这可能是其他网页使用一些提供会话的后端服务器。
如果你正在build立静态html / js页面没有这样的会话和页面只是重新加载。
你可以使用cookie来实现你想要的。
本地存储是一种方式,另一种方式是服务器端的持久性。
当HTML被编辑/创build/某些属性在客户端更改时,您需要通过restful api(或类似的东西)将网页的状态更改与webstorage或数据库同步。
当你返回页面 – 页面可以从本地存储检索存储的信息…如果你使用服务器端的持久性,你需要结合会话cookie来检索用户的状态变化 – 然后可以从服务器加载。
我会build议你使用cookies。
尽pipeHTML5提供了Webstorage ,但它的值可以存储在浏览器中。 还有一些JS库处理HTML5 Webstorage。
注意:每个浏览器可以存储的数据大小有所不同。 你可以在这里find更多的信息。
注2:还有一些黑客攻击用户磁盘空间的问题,所以你可以期待更新关于使用webstorage的策略( http://feross.org/fill-disk/ )