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


71

我正在制作一个用于管理产品SKUS的网络应用。其中一部分是将SKU与产品名称相关联。在表格的每一行上,我列出了一个SKU并显示一个<select>带有产品名称的框。当前与数据库中该SKU相关联的产品具有类似的属性selected="selected"。可以通过AJAX进行更改和更新。

很多产品<option>s-确切地说是103-并且此列表<select>在每一行中重复。

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

如果我检查<select>使用的Firebug,select="selected"则在正确的<option>标签上。刷新页面(或离开页面并输入该页面的URL以返回)并不能正确显示,但是硬刷新(Ctrl + F5)可以

Chrome和IE7都首先正确显示此内容。

我的理论是,这是Firefox错误的缓存策略的结果。听起来对吗?我有什么办法可以在代码中说“如果刷新此页面,请对其进行硬刷新-从头开始重新加载所有内容?”

更新资料

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

  • 之前,我在每个表格行中都放置了一个<select>带有<option>s的长列表,并将当前值设置为默认值
  • 现在,我将当前值放在中<span>。如果用户单击“更改”按钮,则将替换<span><select>,然后“更改”按钮变为“确认”按钮。如果他们更改选项并单击“确认”,则AJAX将更新数据库,然后使用新值<select>返回到a <span>

这有两个好处:

  • 它修复了上述错误
  • 它需要在页面上较少的DOM元素(所有这些多余<option>S)

3
如果您阅读了所有这些内容,则谢谢。我知道这很罗word。
内森·朗2009年

4
令人惊讶的是,FireFox仍然具有这种奇特的行为(所有其他浏览器都没有这种愚蠢的事情),更令人惊讶的是,FireFox开发人员认为这是一个很好的功能bugzilla.mozilla.org/show_bug.cgi?id=46845,而不只是一个令人讨厌的错误!(仍在FF版本11中)。
Marco Demaio '04年

默认情况下不应启用此行为!!应该提示用户选择加入或退出(您是否要保留表单选择或其他内容?)。这是一个用例,假设您有一个购物车,并且购物车内容在另一页上更新,然后用户刷新购物车页面。用户应该看到新的变化!
mehany

Answers:


48

刷新时,Firefox会保留您选择的表单元素。这是故意的。Ctrl + F5是“硬”刷新,它将禁用此行为。

-

或Command + Shift + R(如果您使用的是Mac)


1
我知道,这是正确的答案。但是,如何在不告诉用户按下[Ctrl] + [F5]的情况下处理它呢?奥祖的答案正确吗?
yunzen 2014年

16
-1解释了问题,但未通过添加解决方法autocomplete=off
John Magnolia

2
@JohnMagnolia自动完成不是w3c有效文件
Jose De Gouveia

112

我遇到了类似的问题,但是在将autocomplete="off"HTML属性添加到每个选择标记后,它都起作用了。[我使用的是Firefox 8]


自动完成功能不适用于w3c
Jose De Gouveia

1
我在Firefox ver 44.0(2016年1月)上遇到了相同的问题。而且此解决方案仍然有效。
史蒂文

8
@ doABarrelRoll721因为它有效!其他答案未提供解决此问题的任何非肮脏JS方式。这可以按预期工作,并且是解决此问题的最合适方法(iframe解决方案很糟糕)。而且,除非您是W3C的狂热粉丝,否则在不支持此功能的浏览器中添加此属性不会有任何问题。
vard

2
@ doABarrelRoll721:比什么更喜欢这个?jQuery hack还是玩iframe?请为我们提供更好的解决方案。
拉斐尔·斯瓦查(RafałSwacha)2016年

1
这是完全有效的HTML。它没有w3c规范规定的标准化含义,因此浏览器原则上可以自由选择例如忽略select字段上的autocomplete属性,但这不会使其无效。如果所有主流浏览器都将select元素的autocomplete =“ off”表示为“刷新后不记得上一次选择的值”,那么这是一个很好的解决方案。
混乱

15

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

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

autocomplete =“ off”在chrome中不起作用,这很有魅力。干杯!
Jimmyt1988 '16

刚刚尝试过,在FF(47.0)中这并不总是对我有用-不幸的是,我无法对其进行进一步调查。
Scolytus '16

这仅适用于将选择重新设置为页面刷新时的默认设置,不适用于使用<option selected='selected" >
Aurovrata的

12

我有同样的问题。我试图根据选择了“ selected”的选项来更改select的值,但是Firefox无法正常工作。它将始终默认为第一个选项。

Chrome,Safari等在执行此操作时有效:

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

...但是这在FF中不起作用。

所以我尝试了:

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

而且有效。

jQuery v1.9.1


7

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


这是简单而优雅的作品。应该接受答案。
kontur

6

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

在firefox中,我注意到,除非将select放置在具有name属性表单中,否则“ selected”属性将不起作用。

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

再次记住:

  1. 表单必须具有“名称”属性,并且
  2. 选择”必须在表格内。

好吧,你救了我!我不需要在表单中添加名称,autocomplete="off"但关键是要select在表单中插入form。我已经整天迷失了,因为我没有form这个选择。
罗布(Rob)

对我来说,这只有效。对于Firefox,当我为表单设置名称时,它将按预期工作。Firefox版本:54.0a2
tioschi '17

我有一个带有名称属性的表单,但是页面刷新后,我的选择仍然缓存在表单中。
Aurovrata

是! 这就是我的答案。我首先在这里看到它:stackoverflow.com/a/12650918/470749
Ryan

0

Firebug具有完全针对这种情况的缓存禁用功能。

更深层的长期解决方案是弄清楚如何在服务器端设置无缓存头。您正在使用什么Web服务器?


您可以在HTML中指定吗?
内森·朗2009年

这是小公司内部的。Web服务器是Apache,是XAMPP的一部分。它在Windows服务器上运行。
内森·朗2009年

1
这是通过在Apache的无缓存设置的详细散步:websiteoptimization.com/speed/tweak/cache
lod3n

0

每当我在Firefox中遇到怪异的选择选项错误时,都是因为我将多个选项标记为选中。您确定只有一个被标记吗?如果您要使用AJAX进行更改,似乎可以很轻松地摆脱困境。


0

仅供参考:为了防止Firefox在页面重新加载后恢复先前选择的选项,可以将<form>包含<select>选项的整个内容放在内<iframe>

当选择框是<iframe>你重装容器页面,火狐终于行为就像其他所有浏览器,通过简单地重新选择选项。


0

感谢@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>

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

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


-1

我知道了 如果在没有缓存头的HTML上放置onunload或$(window).unload(jquery),则Firefox将重新加载页面并甚至从后退按钮初始化DOM。


您能用一个适当的例子来扩展答案吗
Aurovrata
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.