我写这篇文章来记录当前(明显的)错误。
情况: 给定一个webapp,用户可以查看和排序表格数据(它从DOM加载,并可通过javascript排序)。他们可以使用复选框和按钮对所查看的内容采取措施。
如果使用后退按钮返回表格数据页面,则浏览器会填写复选框的状态。这是预期的行为。
并发症: 如果您首先对表进行排序(使用javascript进行DOM内排序),然后填写复选框并转到另一个页面,然后使用后退按钮返回,则浏览器的行为会有所不同。
目前Chrome(58)和Safari(10.1)以原始(不是js-sorted)顺序重新加载表单和表格数据,但按照点击顺序恢复输入(即忽略输入的任何ID - - 只是他们当时在DOM中的顺序) - 这会导致非常令人惊讶的行为(乍一看似乎是您所期望的形式,但是不同的表单元素已经使用不同的数据进行了恢复)
然而,Firefox(v50.0)以js排序的顺序重新加载表单和表格数据,并且恢复的输入是正确的。
我已在https://timdiggins.github.io/back-button-restore-sorted-inputs/
更全面地记录了这一点理想情况下,浏览器会根据输入的id而不是DOM中的顺序存储输入数据,或者也会缓存DOM顺序。
我会自己解决这个问题,但是我希望有人会提出更好的建议。
或者或者指出HTML5规范中的任何地方都说表格的DOM不应该是可排序的? (也就是说,Chrome和Webkit可能在这里符合规范)。
答案 0 :(得分:2)
我找到了解决这个问题的三种方法。两个非常可靠,但每个都失去了功能,而且我有两个想法
1)禁用初始形式的动态排序(显然)。
2)使用autocomplete =" off"禁用所有表单元素的保存表单状态(在每个输入上,请参阅https://stackoverflow.com/a/2458153/109175)。可选地,可以跳过具有无问题行为的浏览器(如Firefox)(在我的用例中Firefox从未使用过)。
3)我遇到的一个选项是确保在保存表单状态时将订单重置为原始DOM顺序。这可能意味着在表单上添加一个before submit处理程序(很简单),但为了确保在使用简单链接<a>
导航时正确恢复表单,这可能意味着在执行链接之前添加回调 - 这不会涵盖基于javascript的导航。
3和4看起来都很聪明,但是(对于我的使用案例)我倾向于使用1或2中的一个并处理缩减的功能。