2013-05-15 37 views
2

假设我在HTML页面上有一个<input>元素。当我填写一个值时,向前浏览到另一个页面并向后导航,通常会恢复该值:自动完成/恢复导航时动态创建的输入表单域

1)在Firefox中,由于BFCache:https://developer.mozilla.org/en-US/docs/Working_with_BFCache,整个页面状态正在恢复。 (这意味着即使正在运行的脚本的状态正在恢复。)

2)在Chrome中,快速页面缓存似乎不起作用(因此页面被重置为原始状态),但是输入字段正在保留。

现在,如果我通过脚本动态添加<input>字段,那么在Firefox中,值仍将被恢复(因为所有内容都已恢复)。

但是,在Chrome中,创建<input>字段的Javascript必须重新运行,以便该输入字段对引擎显示为全新的,这意味着不会恢复任何值。

所以我的问题是:如何实现Chrome的功能2)动态生成<input>(或如何给Chrome提示输入字段的身份)。

(原因之一,我很感兴趣,这一切都提出了自定义元素:https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html使用这个或https://github.com/mozilla/web-components/blob/master/src/document.register.jshttps://github.com/Polymer/CustomElements的polyfills意味着人会以编程方式创造了很多(输入)元素和一个良好的用户的经验,他们将正常运行内置的元素。)

回答

1

一个解决我想到的是使用window.history.replaceState只要输入要素的变化值,将其存储在浏览器的历史记录。但我想知道我是否可以直接挂钩到浏览器的自动完成功能,以便我不必重复调用replaceState。

还有另一种解决方法:可以创建一个静态隐藏字段,而不是使用历史记录API存储该值的值(无论何时发生更改)动态生成的输入,可以创建一个隐藏页面状态的静态隐藏字段,我们依靠浏览器恢复其价值的能力。

除了使用<input>字段上的输入事件来检测要保存在当前会话历史条目中的更改,还可以侦听pagehide事件以保存当前值。这可能会更高效一些。但是,这不适用于在隐藏输入字段中存储状态,因为页面隐藏事件后的任何更改都被丢弃(至少由Chrome)。