为什么 Firefox 不显示正确的默认选择选项?

我正在开发一个网络应用程序来管理产品 SKUS。其中一部分是将 SKU 与产品名称相关联。在表的每一行上,我列出一个 SKU 并显示一个包含产品名称的 <select>框。当前与数据库中的 SKU 相关联的产品被赋予一个类似于 selected="selected"的属性。这可以通过 AJAX 进行更改和更新。

有一个 很多的产品 <option>s-103是准确的-这个名单是重复的 <select>在每一行。

在页面的另一个输入中,我使用 jQuery AJAX 请求来添加新的 SKU/产品关联,为了清楚地表明它们是即时添加的,我将它们插入到表的 头儿中,并使用了一点高亮效果。随着 SKU 数量增加到10个左右,如果我刷新页面(从按产品名称排序的数据库中加载所有内容) ,Firefox 开始显示一些默认选择的错误选项。关于显示的是哪个不正确的选项并不一致,但是它似乎混淆了页面重新加载之前存在的选项。

如果我使用 Firebug 检查 <select>,那么 select="selected"在正确的 <option>标记上。刷新页面(或者离开并键入该页面的 URL 返回)不会使其正确显示,但是会显示 硬刷新(Ctrl + F5)

首先,Chrome 和 IE7都正确地显示了这一点。

我的理论是这是 Firefox 缓存策略错误的结果。听起来对吗?有没有什么方法可以让我在代码中说“如果这个页面被刷新了,就让它成为一个难以刷新的页面——从头开始重新加载所有内容?”

更新

为了解决这个问题,我改变了策略。

  • 以前,我在每个表行上放置了一个 <select>,其中包含一个长长的 <option>列表,并将当前值设置为缺省值
  • 现在,我将当前值放入 <span>中。如果用户单击“ change”按钮,我将 <span>替换为 <select>,而“ change”按钮将变成“ sure”按钮。如果他们改变选项并点击确认,AJAX 会更新数据库,而且 <select>会回到 <span>,这次是新的值。

这有两个好处:

  • 它修复了上面描述的错误
  • 它需要页面上的 很远较少的 DOM 元素(所有那些冗余的 <option>)
53935 次浏览

Firebug 有一个适用于这种情况的缓存禁用函数。

更深层次的长期解决方案是找出如何设置无缓存头服务器端?

每次我在 Firefox 中遇到奇怪的选择选项 bug,都是因为我有多个选项被标记为选中。你确定只有一个是这样标记的吗?看起来,如果您使用 AJAX 来改变这一点,那么您可以很容易地摆脱困境。

Firefox 在刷新时会保留所选的表单元素。这是有意为之的。 Ctrl + F5是一个“硬”刷新,禁用此行为。

--

如果你在 Mac 上,也可以使用 Command + Shift + R

我想明白了。如果你把 onunload 或 $(窗口)。卸载(jquery)在你的 HTML 无缓存头,火狐重新加载页面和初始化 DOM,甚至从后退按钮。

防止 Firefox 缓存最后选择的选项的一个简单方法是删除页面卸载时的所有选项元素。例如(假设是 jQuery) :

$(window).unload(function() {
$('select option').remove();
});

我也遇到过类似的问题,但是在将 autocomplete="off" HTML 属性添加到每个 select 标记之后,它工作了。[我用的是 Firefox 8]

为了阻止 Firefox 在页面重新加载后恢复先前选择的选项,您可以将包含 <select>选项的整个 <form>放在 <iframe>中。

当选择框位于 <iframe>中并重新加载容器页面时,Firefox 最终的行为与所有其他浏览器一样,只需重置选择选项。

我也有同样的问题。我试图根据选择 = “ select”的选项更改 select 的值,但 Firefox 不能工作。它总是默认为第一个选项。

Chrome 浏览器、 Safari 浏览器等在我这么做的时候起作用了:

$( 'option[value="myVal"]' ).attr( 'selected', 'selected' );

但这在 FF 里不管用。

所以我试着:

$( 'option[value="myVal"]' ).prop( 'selected', 'selected' );

而且成功了。

JQuery v1.9.1

我通过在隐藏的输入上加上 autocomplete = “ off”来使它工作。

虽然这是个老问题,但下面的解决方案可以帮助到某人

在 firefox 中,我已经注意到,除非您将 选择放在 表格中(其中的 Form 有一个 name 属性) ,否则“ select”属性将无法工作。

<form name="test_form" method="POST">
<select name="city">
<option value="1">Test</option>
<option selected="selected" value="2">Test2</option>
</selecct>

再次记住:

  1. 表单必须具有“ 姓名”属性和
  2. 选择”必须在表格内。

感谢@BananaDeveloper (https://stackoverflow.com/a/8258154/2182349)——这是我在应用程序的单个页面上解决这个问题的解决方案

我不想定制现成的/开源的应用程序代码

<Files "page_that_does_not_work.php">
SetOutputFilter INFLATE;SUBSTITUTE;DEFLATE
Substitute 's/<select/<select autocomplete="off"/n'
Substitute 's/<form/<form novalidate/n'
</Files>

用于 mod_substitute https://httpd.apache.org/docs/2.4/mod/mod_substitute.html的 Apache 文档

感谢: https://serverfault.com/questions/843905/apache-mod-substitute-works-in-curl-but-not-on-browserSetOutputFilter

替换 jQuery

.attr('selected', true)

.prop('selected', true)

对于 <option>标签为我修复它。所有其他的解决方案不工作