Firefox memory.cache的烦恼

今天用jQuery作一个界面发现了firefox的一个问题,操作过程很简单:
1个form,用户先填写一些基本信息,保存,服务器返回taconite的response,会打开原来隐藏的
扩展属性面板,这样用户可以填写那些关联的属性,上传附件等等。当保存时,服务器端返回的taconite
会设置一个hidden field(id)的值为刚才保存的记录的主键,这样,当提交其他的关联数据时可以
附带这个id。

一切都很好,但是当我刷新的时候发现了奇怪事情,id值没有被复位,仍然是刚才传回的id,我用firebug发现,
html中的value是空的,但是用$(’#id’).val()返回的值竟然非空!

这个现象上周作passport时候也出现,不过我是在document.ready里清空了这个值。也就没在意。

今天又出现,不由让我奇异,此外,由于使用的smarty模板和js是复用的(新建和编辑用的是同一个),
没有办法全部重置为空。

我作了下测试,当装载时调用form的reset方法,其他的field都被重置回去了,但是id这个hidden field
没有变化。

反复测试,发现:
如果是command+R,或者点击刷新,上面现象重复。
如果是shift+command+R,或者地址栏旁边的点击转到,上述现象消失。

googling 了一下,发现很多人有同样的困惑,尤其是一些flash,进度条经常无法正常显示。
很多人给出了各种答案,但是很多人又都否定了那些答案的有效性。

不过在一个老外的blog上,发现了一个线索,他指出,这是FF1.5的一个“特性”,即所谓的memory cache。
FF1.5以后增加了一个特性,它将当前页面很多东西都缓存到内存中,当你back-forward操作的时候,直接
会从内存中恢复。这也就是为什么虽然html的value是空,但是dom树中的值非空。

如何解决呢?
根据FF的说明,以下情况下不会使用memory cache:

1.定义了unload事件处理

2.设置了”cache-control: no-store”

3.设置了”cache-control: no-cache” 且站点为HTTPS.

4.页面未完全载入,用户就离开当前页面

5.使用页面所属的frameset不允许缓存

6.the page is in a frame and the user loads a new page within that frame (in this case, when the user navigates away from the page, the content that was last loaded into the frames is what is cached)

严重后果:

如果页面是从cache中载入的,那么所有的Inline script和onload事件将不被运行。

如何解决呢?为了使用这个所谓的新特性,FF1.5中为此增加了2个新的event:

###pageshow event

pageshow event同onload事件,不过即使从cache中load的,也会执行。
当第一初始化时,pageshow会在onload后触发,不过带有一个event.persisted=false的参数用户指示
当前是第一次运行。

###pagehide event

同unload一样,不过由于定义unload后无法使用memory cache,因此你可以定义pagehide来作同样的事情,这样还能
保证cache有效。

以上就是FF1.5的这个新特性。

最后的结论,是否该使用这个特性?

我的回答是NO!
整这么多特性,还不够累的。何况,这种违反W3C的特性实在是不可取。

所以,我干脆用:

“cache-control: no-store”

直接将它扼杀掉,
于是,世界终于太平了。