Как отключить автозаполнение браузера в поле веб-формы / теге ввода?


2794

Как отключить autocompleteв основных браузерах для конкретного input(или form field)?


2
В некоторых системах, где тестировщикам приходится вручную вводить много информации снова и снова, может быть полезно иметь параметр, который можно настраивать, чтобы при тестировании вы могли отключить его и просто нажать «tab> стрелка вниз> tab> стрелка вниз и т. Д.». . '
Simon_Weaver

Ответы:


2626

Firefox 30 игнорирует autocomplete="off"пароли, предпочитая вместо этого запрашивать у пользователя, должен ли пароль храниться на клиенте. Обратите внимание на следующий комментарий от 5 мая 2014 года:

  • Менеджер паролей всегда запрашивает, хочет ли он сохранить пароль. Пароли не сохраняются без разрешения пользователя.
  • Мы третий браузер, который внедрил это изменение после IE и Chrome.

Согласно документации Mozilla Developer Network , логический атрибут элемента autocompleteформы предотвращает кэширование данных формы в старых браузерах.

<input type="text" name="foo" autocomplete="off" />

45
Это не сработало для меня в Firefox 3.0.3. Мне пришлось поместить атрибут автозаполнения в FORM, а не в INPUT.
Уинстон Фассетт

17
Автозаполнение определено только в стандартах HTML 5, поэтому оно нарушит все проверки, которые вы выполняете для HTML 4. * ...
Jrgns

96
@ Уинстон, вы должны поместить его как в форму, так и в сам элемент ввода. Таким образом вы охватите всю нестандартность браузеров.
AviD

83
И не забудьте отключить расширение autocomplete = on (если вы используете Chrome) перед тестированием веб-приложения. Иначе ты будешь чувствовать себя очень глупо, как я. ;)
Джо Лисс


314

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

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


10
Это гораздо лучшее решение по сравнению с использованием autocomplete = "off". Все, что вам нужно сделать, это сгенерировать новое имя при каждой загрузке страницы и сохранить это имя в $ _SESSION для будущего использования:$_SESSION['codefield_name'] = md5(uniqid('auth', true));
enchance

79
Нет, это не лучшее решение, потому что источником предпочтения для этого параметра является пользовательский агент, также известный как веб-браузер. Существует разница между поддержкой определенного поведения (которое пытается сделать HTML 5) и его принудительным выбором, принимая решение от имени пользователя, что, по вашему мнению, является «гораздо лучшим решением».
атп

15
Это решение может работать со всеми браузерами, поэтому в этом отношении оно «лучше». Тем не менее, amn правильно, решение отключить автозаполнение от имени ваших пользователей не очень хорошая идея. Это означает, что я отключаю автозаполнение только в очень специфических ситуациях, например, когда вы планируете создать свою собственную функцию автозаполнения и не хотите конфликтов или странного поведения.
macguru2000

8
Что касается XSRF-атак, я не уверен, какой тип атаки вы представляли, но разве злоумышленник не может просто снять конечную часть так же, как вы делаете на стороне сервера для идентификации полей? Или, если злоумышленник публикует поля, он не может добавить свою собственную случайную строку, поскольку она будет удалена сервером?
xr280xr

9
@ macguru2000 создание собственного автозаполнения является вполне законным и распространенным вариантом использования. Действительно, браузер должен облегчить разработчикам отключение автозаполнения, когда им нужно, вместо того, чтобы заставлять нас использовать подобные хаки
whoadave

235

Большинство основных браузеров и менеджеров паролей (правильно, ИМХО) сейчас игнорируют autocomplete=off.

Почему? Многие банки и другие веб-сайты с высоким уровнем безопасности добавляются autocomplete=offна свои страницы входа «в целях безопасности», но это на самом деле снижает безопасность, так как люди автоматически меняют пароли на этих сайтах с высоким уровнем безопасности, чтобы их было легко запомнить (и, таким образом, взломать) после автозаполнения. был разбит.

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

К сожалению, ошибки в реализациях автозаполнения вставляют информацию об имени пользователя и / или пароле в неподходящие поля формы, вызывая ошибки проверки формы или, что еще хуже, случайно вставляя имена пользователей в поля, которые пользователь намеренно оставил пустыми.

Что делать веб-разработчику?

  • Если вы можете сохранить все поля пароля на странице сами по себе, это отличное начало, так как кажется, что наличие поля пароля является основным триггером для срабатывания автозаполнения пользователя / пароля. В противном случае прочтите советы ниже.
  • Safari замечает, что есть 2 поля пароля, и в этом случае отключает автозаполнение, предполагая, что это должна быть форма смены пароля, а не форма входа. Поэтому обязательно используйте 2 поля пароля (новый и подтвердите новый) для любых форм, в которых вы разрешаете
  • К сожалению, Chrome 34 будет пытаться автоматически заполнять поля с помощью user / pass всякий раз, когда видит поле пароля. Это довольно плохая ошибка, которая, надеюсь, изменит поведение Safari. Однако добавление этого в верхнюю часть формы отключает автозаполнение пароля:

    <input type="text" style="display:none">
    <input type="password" style="display:none">

Я еще не исследовал IE или Firefox полностью, но буду рад обновить ответ, если у других есть информация в комментариях.


5
что вы подразумеваете под «добавление этого на вашу страницу, кажется, отключает автозаполнение для страницы:»
wutzebaer

5
@wutzebaer, Chrome замечает скрытое поле пароля и останавливает автозаполнение. Как сообщается, это предотвращает кражу паролем информации без уведомления пользователя.
Дэвид W

6
Ваш фрагмент кода предотвращает автозаполнение для полей входа в Chrome, Firefox, IE 8 и IE 10. Не тестировал IE 11. Хорошие вещи! Единственный простой ответ, который все еще работает.
Сэм Уоткинс

3
Кажется, ваша заметка о сафари работает и в Chrome, по крайней мере, по состоянию на декабрь 2015 года. У меня было поле имени пользователя и пароля в форме регистрации, которая автоматически заполнялась данными из формы входа. Создание двух type='password'полей на одной странице приводило к тому, что в браузере игнорировалось автозаполнение «сохранить пароль», что имело смысл, поскольку регистрационные формы, как правило, запрашивают пароль дважды, когда формы входа запрашивают его только один раз.
Мэтт Флетчер

3
Кажется, больше не работает в Chrome 55, если только поле дополнительного пароля не скрыто, что противоречит цели.
Jokkedk

160

Иногда даже автозаполнения = выкл бы не допустить , чтобы заполнить учетные данные в неправильных полях, но не является пользователем или поле ник.

Этот обходной путь является дополнением к сообщению apinstein о поведении браузера.

Исправить автозаполнение браузера только для чтения и установить запись на фокус (нажмите и вкладка)

 <input type="password" readonly  
     onfocus="this.removeAttribute('readonly');"/>

Обновление: Mobile Safari устанавливает курсор в поле, но не отображает виртуальную клавиатуру. Новое исправление работает, как и раньше, но обрабатывает виртуальную клавиатуру:

<input id="email" readonly type="email" onfocus="if (this.hasAttribute('readonly')) {
    this.removeAttribute('readonly');
    // fix for mobile safari to show virtual keyboard
    this.blur();    this.focus();  }" />

Демонстрационная версия https://jsfiddle.net/danielsuess/n0scguv6/

// UpdateEnd

Потому что браузер автоматически вводит учетные данные в неправильное текстовое поле !?

Я замечаю это странное поведение в Chrome и Safari, когда поля пароля имеют одинаковую форму. Я полагаю, браузер ищет поле пароля для вставки сохраненных учетных данных. Затем он автоматически заполняет (просто догадываясь из-за наблюдения) ближайшее поле ввода текста, которое появляется перед полем пароля в DOM. Поскольку браузер является последним экземпляром, и вы не можете его контролировать,

Это исправление только для чтения сработало для меня.


8
Если нет никакого javascript, тогда вся форма терпит неудачу. -1
Джимми Кейн

8
@JimmyKane ключом было бы также добавить атрибут, используя в первую очередь javascript (чего здесь не сделал dsuess, а просто для полноты).
trnelson

@ tmelson Я понимаю, но все же зачем использовать js даже для отключения? Давайте избегать js для вещей, которые можно улучшить изначально. Я снова согласен с вами, хотя.
Джимми Кейн

3
Это не работает в IE8, поле пароля только для чтения не редактируется при первом его фокусировании, только после того, как вы снова сфокусируете его. Хорошая идея, но, к сожалению, она слишком хакерская и небезопасная для использования.
Сэм Уоткинс

Это не корректно работать на всех браузерах (например , IE 11 и IE края). Как только readonlyудаляется, последующий выбор поля приводит к возврату автозаполнения.
Ушел кодирование

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

Это будет работать в Internet Explorer и Mozilla FireFox, недостатком является то, что это не стандарт XHTML.


Я заметил, что добавление его к элементу формы не всегда предотвращает его применение к отдельным входам в форме. Поэтому, вероятно, лучше всего поместить его непосредственно на элемент ввода.
Шолзингер

15
На самом деле @sholsinger, лучше всего поместить его как в форму, так и в сам элемент ввода. Таким образом вы охватите всю нестандартность браузеров.
AviD

2
К сожалению, с IE 11 Microsoft больше не уважает это input type="password". Надеюсь, другие браузеры не захотят удалять эту функцию.
SamHuckaby

Настройка autocomplete="off"на formэто единственное, что работало для Chrome.
Андрей

106

Решением для Chrome является добавление autocomplete="new-password"к типу ввода пароля. Пожалуйста, проверьте пример ниже.

Пример:

<form name="myForm"" method="post">
   <input name="user" type="text" />
   <input name="pass" type="password" autocomplete="new-password" />
   <input type="submit">
</form>

Chrome всегда автоматически заполняет данные, если находит поле с паролем , достаточное для указания этого поля autocomplete = "new-password".

Это хорошо работает для меня.

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


2
Это работает в Chrome и для других типов полей, а не только для type = "password".
Джейк

Я использовал его с типами пароля, электронной почты и текста, и это сработало. Я использовал это просто так: autocomplete = "new"
Crak_mboutin

autocomplete = "nope" name = "pswd" и использовал <input name = "dummyPassword" type = "password" style = "display: none;"> перед полем ввода реального пароля. Это сработало для меня.
Денука


Теперь это работает практически во всех браузерах, а не только в Chrome: autocomplete # Browser_compatibility .
Эндрю Мортон

60

Как уже говорили другие, ответ autocomplete="off"

Тем не менее, я думаю, что стоит указать, почему в некоторых случаях рекомендуется использовать это, поскольку некоторые ответы на эти и повторяющиеся вопросы наводят на мысль, что лучше не выключать его.

Остановка браузеров, хранящих номера кредитных карт, не должна предоставляться пользователям. Слишком много пользователей даже не осознают, что это проблема.

Особенно важно отключить его в полях для кодов безопасности кредитных карт. Как говорится на этой странице :

«Никогда не сохраняйте защитный код ... его значение зависит от предположения, что единственный способ предоставить его - это прочитать его с физической кредитной карты, доказав, что лицо, его предоставляющее, действительно держит карту».

Проблема в том, что если это общедоступный компьютер (интернет-кафе, библиотека и т. Д.), То другие пользователи смогут легко украсть данные вашей карты, и даже на вашем компьютере вредоносный веб-сайт может украсть данные автозаполнения .


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

9
Гораздо проще / более критический случай. Когда я захожу на страницу пользователя в административной части моего сайта, он пытается установить их имя пользователя и пароль в качестве моего имени пользователя и пароля администратора, не имея возможности сказать, что это не форма входа в систему. Я хочу, чтобы мой пароль администратора запомнился, но это критическая ошибка, когда он пытается применить это запомненное имя пользователя / пароль ко всем пользователям, которые я затем редактирую.
rjmunro

34

Я решил бесконечный бой с Google Chrome с использованием случайных символов. Когда вы всегда визуализируете автозаполнение со случайной строкой, оно никогда ничего не запомнит.

<input name="name" type="text" autocomplete="rutjfkde">

Надеюсь, что это поможет другим людям.


2
Это работает даже лучше. Вы можете добавить небольшой JS, который генерирует случайный код для каждой загрузки страницы, и добавить этот код в поле ввода: <code> function autoId () {var autoId = ""; var dict = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i <12; i ++) {autoId + = dict.charAt (Math.floor (Math.random () * dict.length)); } return autoId; } $ ('. autocompleteoff'). attr ('autocomplete', autoId ()); </ code> Вы можете добавить autocompleteoffкласс в желаемое поле ввода.
Рагурам Касьяп,

не работает в моей хромированной версии 68.0.3440.106 (Official Build) (64-разрядная версия )
Sukanya Purushothaman

В Chrome теперь исправлено использование стандартизированного выключения
MacK

1
К сожалению, это работает лучше, чем то, что называется стандартным для хрома
Nour Lababidi

1
Сегодня я обнаружил, что Chrome будет перезаписывать случайную строку с «Выкл.». Не могу поверить, что разработчики Chrome делают этот атрибут плохим и неконтролируемым. О, боже мой.
шаг

33

Мне пришлось бы просить не согласиться с теми ответами, которые говорят, чтобы избежать отключения автозаполнения.

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

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


Только что дошло до моего сведения, что IE не запускает события onChange, когда вы заполняете ввод текста с помощью AutoComplete. У нас есть десятки форм и более тысячи событий onChange (проверки входных данных, бизнес-логика), разбросанных по ним. Недавно мы обновили IE до более новой версии, и неожиданно начали происходить странные вещи. К счастью, у нас запущено приложение для внутренней сети, и автозаполнение не является для нас проблемой UX, его проще просто отключить.
Роботрон

3
Если локальная машина пользователя скомпрометирована, они ввернуты, точка. На нем может быть установлен кейлоггер, может быть добавлен поддельный корневой сертификат SSL и все, что отправлено через фальшивый прокси и т. Д. У меня есть реальная причина отключить автозаполнение - когда я вхожу в систему как администратор и захожу на страницу редактирования пользователя, он назначает этот пользователь мой админ имя пользователя и пароль. Мне нужно предотвратить это поведение.
rjmunro

1
Поставщики браузеров, похоже, следят за своими интересами. Сохраненные пароли = блокировка пользователя. И автозаполнение вкл / выкл было слишком простым - почему бы не сложный стандарт семантических подсказок ( html.spec.whatwg.org/multipage/… ), который, кстати, позволяет браузеру собирать ценные семантические данные с сайтов каждый пользователь посещает?
aro_tech

Конкретный вариант использования, который я пытаюсь решить, заключается в следующем: они уже вошли в систему. Но теперь они собираются получить доступ к чему-то еще более чувствительному. Я хочу показать диалог, который заставляет их проходить повторную проверку подлинности, против возможности того, что они ушли, чтобы покурить, и плохой человек сел в свое кресло. перепробовал несколько методов, чтобы победить автозаполнение, и ничего не работает. теперь я думаю, может быть, по крайней мере, использовать старый добрый 'password = window.prompt ("Пожалуйста, введите ваш пароль заново)" плюс имя пользователя в сеансе и попытаться его аутентифицировать.
Дэвид

31

Три варианта: Первый:

<input type='text' autocomplete='off' />

Во-вторых:

<form action='' autocomplete='off'>

В-третьих (код JavaScript):

$('input').attr('autocomplete', 'off');

2
Первый и второй параметры должны быть одним из вариантов, поскольку они зависят от того, как браузеры обрабатывают это.
rybo111

Попробовал $ formElement.attr ('автозаполнение', 'выкл'); и это не работает.
Бен Синклер

22

На связанной или на самом деле, на совершенно противоположной ноте -

«Если вы являетесь пользователем вышеупомянутой формы и хотите снова включить функцию автозаполнения, используйте букмарклет« запомнить пароль »со страницы этой закладки . Он удаляет все autocomplete="off"атрибуты из всех форм на странице. Продолжайте бороться! "


20

Мы действительно использовали идею sasb для одного сайта. Это было медицинское программное приложение для управления кабинетом врача. Однако многие из наших клиентов были хирургами, которые использовали множество различных рабочих станций, в том числе полуобщественные терминалы. Поэтому они хотели убедиться, что врач, который не понимает смысла автоматически сохраняемых паролей или не обращает внимания, не может случайно оставить свои данные для входа легкодоступными. Конечно, это было до того, как идея частного просмотра стала появляться в IE8, FF3.1 и т. Д. Несмотря на это, многие врачи вынуждены использовать браузеры старой школы в больницах с ИТ, которые не изменятся.

Итак, у нас была страница входа, генерирующая случайные имена полей, которые работали бы только для этого поста. Да, это менее удобно, но это просто ударяет пользователя по поводу того, что он не хранит информацию для входа на общедоступных терминалах.


20

Ни одно из решений не помогло мне в этом разговоре.

Я наконец-то понял, что решение на чистом HTML не требует Javascript , работает в современных браузерах (кроме IE; нужно было хотя бы 1 перехват, верно?) И не требует отключения автозаполнения для всей формы.

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

<form autocomplete="off">
    <!-- these inputs will not allow autocomplete and chrome 
         won't highlight them yellow! -->
    <input name="username"  />
    <input name="password" type="password" />
    <!-- this field will allow autocomplete to work even 
         though we've disabled it on the form -->
    <input name="another_field" autocomplete="on" />
</form>

Это было полностью то, что я искал!
Марко

20

Просто установите autocomplete="off". Для этого есть очень веская причина: вы хотите предоставить собственную функцию автозаполнения!


20

Я пытался бесконечные решения, а потом я нашел это:

Вместо того, чтобы autocomplete="off"просто использоватьautocomplete="false"

Это так просто, и это работает как шарм в Google Chrome!


Как вы сказали в chrome, значение off не работает. Это должно быть «ложно»
azuax

У меня работает на Chrome 44.0.2403.130.
GuiGS

1
Попробовал это: $ formElement.attr ('autocomplete', 'false'); извините не работает.
Бен Синклер

20

Это работает для меня.

<input name="pass" type="password" autocomplete="new-password" />

Мы также можем использовать эту стратегию в других элементах управления, таких как текст, выделение и т. Д.


это должен быть последний ответ. единственный ответ, который работает для меня в последнем Chrome
Ник Чан Абдулла

19

Я думаю, что autocomplete=offподдерживается в HTML 5.

Спросите себя, почему вы хотите сделать это, хотя - это может иметь смысл в некоторых ситуациях, но не делайте это просто ради этого.

Это менее удобно для пользователей и даже не является проблемой безопасности в OS X (упомянутой Сореном ниже). Если вы беспокоитесь о том, что пароли пользователей могут быть украдены удаленно, регистратор нажатий клавиш может сделать это, даже если ваше приложение используетautcomplete=off .

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


17

Вдобавок к

autocomplete="off"

использование

readonly onfocus="this.removeAttribute('readonly');"

для входных данных, которые вы не хотите, чтобы они запоминали данные формы ( username, passwordи т. д.), как показано ниже:

<input type="text" name="UserName" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

<input type="password" name="Password" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

Надеюсь это поможет.


1
Для меня в IE11 я не могу набрать текстовое поле даже после того, как onfocus удаляет атрибут readonly. Однако, если я нажму второй раз на текстовое поле, я смогу напечатать.
mcallahan

Я столкнулся с той же проблемой с IE11 (не могу печатать до второго фокуса). Добавление размытия, а затем фокус снова работает. $(document).on('focus', 'input:password[readonly="readonly"]', function () { $(this).prop('readonly', false).blur().focus(); });
Palmsey

@ Андрей Конечно, ты можешь. Это основной принцип решения этой проблемы, и я также добавил обновление, содержащее полный пример кода;)
Мурат Йылдыз

Я также добавилonfocusout="this.setAttribute('readonly', 'readonly');"
rinatdobr

16

Лучшее решение:

Запретить автозаполнение имени пользователя (или электронной почты) и пароля:

<input type="email" name="email"><!-- Can be type="text" -->
<input type="password" name="password" autocomplete="new-password">

Запретить автозаполнение поля:

<input type="text" name="field" autocomplete="nope">

Пояснение: autocompleteпродолжает работать <input>, autocomplete="off"не работает, но вы можете изменить offна случайную строку, например nope.

Работает в:

  • Хром: 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 и 64

  • Firefox: 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 и 58


2
Я нашел это, чтобы работать в моем предварительном тестировании. Так странно, что «выкл» не работает.
Крейг Джейкобс

Это не работает для Chrome на Android. Я попытался установить строковые значения для autocompleteатрибута, и он по-прежнему отображает предыдущие записи в качестве предложений автозаполнения под вводом.
tebs1200

@ tebs1200 Какой? Поле пароля или текстовое поле?
Кава

@ Кава извините за задержку ответа. Текстовое поле. Неважно, какое значение я установил autocomplete, я все равно получаю выпадающий список на основе ранее введенных значений. Это нормально на рабочем столе, но не на Android Chrome.
tebs1200

14

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

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

autocomplete="nope"

13

Добавление

autocomplete="off"

в тег формы отключит автозаполнение браузера (что ранее было введено в это поле) из всех input полей в этой конкретной форме.

Проверено на:

  • Firefox 3.5, 4 бета
  • Internet Explorer 8
  • Хром

13

Добавление autocomplete="off"не собирается сокращать это.

Измените атрибут типа ввода на type="search".
Google не применяет автозаполнение для входов с типом поиска.


4
Это взломать Поле не является полем поиска. В будущем это может вызвать проблемы.
Roel

12

Используйте нестандартное имя и идентификатор для полей, чтобы вместо «name» было «name_». Браузеры не увидят его как поле имени. Самое приятное в этом то, что вы можете сделать это с некоторыми, но не со всеми полями, и он автоматически заполнит некоторые, но не все поля.


Проблема в том, что если другие сайты используют «name_» для достижения той же цели, вы возвращаетесь к исходной точке.
ConroyP

3
так что сделайте это "mysite_name". Если кто-то еще использует это, я бы задал им вопросы ...
Стив Перкс

это портит некоторые из этих автоматически
заполняющихся

12

Чтобы избежать недопустимого XHTML, вы можете установить этот атрибут, используя javascript. Пример использования jQuery:

<input type="text" class="noAutoComplete" ... />

$(function() {
    $('.noAutoComplete').attr('autocomplete', 'off');
});

Проблема в том, что пользователи без JavaScript получат функцию автозаполнения.


38
это не исключает недействительный xhtml, он просто динамически добавляет недопустимый бит после того, как вы проверили его, он объявил его действительным!
Andiih

@Andiih: Так есть ли способ заставить автозаполнение работать в xhtml?
Черувим

1
Работать (или перестать работать, что является целью): да, как указано выше. Но действительный - нет.
Andiih

11

попробуйте это тоже, если просто autocomplete="off"не работает:

autocorrect="off" autocapitalize="off" autocomplete="off"

11

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

<div style="height:0px; overflow:hidden; ">
  Username <input type="text" name="fake_safari_username" >
  Password <input type="password" name="fake_safari_password">
</div>

Надеюсь, это кому-нибудь пригодится!


1
Таким образом, поставить это до фактического поля имени пользователя и пароля сработало? браузер заполнил те а не настоящие
Андрей

11

Итак, вот оно:

function turnOnPasswordStyle() {
  $('#inputpassword').attr('type', "password");
}
<input oninput="turnOnPasswordStyle()" id="inputpassword" type="text">


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

1
Большое спасибо, это сделало работу +1, мое решение было сделать его одной строкой: <input oninput = "this.type = 'password'" id = "inputpassword" type = "text">
Hasnaa Ibraheem

@HasnaaIbraheem Спасибо (иногда лучше читается, лучше.
Став Бодик,

11

Это проблема безопасности, которую браузеры игнорируют сейчас. Браузеры идентифицируют и сохраняют контент, используя входные имена, даже если разработчики считают, что информация является конфиденциальной и не должна храниться. Изменение имени ввода между двумя запросами решит проблему (но все равно будет сохранено в кеше браузера, а также увеличит кэш браузера). Попросить пользователя активировать или деактивировать параметры в настройках своего браузера не является хорошим решением. Проблема может быть исправлена ​​в бэкэнде.

Вот мое исправление. Подход, который я реализовал в моей структуре. Все элементы автозаполнения генерируются со скрытым вводом, подобным этому:

<? $r = rmd5(rand().mocrotime(TRUE)); ?>
<form method="POST" action="./">
    <input type="text" name="<? echo $r; ?>" />
    <input type="hidden" name="__autocomplete_fix_<? echo $r; ?>" value="username" />
    <input type="submit" name="submit" value="submit" />
</form>

Затем сервер обрабатывает переменные записи следующим образом:

foreach ($_POST as $key => $val)
{
    if(preg_match('#^__autocomplete_fix_#', $key) === 1){
        $n = substr($key, 19);
        if(isset($_POST[$n]))$_POST[$val] = $_POST[$n];
    }
}

Значение можно получить как обычно

var_dump($_POST['username']);

И браузер не сможет предложить информацию из предыдущего запроса или от предыдущих пользователей.

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


10

Ни один из упомянутых здесь хаков не работал для меня в Chrome. Здесь обсуждается вопрос: https://code.google.com/p/chromium/issues/detail?id=468153#c41.

Добавление этого внутри <form>работ (по крайней мере, пока):

<div style="display: none;">
    <input type="text" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" />
</div>

1
Обратите внимание, что при использовании этой техники FireFox все равно будет автоматически заполнять это скрытое поле, которое будет включено при отправке формы. Скорее всего, это будет плохо, поскольку пароль будет передан по потенциально незащищенному соединению. К счастью, добавление maxlength="0"не позволяет Firefox автоматически заполнить поле.
Микал Шахт Дженсен,

9

Вы можете использовать при вводе.

Например;

<input type=text name="test" autocomplete="off" />
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.