Помилка з 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елементів, коли ви просто оновите?
тридцятьдо

@thirtydot: Мені теж було цікаво про це, тому я також спробував поекспериментувати з динамічним налаштуванням атрибута "size", і це зміниться після оновлення, як і всі інші браузери. Так виглядає те, що я виявив поки що, що Firefox збереже відключений атрибут, а також фактичне значення вводу, але не розмір ...
Стівен Меса

5
Нічого, ти правий! Я встановлюю autocomplete = "off" на вході, і цього більше не відбувається. Це дуже незручно, що Firefox вмикає це за замовчуванням!
Стівен Меса

3
Так, я забув, ви можете відключити його autocomplete="off". Ця публікація в блозі мені здається знайомою, тому я неодмінно стикався з цим раніше. Ви повинні написати відповідь на власне запитання (чи я повинен?)
тридцятьдо

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 Спробуйте встановити його на кнопці / вхідному елементі. Треба працювати також!
Генрік Хаймбургер

4
Ви навіть повинні це зробити на кнопках. Мені важко повірити, що це особливість, а не помилка?
Ліам

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 (наприклад, немає і смішних символів між <та >), і не розміщено в масштабі більше, ніж ( >) всередині тегу, що відкривається.


0

Це дійсно відкрита помилка у Firefox. У MDNautocomplete також є примітка : (прокрутіть до другого жовтого поля):

Примітка: autocompleteатрибут також визначає , буде чи Firefox буде - в відміну від інших браузерів - зберігаються динамічне відключене стан і (якщо є) динамічний checkedness як <input>елемента, <textarea>елемента або всієї <form>всієї сторінки навантажень. Функція стійкості включена за замовчуванням. Встановлення значення autocompleteатрибутаoff відключити цю функцію. Це працює навіть тоді, коли атрибут автозаповнення зазвичай не застосовується в силу свого типу. Дивіться про помилку 654072 .

Якщо ви використовуєте Bootstrap, можливо, вас зацікавить

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.