Что ж, немного опоздал на вечеринку, но кажется, что есть некоторое недопонимание о том, как autocomplete
должно и не должно работать. Согласно спецификациям HTML, пользовательский агент (в данном случае Chrome) может переопределить autocomplete
:
https://www.w3.org/TR/html5/forms.html#autofilling-form-controls:-the-autocomplete-attribute
Пользовательский агент может позволить пользователю переопределить имя поля автозаполнения элемента, например, изменить его с «выкл» на «вкл», чтобы значения могли быть запомнены и предварительно заполнены, несмотря на возражения автора страницы, или всегда «выключен», никогда не запоминая ценности. Однако пользовательские агенты не должны позволять пользователям тривиально переопределять имя поля автозаполнения с «выключено» на «включено» или другими значениями, поскольку для пользователя существует значительный риск для безопасности, если все значения всегда запоминаются независимо от предпочтений сайта.
Так что в случае с Chrome разработчики, по сути, сказали: «Мы оставим это на усмотрение пользователя, чтобы решить в своих предпочтениях, хотят ли они autocomplete
работать или нет. Если вы этого не хотите, не включайте его в своем браузере» ,
Тем не менее, кажется, что это немного чрезмерно с их стороны, на мой взгляд, но так оно и есть. В спецификации также обсуждаются потенциальные последствия такого шага для безопасности:
Ключевое слово «off» указывает либо на то, что входные данные элемента управления особенно чувствительны (например, код активации для ядерного оружия); или что это значение никогда не будет использоваться повторно (например, одноразовый ключ для банковского логина), и поэтому пользователю придется каждый раз явно вводить данные, вместо того, чтобы полагаться на UA для предварительного заполнения ценность для него; или что документ предоставляет собственный механизм автозаполнения и не хочет, чтобы пользовательский агент предоставлял значения автозаполнения.
Поэтому, испытав такое же разочарование, как и все остальные, я нашел решение, которое работает для меня. Это похоже в духе autocomplete="false"
ответов.
Статья в Mozilla говорит именно об этой проблеме:
https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion
В некоторых случаях браузер будет продолжать предлагать значения автозаполнения, даже если атрибут автозаполнения отключен. Такое неожиданное поведение может быть довольно загадочным для разработчиков. Хитрость в том, чтобы действительно принудительно завершить запрос, состоит в том, чтобы назначить случайную строку атрибуту
Таким образом, следующий код должен работать:
autocomplete="nope"
И так должен каждый из следующих:
autocomplete="false"
autocomplete="foo"
autocomplete="bar"
Проблема, которую я вижу, заключается в том, что агент браузера может быть достаточно умен, чтобы изучить autocomplete
атрибут и применить его в следующий раз, когда увидит форму. Если это произойдет, то единственный способ обойти проблему - это динамически изменитьautocomplete
значения атрибута при создании страницы.
Стоит отметить, что многие браузеры игнорируют autocomplete
настройки для полей входа в систему (имя пользователя и пароль). Как говорится в статье Mozilla:
По этой причине многие современные браузеры не поддерживают autocomplete = "off" для полей входа в систему.
- Если сайт устанавливает для формы autocomplete = "off", а форма содержит поля ввода имени пользователя и пароля, браузер по-прежнему будет предлагать запомнить этот логин, а если пользователь соглашается, браузер автоматически заполняет эти поля в следующий раз, когда пользователь заходит на эту страницу.
- Если сайт устанавливает autocomplete = "off" для полей ввода имени пользователя и пароля, браузер все равно предложит запомнить этот логин, и, если пользователь согласится, браузер автоматически заполнит эти поля при следующем посещении этой страницы пользователем.
Это поведение в Firefox (начиная с версии 38), Google Chrome (начиная с 34) и Internet Explorer (начиная с версии 11).
Наконец, небольшая информация о том, принадлежит ли атрибут form
элементу или input
элементу. Спецификация снова имеет ответ:
Если атрибут autocomplete опущен, вместо него используется значение по умолчанию, соответствующее состоянию атрибута autocomplete владельца формы элемента («on» или «off»). Если владельца формы нет, то используется значение «on».
Так. Помещение в форму должно применяться ко всем полям ввода. Помещение его в отдельный элемент должно применяться только к этому элементу (даже если его нет в форме). Если autocomplete
не установлен вообще, по умолчанию on
.
Резюме
Чтобы отключить autocomplete
всю форму:
<form autocomplete="off" ...>
Или, если вам нужно сделать это динамически:
<form autocomplete="random-string" ...>
Отключить autocomplete
для отдельного элемента (независимо от того, присутствует или нет параметр формы)
<input autocomplete="off" ...>
Или, если вам нужно сделать это динамически:
<input autocomplete="random-string" ...>
И помните, что определенные пользовательские агенты могут отвергать даже ваши самые упорные попытки отключить autocomplete
.