【发布时间】:2012-04-01 09:31:45
【问题描述】:
我有一个包含多个复选框的页面,这些复选框需要表示数据库中的状态。复选框是Ajax驱动,因此当检查一个时,请求将发送到数据库中的更新状态。如果他们的视图过时,受影响/相关复选框的视图会更新,并通知用户,并且必须重试。当我刷新时,我希望复选框代表从数据库中的数据生成的 HTML 中实际返回的内容,不是之前任意用户与输入元素的交互。
如何使 Firefox 不更新我与之交互的这些复选框,使它们与新收到的 HTML 中的状态相同?
这个问题令人困惑,因为:
当我在 Firefox 中刷新页面并且复选框的选中属性在新收到的 HTML 中更新时,Firefox 将按照我的预期更新视图。
但是,如果我与复选框交互,然后刷新,则不会根据新收到的 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 存储的任何信息重置为默认值。