Dlaczego Firefox nie pokazuje prawidłowej domyślnej opcji wyboru?

Robię aplikację internetową do zarządzania SKU produktu. Jednym z nich jest kojarzenie jednostek SKU z nazwami produktów. W każdym wierszu tabeli wyświetlam SKU i wyświetlam pole <select> z nazwami produktów. Produkt, który jest obecnie powiązany z danym SKU w bazie danych, otrzymuje atrybut selected="selected". Można to zmienić i zaktualizować za pomocą AJAX.

Istnieje partia produktu <option> s - 103, aby być dokładnym - a lista ta jest powtarzana w <select> Na każdym wiosłować.

Z innego wejścia na stronie, używam żądań jQuery AJAX, aby dodać nowe skojarzenia SKU/produktów, i aby było jasne, że są one dodawane natychmiast, wstawiam je do top tabeli z małym efektem podświetlenia. Ponieważ liczba SKU zwiększa się ponad 10 lub tak, jeśli odświeżę stronę (która ładuje wszystko z powrotem z bazy danych uporządkowane według nazwy produktu), Firefox zaczyna wyświetlać niektóre złe opcje wybrane domyślnie. Nie jest spójne, co do którego pokazuje nieprawidłową opcję, ale wydaje się, że miesza opcje, które istniały przed przeładowaniem strony.

Jeśli sprawdzam <select> używając Firebug, select="selected" jest na prawidłowym znaczniku <option>. Odświeżenie strony (lub pozostawienie i wpisanie adresu URL tej strony z powrotem do powrotu) nie powoduje, że wyświetla się poprawnie, ale twarde odświeżenie (Ctrl+F5) robi.

Zarówno Chrome, jak i IE7 wyświetlają to poprawnie.

Moja teoria jest taka, że jest to wynik wadliwego cache strategia Firefoksa. Czy to brzmi dobrze? Czy jest jakiś sposób, żebym mógł powiedzieć w moim kodzie "jeśli ta strona jest odświeżona, zrób to twarde odświeżanie-przeładuj wszystko od zera?"

Update

Aby rozwiązać ten problem, zmieniłem strategie.

  • poprzednio umieszczałem <select> z długą listą <option>s na każdym wierszu tabeli, z bieżącą wartością ustawioną jako domyślną
  • teraz wpisuję aktualną wartość <span>. Jeśli użytkownik kliknie przycisk "Zmień", zamieniam <span> na <select>, a przycisk" Zmień "staje się przyciskiem "potwierdź". Jeśli zmienią opcje i klikną potwierdź, AJAX zaktualizuje bazę danych, a <select> powróci do <span>, tym razem z nową wartością.

Ma to dwie zalety:

  • naprawia błąd opisany powyżej
  • wymaga daleko mniej elementów DOM na stronie (wszystkie te zbędne <option>S)
Author: Community, 2009-09-25

11 answers

Firefox zachowuje wybrane elementy formularza podczas odświeżania. To celowe. Ctrl + F5 jest "twardym" odświeżaniem, które wyłącza to zachowanie.

--

Lub Command+Shift + R jeśli jesteś na Macu

 48
Author: Ted Mielczarek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-02 23:34:06

Miałem podobny problem, ale po dodaniu atrybutu autocomplete="off" HTML do każdego znacznika select zadziałał. [Używałem Firefoksa 8]

 112
Author: BananaDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-24 15:01:33

Łatwy sposób, aby zapobiec buforowaniu Firefoksa przez ostatnią wybraną opcję, polega na usunięciu wszystkich elementów opcji na stronie rozładuj. Na przykład (zakładając jQuery):

$(window).unload(function() {
  $('select option').remove();
});
 15
Author: ozu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-09 00:05:08

Miałem ten sam problem. Próbowałem zmienić wartość select w zależności od opcji selected= "selected", ale Firefox nie działał. Zawsze domyślna jest pierwsza opcja.

Chrome, Safari, itp działało kiedy to robiłem:

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

... ale to nie działało w FF.

Więc próbowałem:

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

JQuery v1.9. 1

 12
Author: clint_milner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-15 04:10:13

Sprawiłem, że działało, umieszczając autocomplete= " off " na ukrytym wejściu.

 7
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 07:35:46

Chociaż to stare pytanie, ale poniżej rozwiązanie może komuś pomóc

W Firefoksie zauważyłem, że atrybut "selected" nie będzie działał, jeśli nie umieścisz select wewnątrz formularza, Gdzie formularz ma atrybut name.

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

Ponownie zapamiętaj:

  1. formularz musi posiadać atrybut" name" oraz
  2. "select " musi znajdować się wewnątrz formularza.
 7
Author: Rakesh Soni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-06 10:07:18

Firebug ma funkcję wyłączania pamięci podręcznej dla dokładnie tego scenariusza.

Głębszym rozwiązaniem długoterminowym jest ustalenie, jak ustawić nagłówki bez pamięci podręcznej po stronie serwera. Z jakiego serwera www korzystasz?

 0
Author: lod3n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 19:56:25

Za każdym razem, gdy miałem dziwne błędy opcji select w Firefoksie, to dlatego, że miałem wiele opcji zaznaczonych jako wybrane. Czy jesteś pewien, że tylko jeden jest oznaczony jako taki? Wydaje się, że można wydostać się z wack dość łatwo, jeśli zmieniasz to z AJAX.

 0
Author: Morinar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 20:58:04

FYI: aby powstrzymać Firefoksa przed przywróceniem wcześniej wybranej opcji po przeładowaniu strony, możesz umieścić cały <form> zawierający opcje <select> wewnątrz <iframe>.

Gdy pola wyboru są w <iframe> i przeładowujesz stronę kontenera, Firefox w końcu zachowuje się jak wszystkie inne przeglądarki, po prostu resetując opcje select.

 0
Author: Marco Demaio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-10 20:38:50

Dzięki @BananaDeveloper ( https://stackoverflow.com/a/8258154/2182349) - jest to moje rozwiązanie, aby rozwiązać ten problem na jednej stronie w aplikacji

Nie chciałem dostosowywać kodu aplikacji off-the-shelf / open source

<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>

Apache docs for mod_substitute https://httpd.apache.org/docs/2.4/mod/mod_substitute.html

Dzięki: https://serverfault.com/questions/843905/apache-mod-substitute-works-in-curl-but-not-on-browser{[4] na SetOutputFilter

 0
Author: user2182349,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-18 17:49:35

Rozgryzłem to. Jeśli umieścisz onunload lub $(window).rozładuj (jquery) na HTML z nagłówkiem bez pamięci podręcznej, Firefox przeładowuje stronę i inicjalizuje DOM nawet z przycisku Wstecz.

 -1
Author: Minime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 14:54:25