Есть ли W3C действительный способ отключить автозаполнение в форме HTML? - PullRequest
418 голосов
/ 24 февраля 2009

При использовании типа документа xhtml1-transitional.dtd, собирая номер кредитной карты со следующим HTML

<input type="text" id="cardNumber" name="cardNumber" autocomplete='off'/>

пометит предупреждение на валидаторе W3C:

нет атрибута "автозаполнение".

Есть ли в W3C / стандарте способ отключить автозаполнение браузера для чувствительных полей в форме?

Ответы [ 17 ]

417 голосов
/ 24 февраля 2009

Здесь - хорошая статья из MDC, которая объясняет проблемы (и решения) для формирования автозаполнения. Microsoft также опубликовала нечто подобное здесь .

Если честно, если это что-то важное для ваших пользователей, то «нарушение» стандартов таким образом представляется целесообразным. Например, Amazon довольно часто использует атрибут autocomplete, и, похоже, он работает хорошо.

Если вы хотите полностью удалить предупреждение, вы можете использовать JavaScript, чтобы применить атрибут к браузерам, которые его поддерживают (IE и Firefox являются важными браузерами), используя someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" );

Наконец, если ваш сайт использует HTTPS, IE автоматически отключает автозаполнение (насколько я знаю, как и в некоторых других браузерах).

Обновление

Поскольку этот ответ по-прежнему вызывает немало голосов, я просто хотел отметить, что в HTML5 вы можете использовать атрибут autocomplete для элемента формы. См. Документацию на W3C.

63 голосов
/ 24 февраля 2009

Я был бы очень удивлен, если бы W3C предложил способ, который будет работать с (X) HTML4. Функция автозаполнения полностью основана на браузере и была представлена ​​в течение последних лет (задолго до того, как был написан стандарт HTML4).

Не удивлюсь, если у HTML5 будет такой.

Редактировать: Как я и думал, HTML5 имеет эту функцию . Чтобы определить свою страницу как HTML5, используйте следующий тип документа (то есть: поместите это как самый первый текст в вашем исходном коде). Обратите внимание, что не все браузеры поддерживают этот стандарт, так как он все еще в черновом варианте.

<!DOCTYPE html>
56 голосов
/ 24 февраля 2009

HTML 4 : Нет

HTML 5 : Да

Атрибут автозаполнения является перечисляемым атрибутом. Атрибут имеет два состояния. Ключевое слово on отображается во включенное состояние, а off ключевые слова отображаются в выключенном состоянии. Атрибут также может быть опущен. Отсутствующее значение по умолчанию - состояние on . Состояние off указывает на то, что по умолчанию элементы управления формы в форме будут иметь имя поля автозаполнения установить на выкл ; включенное состояние указывает, что по умолчанию элементы управления формой в форма будет иметь autofill имя поля, установленное на «вкл».

Ссылка: W3

32 голосов
/ 24 февраля 2009

Нет, но автозаполнение браузера часто вызывается полем, имеющим тот же атрибут name, что и поля, которые были ранее заполнены. Если бы вы могли найти умный способ получить рандомизированное имя поля , автозаполнение не сможет получить ранее введенные значения для поля.

Если вы зададите для поля ввода имя типа "email_<?= randomNumber() ?>", а затем получите скрипт, который получает этот цикл данных через переменные POST или GET, ища что-то, совпадающее с шаблоном "email_[some number]", вы могли бы осуществите это, и это будет (практически) гарантировано, независимо от браузера .

31 голосов
/ 24 февраля 2009

Нет, хорошая статья здесь, в Mozila Wiki .

Я бы продолжил использовать недействительное attribute. Я думаю, что именно здесь прагматизм должен победить проверку.

23 голосов
/ 24 февраля 2009

Как насчет настройки с помощью JavaScript?

var e = document.getElementById('cardNumber');
e.autocomplete = 'off'; // Maybe should be false

Это не идеально, но ваш HTML будет действительным.

19 голосов
/ 08 сентября 2010

Я предлагаю перехватить все 4 типа ввода:

$('form,input,select,textarea').attr("autocomplete", "off");

Справка:

11 голосов
/ 10 августа 2010

Если вы используете jQuery, вы можете сделать что-то вроде этого:

$(document).ready(function(){$("input.autocompleteOff").attr("autocomplete","off");});

и используйте класс autocompleteOff, где вы хотите:

<input type="text" name="fieldName" id="fieldId" class="firstCSSClass otherCSSClass autocompleteOff" />

Если вы хотите, чтобы ВСЕ входные данные были autocomplete=off, вы можете просто использовать это:

$(document).ready(function(){$("input").attr("autocomplete","off");});
8 голосов
/ 12 июля 2014

autocomplete="off" это должно решить проблему для всех современных браузеров.

<form name="form1" id="form1" method="post" autocomplete="off"
   action="http://www.example.com/form.cgi">
  [...]
</form>

В текущих версиях браузеров Gecko атрибут autocomplete работает отлично. В более ранних версиях, начиная с Netscape 6.2, он работал с исключением форм с «Адрес» и «Имя»

Обновление

В некоторых случаях браузер будет продолжать предлагать значения автозаполнения, даже если атрибут автозаполнения отключен. Такое неожиданное поведение может быть довольно загадочным для разработчиков. Хитрость для принудительного принудительного запрета автозаполнения состоит в том, чтобы присвоить случайную строку атрибуту , например:

autocomplete="nope"

Поскольку это случайное значение не равно valid one, браузер сдается.

Documetation

8 голосов
/ 15 мая 2012

Другой способ - который также поможет с безопасностью - каждый раз, когда вы его отображаете, вызывать поле ввода как-то по-другому: как капту. Таким образом, сеанс может читать только одноразовый ввод, и автозаполнению больше нечего делать.

Просто вопрос о том, стоит ли вмешиваться в работу браузера: мы разрабатываем системы управления контактами и CRM, а когда вы вводите данные других людей в форму, вы не хотите, чтобы они постоянно предлагали свои данные .

Это работает для наших нужд, но тогда мы можем позволить пользователям получить хороший браузер:)

autocomplete='off' 
...