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

Я нашел то, что считаю ошибкой с 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.

Ответ 1

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

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

В качестве альтернативы вы можете просто "жестко обновить", нажав CTRL + F5. Это будет полностью reset текущая страница.

Ответ 2

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

    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);
    }

Ответ 3

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

Вот фрагмент sh + perl для автоматизации этого в случае <button> в ваших 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 modifier вызывает соответствие . символам новой строки)

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