我正在构建具有几种动态形式的PHP / Symfony应用程序。大多数形式简单明了,但有些形式更高级。高级表单包含以下元素:
标签,该表格分为多个标签(Bootstrap CSS)。这些选项卡之间的导航是使用JavaScript完成的。
集合,某些表单字段是集合,用户可以从DOM中添加/删除这些字段。使用JavaScript完成添加和删除操作。
隐藏的字段,某些字段是隐藏的,只能通过(Bootstrap CSS)模式进行编辑。例如: name 字段的值显示在页面上,当用户单击它时,将出现一个带有额外字段的模式,例如 address ,邮政编码和城市。在模式中更新名称字段后,DOM也将更新以在页面上显示新名称。
这一切都非常简洁,但是当用户单击浏览器后退按钮时,会出现一些问题:
浏览器在页面加载时保存DOM,不保存DOM更改,但会将更改保存到在页面加载时加载的表单字段中。
这导致当单击浏览器后退按钮时部分还原表单的情况。如果是隐藏字段,则可能导致DOM无法代表底层隐藏字段的正确值。
我想创建一种情况,其中所有值和DOM更改被保留,或者无。在搜索互联网时,我遇到了四种可能的解决方案:
设置缓存头,请参见How to control web page caching, across all browsers?。似乎无法解决我的问题。
向我的页面添加卸载事件以防止缓存。似乎无法解决我的问题。
在我的表单或某些字段中添加autocomplete="off"
。这是可行的,当单击浏览器的后退按钮时,所有更改都会撤消。不幸的是,这杀死了整个自动完成功能,这对于用户而言可能非常烦人。仍然值得进行权衡。
将所有更改保存到localStorage或cookie,并在单击浏览器后退按钮时添加一些逻辑。对于这个特定项目来说,这似乎有些过大,但在将来的项目中可能是一个很好的解决方案。
我可以忽略一些解决方案吗?