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

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

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

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

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

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

Ответ 1

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

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

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

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

Обновление

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

Ответ 2

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

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

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

<!DOCTYPE html>

Ответ 3

HTML 4: Нет

HTML 5: Да

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

Ссылка: W3

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 8

Если вы используете 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");});

Ответ 9

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

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

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

autocomplete='off' 

Ответ 10

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

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

В текущих версиях браузеров Gecko атрибут автозаполнения работает отлично. Для более ранних версий, возвращаясь к Netscape 6.2, он работал с исключением для форм с "Адрес" и "Имя"

Обновление

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

autocomplete="nope"

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

Documetation

Ответ 11

Использование случайного атрибута "name" работает для меня.

I reset атрибут name при отправке формы, чтобы вы могли получить к нему доступ по имени при отправке формы. (используя атрибут id для хранения имени)

Ответ 12

Обратите внимание, что есть некоторая путаница в отношении расположения атрибута автозаполнения. Он может применяться либо ко всему тегу FORM, либо к отдельным тегам INPUT, и это не было стандартизировано до HTML5 (это явно разрешает оба расположения). Старые документы, особенно в этой статье Mozilla, упоминают только тег FORM. В то же время некоторые сканеры безопасности будут искать только автозаполнение в теге INPUT и жаловаться, если он отсутствует (даже если он находится в родительской ФОРМЕ). Более подробный анализ этого беспорядка публикуется здесь: Путаница над атрибутами AUTOCOMPLETE = OFF в форматах HTML.

Ответ 13

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

Не уверен, что это сработает или нет, это была просто мысль.

Ответ 14

Я думаю, что есть более простой способ. Создайте скрытый ввод со случайным именем (через javascript) и установите для него имя пользователя. Повторите это с паролем. Таким образом, ваш бэкэнд script точно знает, что такое соответствующее имя поля, сохраняя автозаполнение в темноте.

Возможно, я ошибаюсь, но это просто идея.

Ответ 15

if (document.getElementsByTagName) {

    var inputElements = document.getElementsByTagName("input");

    for (i=0; inputElements[i]; i++) {

        if (inputElements[i].className && (inputElements[i].className.indexOf("disableAutoComplete") != -1)) {

            inputElements[i].setAttribute("autocomplete","off");

        }

    }

}

Ответ 16

Действительный автозавершение

<script type="text/javascript">
    /* <![CDATA[ */
    document.write('<input type="text" id="cardNumber" name="cardNumber" autocom'+'plete="off"/>');
    /* ]]> */ 
</script>