【问题标题】:Prevent Firefox from Restoring State of Previous User Input after Refresh防止 Firefox 在刷新后恢复先前用户输入的状态
【发布时间】:2012-04-01 09:31:45
【问题描述】:

我有一个包含多个复选框的页面,这些复选框需要表示数据库中的状态。复选框是Ajax驱动,因此当检查一个时,请求将发送到数据库中的更新状态。如果他们的视图过时,受影响/相关复选框的视图会更新,并通知用户,并且必须重试。当我刷新时,我希望复选框代表从数据库中的数据生成的 HTML 中实际返回的内容,不是之前任意用户与输入元素的交互。

如何使 Firefox 不更新我与之交互的这些复选框,使它们与新收到的 HTML 中的状态相同?

这个问题令人困惑,因为:

  1. 当我在 Firefox 中刷新页面并且复选框的选中属性在新收到的 HTML 中更新时,Firefox 将按照我的预期更新视图。

  2. 但是,如果我与复选框交互,然后刷新,则不会根据新收到的 HTML 更新该复选框。

即。 checked="checked" 或 checked 属性是否不存在都没有关系,除非我执行 shift-refresh,否则 Firerfox 会保持这种状态。

我什至添加了window.onunload = function(){};,因为我认为这可能是由于 bfcache,但事实并非如此。

尝试使用以下标头,它仍然恢复了状态。

HTTP/1.1 200 OK
Date: Thu, 15 Mar 2012 21:19:02 GMT
Server: Apache/2.2.20 (Ubuntu)
Expires: 0
Pragma: no-cache
Cache-Control: no-cache, no-store, must-revalidate
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html;charset=ISO-8859-1

尝试循环遍历元素,尽管在源 html 中不存在已检查的属性,JavaScript 认为已检查的属性是“已检查”,因此在 Firefox 恢复后无法从接收的源中恢复值之前输入的值。

反之亦然...消息来源说checked="checked",而onload JavaScript 认为已检查undefined

第一个复选框状态警报的来源。

window.onload = function() {   
    $('input[type="checkbox"]').each(function() {
        alert($(this).attr('checked'));
        return false
    });
}

【问题讨论】:

  • 这是 Firefox 的故意行为。通常,当您与表单交互然后刷新页面时,它会恢复您输入的所有内容。 (它在恢复会话时做同样的事情。当您在文本区域中输入几段文本时,这特别好,然后出于任何原因必须重新启动计算机。)但是,呃。 . .你的问题到底是什么?
  • @ruakh haha​​,我在重读我的问题后才更新,并意识到没有实际问题:)
  • 您需要从服务器发送标头,指示浏览器不要缓存页面。
  • @Interstellar_Coder 我不相信该页面正在被缓存。页面上的 HTML 已刷新(达到应有的状态)并且服务器给出 200 响应。我相信 ruakh 走在正确的轨道上,因为 Firefox 似乎正在恢复输入的信息。但是,如果你知道哪些标题,我一定会试一试。
  • 如果您要使用 JS 将所​​有内容恢复为默认信息会怎样。我不是要推广这个想法,但这应该会强制 FF 存储的任何信息重置为默认值。

标签: html firefox


【解决方案1】:

document.formname.reset() 工作,这似乎从 HTML 的原始状态恢复。这是我尝试过的唯一有效的方法...

感谢 Dennis 为类似问题发布此答案。 Firefox: How to reload form *without* caching user-input?

此解决方案的唯一问题是我不需要表单,也没有使用表单或提交表单等。我正在使用这些复选框来创建一个似乎完全有效的用户界面案例,但为了让它工作,我需要将我的所有输入与一个表单相关联。

【讨论】:

  • 严格来说<input> 元素在<form> 元素之外无效,因此您必须将它们与表单相关联才能获得预期的行为;)跨度>
  • @Kolink "用于创建控件的元素通常出现在 FORM 元素内,但在用于构建用户界面时也可能出现在 FORM 元素声明之外。这将在第内在事件。请注意,表单外的控件不能是成功的控件。” - 该声明不再有效吗?
猜你喜欢
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多