Ошибка с Firefox - отключенный атрибут ввода не сбрасывается при обновлении

103

Я обнаружил то, что считаю ошибкой в ​​Firefox, и мне интересно, действительно ли это ошибка, а также какие-либо обходные пути для этого.

Если вы создаете базовую веб-страницу со следующим источником:

<html>
  <head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
  </head>
  <body>
    <div>
      <input id="txtTest" type="text" />
      <input type="button" onclick="$('#txtTest').attr('disabled','disabled');" value="Set Disabled (jQuery)" />
      <input type="button" onclick="document.getElementById('txtTest').disabled = true;" value="Set Disabled (js)" />
      <input type="button" onclick="$('#txtTest').removeAttr('disabled');" value="Remove Disabled" />
    </div>
  </body>
</html>

Если вы disableвыполняете textboxдинамическое обновление, а затем обновляете страницу, textboxон останется отключенным, а не вернется в исходное состояние - не отключен. Я пробовал это в IE8 и Chrome, и они ведут себя так, как я ожидал, сбрасывая textboxназад, чтобы не отключать, когда я обновляюсь.

Еще одна интересная информация заключается в том, что он по-прежнему делает то же самое, если на входе checkboxвместо textbox.

Стивен Меса
источник
2
Вы уверены, что это не просто функция Firefox, которая запоминает состояние inputэлементов при простом обновлении?
30dot
@thirtydot: Мне тоже это было интересно, поэтому я также попытался поэкспериментировать с динамической установкой атрибута «размер», и он сбрасывается при обновлении, как и все другие браузеры. Похоже, что до сих пор я обнаружил, что Firefox сохранит атрибут disabled, а также фактическое значение ввода, но не размер ...
Стивен Меса
5
Вау, ты прав! Я установил autocomplete = "off" на входе, и этого больше не происходит. Довольно неудобно, что firefox включает это по умолчанию!
Стивен Меса
3
Да, я забыл, что вы можете отключить его с помощью autocomplete="off". Этот пост в блоге мне знаком, так что я определенно сталкивался с этим раньше. Вы должны написать ответ на свой вопрос (или я должен?)
30
1
Об этом есть открытый отчет об ошибке Mozilla: bugzilla.mozilla.org/show_bug.cgi?id=654072
cvrebert

Ответы:

126

Это «функция» Firefox, которая запоминает входные значения формы при обновлении страницы. Чтобы исправить это поведение, вы просто устанавливаете autocomplete="off"форму, содержащую входные данные, или просто прямо на вход.

Это останавливает работу автозаполнения и не позволяет браузеру запоминать состояние полей ввода.

Кроме того, вы можете просто «полностью обновить», нажав CTRL + F5. Это полностью сбросит текущую страницу.

Стивен Меса
источник
4
Я просто столкнулся с этой проблемой, когда пользователь нажимает кнопку возврата, похоже autocomplete="off", в этом случае не работает.
solarc
1
Мне не нужна форма, у меня всего одна кнопка, и Firefox «помнит», что она отключена .. раздражает. Я могу сбросить его через JS, но ... неприятно.
vsync
@vsync Попробуйте установить его на кнопку / элемент ввода. Тоже должно работать!
Henrik Heimbuerger 09
4
Это даже нужно делать на кнопках. Мне трудно поверить, что это функция, а не ошибка?
Liam
1
это также влияет на скрытые вводы
Лиам
10

Чтобы разобраться с кнопкой возврата, сделайте это ( отсюда )

    window.addEventListener('pageshow', PageShowHandler, false);
    window.addEventListener('unload', UnloadHandler, false);

    function PageShowHandler() {
        window.addEventListener('unload', UnloadHandler, false);
    }

    function UnloadHandler() {
        //enable button here
        window.removeEventListener('unload', UnloadHandler, false);
    }
Джошуа Фокс
источник
Я не знаю, почему в этом ответе только один голос, а в другом - 99. Восстановление отключенного состояния при выгрузке лучше, чем отключение автозаполнения, поскольку автозаполнение является желательной функцией.
Ник
Я думаю, что //enable button hereздесь это излишне; Насколько я понимаю, упомянутые документы заключаются в том, что простое присутствие прослушивателя событий не позволит сохранить страницу в BFcache.
myf
Обратите внимание, что добавление обработчика выгрузки имеет и другие побочные эффекты в Firefox: developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/1.5/…
robocat
2

Как упоминалось ранее, вам нужно добавить autocomplete="off"к своим кнопкам.

Вот фрагмент sh+ perlдля автоматизации этого в случае <button>s в ваших файлах / шаблонах HTML (при некоторых предположениях):

find /path/to/html/templates -type f -name '*.html' -exec perl -pi -e \
  's/(?<=<button )(.*?)(?=>)/@{[(index($1,"autocomplete=")!=-1?"$1":"$1 autocomplete=\"off\"")]}/g' \
  {} +

Предположения таковы:

  • Открывающие <button>теги начинаются и заканчиваются на одной строке. Если это не так (например, они могут быть разделены на несколько строк), тогда замена /gна /gsдолжна помочь ( sмодификатор также приводит .к совпадению символов новой строки)

  • Допустимый HTML (например, нет смешных символов между <и >) и нет неэкранированных символов больше чем ( >) внутри открывающего тега.

phk
источник
0

Это действительно открытая ошибка в Firefox. В MDNautocomplete также есть примечание : (прокрутите вниз до второго желтого поля):

Примечание: autocompleteатрибут также определяет , будет ли Firefox будет - в отличие от других браузеров - сохраняющиеся динамическое отключенное состояние и (если применимо) динамический checkedness в качестве <input>элемента, <textarea>элемента или всей <form>всей страницы нагрузок. По умолчанию функция сохранения включена. Установка значения autocompleteатрибута наoff отключает эту функцию. Это работает, даже если атрибут автозаполнения обычно не применяется в силу его типа. См. Ошибку 654072 .

Если вы используете Bootstrap, вас может заинтересовать

ул.
источник