Отключение автозаполнения Chrome

620

У меня были проблемы с поведением автозаполнения Chrome в нескольких формах.

Все поля в форме имеют очень общие и точные имена, такие как «электронная почта», «имя» или «пароль», и они также autocomplete="off"установлены.

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

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

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

templaedhel
источник
6
Это не дубликат. Этот обрабатывает отключение автозаполнения, а другой - стилизацию цвета автозаполнения ...
Нику Сурду
17
autocomplete = "false" вместо autocomplete = "off" в соответствии с ответом Kaszoni Ferencz, проголосуйте за него, люди.
кодер
7
Посмотрите на количество ответов на этот вопрос - он должен вам кое-что сказать: вы сражаетесь в проигранной битве. Это больше не проблема Chrome, Firefox и другие последовали его примеру. Нравится вам это или нет, но вам нужно принять решение индустрии браузеров, что автозаполнение формы - выбор пользователя - вы можете бороться с ними, но проиграете. В конце дня вопрос, который вы должны задать, заключается не в том, как я могу подменить автозаполнение, а в том, как создать формы, которые хорошо работают с автозаполнением. Вы беспокоитесь о безопасности не о вас, а о пользователях.
mindplay.dk
21
Извините, но ответ @ mindplay.dk контрпродуктивен. Моя ситуация такова, что у меня есть пользователи, которые вошли на мой сайт, и страница на сайте предназначена для них, чтобы ввести информацию об учетной записи / pwd для других систем. Когда я выставляю диалог, чтобы они вводили новый, заполняется их регистрационная информация для моего сайта, что совершенно неверно и вызовет проблемы, если / когда пользователи непреднамеренно введут эту информацию. Оба не имеют никакого отношения к друг с другом. В этом случае браузер делает что-то, противоречащее тому, что хочет пользователь.
Майк К
8
@ mindplay.dk - Мое веб-приложение - это приложение для управления рабочим процессом на рабочем месте, так что нет проблем, связанных с безопасностью, о которых я должен беспокоиться, так как это требуется высшим руководством и должно выполняться всеми сотрудниками, то есть пользователями. " Однако, если попросить их установить Chrome, IE или любой другой браузер самостоятельно, это оставит пробелы в процессе аутентификации, поскольку они могут, намеренно или нет, завершить работу с помощью автозаполнения. AНе все веб-приложения относятся к одному типу, с одними и теми же пользователями или проблемами.
PoloHoleSet

Ответы:

906

Для новых версий Chrome вы можете просто ввести autocomplete="new-password"поле пароля и все. Я проверил, отлично работает.

Получил этот совет от разработчика Chrome в этом обсуждении: https://bugs.chromium.org/p/chromium/issues/detail?id=370363#c7

PS Обратите внимание, что Chrome попытается определить поведение автозаполнения по имени, идентификатору и любому текстовому содержимому, которое он может получить вокруг поля, включая метки и произвольные текстовые узлы. Если есть токен автозаполнения, как street-addressв контексте, Chrome выполнит автозаполнение как таковое. Эвристика может быть довольно запутанной, поскольку иногда она срабатывает только в том случае, если в форме есть дополнительные поля или нет, если в форме слишком мало полей. Также обратите внимание, что autocomplete="no"будет работать, но autocomplete="off"не по историческим причинам. autocomplete="no"Вы говорите браузеру, что это поле должно быть заполнено автоматически как поле с именем"no" . Если вы генерируете уникальные случайные autocompleteимена, вы отключаете автозаполнение.

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

Тибальт
источник
115
«новый пароль» сработал для меня после попытки «выключить» и «ложь»
Кевин
26
Это единственное исправление сейчас. Ложь и выкл, больше не работают. Должен быть правильный ответ сейчас.
Дэвид
5
Это работает потому, что команда chrome пытается создать рекомендуемые значения автозаполнения, как показано на сайте @ developers.google.com/web/fundamentals/design-and-ui/input/… Значение «новый пароль» является одним из немногие, у которых есть дополнительная логика, окружающая его, и в этом случае, это приостанавливает автозаполнение, но все еще позволяет предложения автозаполнения
Deminetix
30
Не работает с 1.13.2018 Версия 63.0.3239.132 (Официальная сборка) (64-разрядная версия)
PellucidWombat
37
Я просто хотел сказать ... После того, как наткнулся на эту проблему ... Chrome - настоящая работа. Так что теперь мы должны перепрыгнуть через обручи, чтобы отключить функциональность, которая должна была оставаться необязательной. В каком мире адрес автозаполнения потребуется в бизнес-приложении, где адрес каждый раз новый / новый. Google становится таким же плохим, как Microsoft.
Эдди Ховард
700

Я только что обнаружил, что если у вас есть запомненное имя пользователя и пароль для сайта, текущая версия Chrome автоматически заполнит ваше имя пользователя / адрес электронной почты в поле перед любым type=passwordполем. Не имеет значения, как называется поле - просто предполагается, что это поле перед тем, как пароль будет вашим именем пользователя.

Старое решение

Просто используйте, <form autocomplete="off">и это предотвращает предварительное заполнение пароля, а также любое эвристическое заполнение полей на основе предположений, которые может сделать браузер (которые часто ошибочны). В отличие от использования, <input autocomplete="off">которое, по-видимому, в значительной степени игнорируется автозаполнением пароля (то есть в Chrome, Firefox его выполняет).

Обновленное решение

Хром теперь игнорирует <form autocomplete="off">. Поэтому мой оригинальный обходной путь (который я удалил) теперь в моде.

Просто создайте пару полей и сделайте их скрытыми с помощью «display: none». Пример:

<!-- fake fields are a workaround for chrome autofill getting the wrong fields -->
<input style="display:none" type="text" name="fakeusernameremembered"/>
<input style="display:none" type="password" name="fakepasswordremembered"/>

Затем поместите свои настоящие поля под.

Не забудьте добавить комментарий, или другие люди в вашей команде будут интересоваться, что вы делаете!

Обновление март 2016

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

Если вы используете javascript для изменения формы, вам понадобится дополнительный прием. Показать поддельные поля во время манипулирования формой, а затем снова спрятать их через миллисекунду.

Пример кода с использованием jQuery (при условии, что вы предоставляете своим поддельным полям класс):

        $(".fake-autofill-fields").show();
        // some DOM manipulation/ajax here
        window.setTimeout(function () {
            $(".fake-autofill-fields").hide();
        },1);

Обновление июль 2018

Мое решение больше не работает так хорошо, так как специалисты Chrome по борьбе с юзабилити усердно работают. Но они бросили нам кость в виде:

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

Это работает и в основном решает проблему.

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

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

Обновление март 2020

Не ясно, если и когда это решение все еще работает. Кажется, иногда все еще работает, но не все время.

В комментариях ниже вы найдете несколько советов. Один из них, добавленный @anilyeni, может стоить еще одного исследования:

Как я заметил, autocomplete="off"работает на Chrome 80, если в нем менее 3 элементов <form>. Я не знаю, какова логика или где соответствующая документация об этом.

Также это может быть у @dubrox, хотя я его не проверял:

Большое спасибо за трюк, но, пожалуйста, обновите ответ, так как display:none;больше не работает, но position: fixed;top:-100px;left:-100px; width:5px;работает :)

Обновление АПРЕЛЬ 2020

Специальное значение для chrome для этого атрибута делает работу: (проверено на входе - но не мной) autocomplete="chrome-off"

Майк Нельсон
источник
7
Я был уверен, что это сработает, поскольку вы отлично объяснили эвристическое автозаполнение, которое я испытываю при вводе перед полем пароля. К сожалению, это не сработало для меня, я поставил autocomplete = "off" как на форме, так и на всех входах, и они все еще заполняются. Единственное решение, которое сработало для меня, это ссылка Goodeye выше. (размещение второго скрытого ввода type = "password" до того, как пароль скинет эвристические проверки Chrome)
парламент,
19
Раньше это работало нормально, я тоже его использовал, но после обновления Chrome некоторое время назад (в период с 5 мая) Chrome игнорирует свойство формы :(
Tominator
13
Google принял решение (я думаю, что Chrome v34) сделать политику ВСЕГДА теперь игнорировать autocomplete = "off", в том числе директивы уровня формы ... это было бы хорошо, если бы он на самом деле правильно понял эти чертовы поля.
Jammer
10
попробуйте autocomplete = "false", а не autocomplete = "off"
rawcoder
244
Этот атрибут также обязателен:autocomplete="I told you I wanted this off, Google. But you would not listen."
rybo111
265

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

Вместо autocomplete="off"использования autocomplete="false";)

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


Обновление за август 2019 года (ссылка на @JonEdiger в комментариях)

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

Установите его на уровне формы, а затем для входов, которые вы хотите отключить, установите недопустимое значение, например, «none»:

<form autocomplete="off"> 
  <input type="text" id="lastName" autocomplete="none"/> 
  <input type="text" id="firstName" autocomplete="none"/>
</form>
Kaszoni Ferencz
источник
8
Работал на меня! Но есть одно важное замечание: у меня есть 5 полей на моей веб-странице: имя, адрес, почтовый индекс, телефон и электронная почта. Когда я включил autocomplete = 'false' в Форму и в поле Имя, он все еще работал. Однако, когда я включил autocomplete = 'false' также в поле Address, он окончательно прекратил их автозаполнение! Итак, вам нужно поместить свойство автозаполнения не в поле логина или имени, а в следующие поля! (Работал над Chrome 43.0.2357.81 по состоянию на 2015-05-27)
DVD Franco
45
ЕСЛИ ЭТО НЕ РАБОТАЕТ ДЛЯ ВАС: имейте в виду, что Chrome «помогает» пользователям двумя способами. AUTOCOMPLETE выдаст запрос на основе предыдущего представления в той же форме и повлияет на людей, которые используют форму более одного раза. Автозаполнение отключено с autocomplete = "off". AUTOFILL запросит на основании адресной книги ранее заполненные аналогичные формы на других страницах. Он также выделит поля, которые он меняет. Автозаполнение может быть отключено с помощью autocomplete = "false".
genkilabs
4
Это не работает для меня (версия 43.0.2357.124 м). Вероятно, это был недосмотр со стороны Google, который сейчас решен. Кажется, они думают, что «пользователь всегда прав», потому что они хотят все заполнить автоматически. Проблема в том, что моя форма регистрации сохраняет данные пользователя точно так же, как и форма входа в систему, что совершенно точно не то, что хочет пользователь ...
rybo111
3
Да, это работает в Chrome 43.0.2357! такое поведение в Chrome очень раздражает, и этот обходной путь занял у меня некоторое время, чтобы понять. Спасибо за Ваш ответ.
Адриано Роза
3
не работает с Chrome 44.0.2403.157. Как эта функция может работать и не работать с разными версиями. Это смешно
Маттий
120

Иногда даже autocomplete=off не помешает заполнить учетные данные в неправильные поля.

Обходной путь - отключить автозаполнение браузера с использованием режима readonly и установить запись в фокусе:

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

focusСобытие происходит на щелчки мыши и обходе через поля.

Обновить:

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, когда поля пароля имеют одинаковую форму. Я полагаю, браузер ищет поле пароля для вставки сохраненных учетных данных. Тогда AutoFills имени пользователя в ближайший textlike-поле ввода, которое появляется перед полем пароля в DOM (только гадать , из - за наблюдение). Поскольку браузер является последним экземпляром, и вы не можете его контролировать,

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

dsuess
источник
12
Как здорово! :) Вы должны заменить jquery следующим образом: this.removeAttribute ("class")
Роу
Я использовал это, чтобы не допустить автозаполнения dropdwonlist. Но также рестайлинг только для чтения, так что это не выглядит. Классная идея!
ComforblyNumb
1
@Clint: Мой фрагмент кода выше удаляет атрибут readonly, как только пользователь входит в поле (за клик мыши или клавишу табуляции). Я полагаю, вы ссылаетесь на поле, которое защищено автоматическим заполнением , но не затронуто пользователем. Какова цель этого поля - и действительно ли оно должно быть защищено? В зависимости от сценария можно удалить все атрибуты только для чтения при отправке . Можете ли вы добавить более конкретный комментарий по вашей проблеме? Может быть, я могу помочь вам :)
dsuess
1
Если вы используете JavaScript. почему бы просто не установить значение dummyи затем снова удалить его? Добавление и удаление только для чтения звучит как опасный шаг - что если браузер не хочет, чтобы вы сосредоточились на нем?
rybo111
1
Судя по всему, Google пытается принять решение за всех нас здесь, они закрыли заявку на autocomplete = "off": bugs.chromium.org/p/chromium/issues/detail?id=468153 . Но есть еще один билет для сбора действительных пользовательских случаев для отключения автозаполнения, пожалуйста, ответьте на этот билет, чтобы повысить осведомленность об этой проблеме здесь: bugs.chromium.org/p/chromium/issues/detail?id=587466
Норман Сюй
80

Если вы реализуете функцию окна поиска, попробуйте установить typeатрибут searchследующим образом:

<input type="search" autocomplete="off" />

Это работает для меня на Chrome v48 и, кажется, является законной разметкой:

https://www.w3.org/wiki/HTML/Elements/input/search

Dana
источник
Да! :) Спасибо! Это работает в Chrome 67.0.3396.99. (Я думаю, что ваша ссылка должна быть: w3.org/wiki/HTML/Elements/input/search по состоянию на сентябрь 2018 года).
Энди Кинг
4
В заключение! все еще работает Версия 69.0.3497.100 (Официальная сборка) (64-разрядная версия) Это должен быть реальный ответ!
Венсон
1
все правы и неправы, и в то же время вы должны написать autocomplete = "off" вместо тега <form autocomplete = "off"> вместо ввода, и это остановит поведение автозаполнения
demopix
2
Также работает, если вы установите autocomplete = "off" в форме (чтобы изменить это значение по умолчанию для всей формы), а затем просто нужно установить type = "search" в <input>
John
9
После Chrome версии 72.XX это исправление не работает. Найдите последнее исправление здесь stackoverflow.com/a/55045439/1161998
Adheep Мохамед Абдул Кадер
65

Попробуй это. Я знаю, что вопрос несколько устарел, но это другой подход к проблеме.

Я также заметил, что проблема возникает чуть выше password поля.

Я попробовал оба метода, как

<form autocomplete="off"> а также <input autocomplete="off"> никто из них не работал для меня.

Поэтому я исправил это, используя фрагмент ниже - просто добавил другое текстовое поле чуть выше поля типа пароля и сделал его display:none .

Что-то вроде этого:

<input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="display:none;" />
<input type="password" name="password_fake" id="password_fake" value="" style="display:none;" />
<input type="password" name="password" id="password" value="" />

Надеюсь, это кому-нибудь поможет.

Джобин Хосе
источник
1
Этот работал для меня (пока). Я обнаружил, что со временем использовал около полудюжины различных хаков, и через некоторое время Chrome решает победить этот хак. Так что нужен новый, такой как этот. В моем приложении есть форма обновления профиля с полями электронной почты и пароля, которые следует оставить пустыми, если пользователь не хочет вносить изменения. Но когда Chrome выполняет автозаполнение, он вводит идентификатор пользователя в поле «подтверждение по электронной почте», что приводит к возникновению всевозможных состояний ошибок, которые приводят к возникновению дальнейших условий ошибок, поскольку пользователь не может понять, как поступить правильно.
Джеффри Саймон
2
Краткое объяснение того, почему этот хак работает (на данный момент): Chrome видит первый ввод type = password и автоматически его заполняет, и предполагает, что поле непосредственно перед этим ДОЛЖНО быть полем userhame, и автоматически заполняет это поле именем пользователя. @JeffreySimon это должно объяснить феномен userid в поле подтверждения по электронной почте (я видел то же самое в моей форме).
MrBoJangles
1
@kentcdodds - не уверен, что ты имеешь в виду, больше не работает. Ваш jsbin не имеет поля пароля, поэтому ситуация другая. Я использовал это решение в течение многих лет, и совсем недавно я заметил, что оно было необходимо, и оно сработало для меня только на прошлой неделе (март 2015 года).
Майк Нельсон
1
Ура! Решение, которое, кажется, работает! Я бы посоветовал дать полю название passwordи иметь его actual_passwordдля легитимного поля, как Google сейчас, похоже, смотрит на name. Тем не менее, это означает, что Chrome не будет сохранять пароль, а это именно то, что мне нужно . AAAAARRRRGHH!
rybo111
2
Обновление: это продолжает работать в течение года с момента моего последнего применения. У нас может быть солидный победитель здесь.
MrBoJangles
48

Я не знаю почему, но это помогло и сработало для меня.

<input type="password" name="pwd" autocomplete="new-password">

Понятия не имею почему, но autocompelete = "new-password" отключает автозаполнение. Он работал в последней версии 49.0.2623.112 Chrome.

Таурас
источник
Обновил мой хром, и все же он у меня работает. 50.0.2661.87 (64 бита)
Таурас
К сожалению, при отправке формы (или когда поля ввода скрыты / удалены), Chrome затем просит сохранить измененный логин.
Сиббл
Работает в версии 51.0.2704.79 м
Джеффри Хейл,
святой б *** почему это работает? это ошибка? потому что я проверил его здесь и поместил только в один вход и работал как для входного логина, так и для пароля, но я поместил его только в пароль
Leandro RR
Не имею представления. Я думаю, что это хром "вещь", которая была сделана разработчиками. Может быть, я ошибаюсь.
Таурас
46

Для меня просто

<form autocomplete="off" role="presentation">

Сделал это.

Протестировано на нескольких версиях, последняя попытка была на 56.0.2924.87

Куф
источник
Добавлена ​​версия @ArnoldRoa, она появилась на нашем сайте с того дня, как я ее опубликовал, и у нее было несколько версий, где она работала нормально. какую версию вы используете? PC / Mac?
Куф
Не работает на 57.0.2987.110. Chrome выделяет его желтым цветом и предварительно заполняет поле моим сохраненным паролем. Но эта страница - страница управления пользователями, а не страница входа.
1
@ Dummy Я тестировал его сейчас на Chrome Latest (57), и он все еще работает для меня. Вы сделали что-то особенное с полями ввода? кепка вы положили свой код где-то я мог бы попытаться воспроизвести?
Kuf
3
Версия 64.0.3282.186 (Официальная сборка) (64-битная) Windows. 2018-03-01 НЕ РАБОТАЕТ для отключения автозаполнения.
Билли Джин
2
Уверен, что это удаляет форму / ввод из вспомогательных технологий w3c.github.io/using-aria/#ariapresentation
Olex Ponomarenko
25

Вы должны добавить этот атрибут:

autocomplete="new-password"

Ссылка на источник: Полная статья

Хитеш Калвани
источник
Есть ли у вас источники, как это выяснить?
AlexioVay
Работает, но не является семантическим, так как может использоваться для имени пользователя и других полей.
Робин Эндрюс
1
Документация Страница: developer.mozilla.org/en-US/docs/Web/Security/...
Justinas
19

Это так просто и сложно :)

Google Chrome в основном выполняет поиск каждого первого видимого элемента пароля внутри тегов <form>, <body>и <iframe>включает автоматическое заполнение для них, поэтому, чтобы отключить это, вам нужно добавить фиктивный элемент пароля, как показано ниже:

    • если ваш элемент пароля находится внутри <form>тега, вы должны поместить фиктивный элемент в качестве первого элемента в вашей форме сразу после <form>открытого тега

    • если ваш элемент пароля не находится внутри <form>тега, поместите фиктивный элемент в качестве первого элемента на вашей html-странице сразу после <body>открытого тега

  1. Вам нужно скрыть фиктивный элемент без использования css, display:noneпоэтому в основном используйте следующее как фиктивный элемент пароля.

    <input type="password" style="width: 0;height: 0; visibility: hidden;position:absolute;left:0;top:0;"/>
Фарид Алнамрути
источник
1
Отличная работа, как вы узнали алгоритм работы Chrome? Я только что узнал, что мой старый метод, изменяющий значение с помощью JS после загрузки страницы с помощью таймера setTimeout, больше не работает. Но это работает отлично!
К сожалению, не работает для обычных вводов TextBox.
eYe
1
на самом деле это работает, просто установите имя свойства;)
Фарид Alnamrouti
На Chrome 58 это не работает. Используйте ширину: 1px. Если поле пароля полностью скрыто, Chrome автоматически его заполняет. Также z-index: -999 может быть полезен, чтобы не перекрывать любой контент.
cristiancastrodc
1
Работает над Chrome 67.0 над угловым html-компонентом<form *ngIf="!loggedIn()" #loginForm="ngForm" class="navbar-form navbar-right" (ngSubmit)="login()"><input type="password" style="width: 0;height: 0; visibility: hidden;position:absolute;left:0;top:0;"/><input type="text" #username="ngModel" placeholder="Username" class="form-control" required autocomplete="off" name="username" [(ngModel)]="model.username"><input type="password" #password="ngModel" placeholder="Password" class="form-control" required autocomplete="off" name="password" [(ngModel)]="model.password">...
Junior Mayhé
19

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

Вариант 1 - выделить весь текст по клику

Установите значения входов в качестве примера для вашего пользователя (например your@email.com) или метки поля (например Email) и добавьте класс, вызываемый focus-selectдля ваших входов:

<input type="text" name="email" class="focus-select" value="your@email.com">
<input type="password" name="password" class="focus-select" value="password">

А вот и JQuery:

$(document).on('click', '.focus-select', function(){
  $(this).select();
});

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

Вариант 2 - установить значение адреса электронной почты в пробел, а затем удалить его

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

Если у пользователя по какой-то причине нет JavaScript, убедитесь, что вы урезали его входные данные на стороне сервера (вероятно, так и должно быть), если они не удаляют пространство.

Вот jQuery:

$(document).ready(function() {
  setTimeout(function(){
    $('[autocomplete=off]').val('');
  }, 15);
});

Я установил тайм-аут, 15потому что5 в моих тестах время от времени показывалось, что утроение этого числа кажется безопасной ставкой.

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

Вариант 3 - скрытые входы

Поместите это в начале формы:

<!-- Avoid Chrome autofill -->
<input name="email" class="hide">

CSS:

.hide{ display:none; }

Убедитесь, что вы храните HTML-заметку, чтобы ваши другие разработчики не удалили ее! Также убедитесь, что имя скрытого ввода является актуальным.

rybo111
источник
@Vaia - вы пробовали перейти на другую страницу и затем нажать кнопку «Назад»? Я получаю смешанные результаты - может потребоваться настройка.
rybo111
Я не пробовал вариант 1, если вы это имеете в виду. Также мне просто нужно было отключить автозаполнение на модале, загруженном ajax, который не будет вызываться кнопкой назад. Но если будут другие результаты, я вам скажу. @ rybo111
AlexioVay
@Vaia Я имел в виду вариант 2 - пожалуйста, ответьте здесь, если у вас возникнут какие-либо проблемы. Спасибо.
rybo111
15

Используйте css text-security: диск без использования type = password .

HTML

<input type='text' name='user' autocomplete='off' />
<input type='text' name='pass' autocomplete='off' class='secure' />

or

<form autocomplete='off'>
    <input type='text' name='user' />
    <input type='text' name='pass' class='secure' />
</form>

CSS

input.secure {
    text-security: disc;
    -webkit-text-security: disc;
}
Stiffels
источник
лучший подход, который я нашел до сих пор! ну хотя бы для Chrome 64: /
scipper
Для моих целей это идеально, спасибо! Chrome не выполняет автозаполнение или автозаполнение, не предлагает его сохранить, и он не только скрыт от просмотра, но и из буфера обмена - я скопировал набранный текст, вставил его в блокнот и просто получил "••• ••••••••». Brilliant!
Даг Маклин
15

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

autocomplete="nope"
Денис Брежицкий
источник
RE: «неожиданное поведение». Такое поведение подталкивает Google, который считает, что он знает лучше, чем разработчики, как должна работать каждая отдельная страница. Иногда я просто хочу ввести необработанный пароль, ноль излишеств.
Регулярный Джо
3
эта комбинация НАКОНЕЦ работала для меня: role = "presentation" autocomplete = "nope" протестировано на Chrome версии 64.0.3282.186 (Официальная сборка) (64-разрядная версия). Какой кошмар!
Билли Джин
2
Случайная строка работает для Chrome, но не для Firefox. Для полноты я использую оба "autocomplete = 'off-no-complete'" и устанавливаю атрибут readonly с помощью onfocus = "this.readOnly = false". Мое приложение является корпоративным приложением, которое пользователи используют для ввода тысяч адресов, поэтому сценарий использования для управления этим является реальным - я также могу гарантировать использование Javascript, так что, по крайней мере, у меня это получилось
ChronoFish
13

Я обнаружил, что добавление этого в форму не позволяет Chrome использовать автозаполнение.

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

Нашел здесь. https://code.google.com/p/chromium/issues/detail?id=468153#hc41

Действительно разочаровывает, что Chrome решил, что он знает лучше, чем разработчик о том, когда нужно автозаполнение. Имеет реальное чувство Microsoft к этому.

Роб Дженсен
источник
Это не факт, что вы говорите PreventChromeAutocomplete. Я смог заставить автозаполнение работать, сказав autocomplete = "off" и name = "somename". Но это работает, только если вы называете два разных входа одним и тем же именем. Таким образом, в вашем случае PreventChromeAutocomplete должен быть применен к двум различным входам. Очень странно ...
Джо Хейминг
11
<input readonly onfocus="this.removeAttribute('readonly');" type="text">

добавление атрибута readonly к тегу вместе с удалением события onfocus устраняет проблему

Авинду Хева
источник
Это решение работает на текстовых полях
Денис Слоновский
9

Для комбо паролей пользователей это легко решить. Эвристика Chrome ищет шаблон:

<input type="text">

с последующим:

<input type="password">

Просто прервите этот процесс, аннулировав это:

<input type="text">
<input type="text" onfocus="this.type='password'">
Bernesto
источник
К сожалению, это относится не только к типу имени пользователя / пароля. Chrome рассмотрит текст заполнителя, чтобы сделать вывод, что предложить. Например: jsbin.com/jacizu/2/edit
kentcdodds
Действительно, вы по-прежнему сможете заполнять поля предложениями браузера, как показывает ваш пример, так что это не решает проблему с OP. Это решение просто предотвращает "автоматическое" заполнение браузером комбинаций имени пользователя и пароля, как в примере с верхним ответом. Это может быть полезно для некоторых, но не является окончательным решением простого отключения автозаполнения, которое придет от Google.
Бернесто
4
Хотя, если вы добавите пробел перед текстом заполнителя, он также отключит автоматическое предложение на основе заполнителя. Определенно взломать, хотя не более, чем другие предложения. jsbin.com/pujasu/1/edit
Бернесто
на самом деле ... похоже, это работает для вашего примера, но по некоторым причинам это не работает для меня :-(
kentcdodds
Ха! Вот почему это называется взломать ... У вас есть пример, которым вы можете поделиться, где он не работает?
Бернесто
8

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

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

<input name="dpart" disabled="disabled" type="password" style="display:none;">
<input name="dpart" type="password">
<input type="submit">
mccainz
источник
Что касается июня 2016 года и Chrome 51.0.2704.106 м, то здесь это единственное рабочее решение
Денис
Но выберет ли форма правильное (видимое) поле ввода, которое вам нужно? Потому что это одно и то же имя.
AlexioVay
@Vaia, добавление атрибута disabled к дублирующему элементу предотвратит его отправку.
МакКайнц
8

В 2016 году Google Chrome начал игнорировать, autocomplete=offхотя это в W3C. Ответ они разместили :

Сложность заключается в том, что где-то на протяжении всего пути web autocomplete = off становится значением по умолчанию для многих полей формы, без какой-либо реальной мысли о том, было ли это хорошо для пользователей. Это не означает, что есть не очень правильные случаи, когда вы не хотите, чтобы данные автозаполнения браузера (например, в системах CRM), но в целом мы рассматриваем их как случаи меньшинства. В результате мы начали игнорировать autocomplete = off для данных автозаполнения Chrome.

Что, по сути, говорит: мы лучше знаем, чего хочет пользователь.

Они открыли еще одну ошибку, чтобы опубликовать допустимые случаи использования, когда требуется autocomplete = off

Я не видел проблем, связанных с автозаполнением, во всех моих приложениях B2B, но только с вводом типа пароля.

Заполняется автозаполнение, если на экране есть поле пароля, даже скрытое. Чтобы нарушить эту логику, вы можете поместить каждое поле пароля в его собственную форму, если оно не нарушает вашу собственную логику страницы.

<input type=name >

<form>
    <input type=password >
</form>
norekhov
источник
4
Поскольку ваш ответ является самым последним, не могли бы вы добавить, что добавление autocomplete="pineapple"или какой-то другой трюк также, кажется, решает проблему? По крайней мере, это с моей стороны!
Доу де Хаан
1
@DouwedeHaan это нормально, пока форма не будет сохранена, тогда автозаполнение предоставит рекомендации для сохраненного поля «Ананас». Но, возможно, использование случайного хэша для значения автозаполнения, например, обойдет это?
раскопки
@ Вывод Я согласен. Хорошим примером будет использование UUID для такого рода вещей. Просто убедитесь, что строка уникальна!
Доу де Хаан
7

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

проблема

HTML

<div class="form">
    <input type="text" placeholder="name"><br>
    <input type="text" placeholder="email"><br>
    <input type="text" placeholder="street"><br>
</div>

http://jsfiddle.net/xmbvwfs6/1/

Приведенный выше пример по-прежнему вызывает проблему с автозаполнением, но если вы используете required="required"и некоторые CSS, вы можете копировать заполнители, и Chrome не будет подбирать теги.

Решение

HTML

<div class="form">
    <input type="text" required="required">
    <label>Name</label>  
    <br>
    <input type="text" required="required">
    <label>Email</label>    
    <br>
    <input type="text" required="required">
    <label>Street</label>    
    <br>
</div>

CSS

input {
    margin-bottom: 10px;
    width: 200px;
    height: 20px;
    padding: 0 10px;
    font-size: 14px;
}
input + label {
    position: relative;
    left: -216px;
    color: #999;
    font-size: 14px;
}
input:invalid + label { 
    display: inline-block; 
}
input:valid + label { 
    display: none; 
}

http://jsfiddle.net/mwshpx1o/1/

Райан Груш
источник
Это единственное решение, которое действительно работает. Мне действительно не нравится это, но это ужасное состояние, в котором мы сейчас находимся :-(
kentcdodds
По состоянию на 2017 год этот по-прежнему работает нормально. Этот скрипт нужен только для принудительной inputфокусировки, если пользователь нажимает на «фальшивый» заполнитель: $("label").on("click",function(){ $(this).prev().focus(); });обратите внимание, что его labelнельзя сделать до того, как input... Chrome найдет его! Хорошее креативное решение! +1
Луис Патрис Бессетт
7

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

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

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

для этого нужно сначала удалить атрибут «только для чтения », выбрав поле, и в это время, скорее всего, вы будете заполнены собственным пользовательским вводом и остановите автозаполнение, чтобы взять на себя управление

MZaragoza
источник
1
К сожалению, это больше не работает :-( jsbin.com/sobise/edit?html,css,output
kentcdodds
7

Ранее введенные значения, кэшированные Chrome, отображаются в виде выпадающего списка выбора. Это можно отключить с помощью autocomplete = off, явно сохраненный адрес в дополнительных настройках Chrome дает всплывающее окно автозаполнения, когда поле адреса получает фокус. Это можно отключить с помощью autocomplete = "false" . Но это позволит chrome отображать кэшированные значения в выпадающем списке.

На поле ввода html следующее отключит оба.

Role="presentation" & autocomplete="off"

При выборе полей ввода для автозаполнения адреса Chrome игнорирует те поля ввода, которые не имеют предшествующего элемента html метки.

Чтобы Chrome Parser игнорировал поле ввода для всплывающего адреса автозаполнения, можно добавить скрытую кнопку или элемент управления изображением между меткой и текстовым полем. Это нарушит последовательность синтаксического разбора создания пары метка-вход для автозаполнения. Флажки игнорируются при разборе полей адреса

Chrome также учитывает атрибут for для элемента label. Может использоваться для разрыва последовательности разбора хрома.

Momin
источник
Я люблю вас. Единственное решение на этой странице, которое действительно работает.
День Дэвиса Уотербери
Не работает в 2020 году.
Кай Ноак
7

Ну, так как у всех нас есть эта проблема, я потратил некоторое время, чтобы написать работающее расширение jQuery для этой проблемы. Google должен следовать HTML-разметке, а не мы следуем Google

(function ($) {

"use strict";

$.fn.autoCompleteFix = function(opt) {
    var ro = 'readonly', settings = $.extend({
        attribute : 'autocomplete',
        trigger : {
            disable : ["off"],
            enable : ["on"]
        },
        focus : function() {
            $(this).removeAttr(ro);
        },
        force : false
    }, opt);

    $(this).each(function(i, el) {
        el = $(el);

        if(el.is('form')) {
            var force = (-1 !== $.inArray(el.attr(settings.attribute), settings.trigger.disable))
            el.find('input').autoCompleteFix({force:force});
        } else {
            var disabled = -1 !== $.inArray(el.attr(settings.attribute), settings.trigger.disable);
            var enabled = -1 !== $.inArray(el.attr(settings.attribute), settings.trigger.enable);
            if (settings.force && !enabled || disabled)
                el.attr(ro, ro).focus(settings.focus).val("");
        }
    });
};
})(jQuery);

Просто добавьте это в файл типа /js/jquery.extends.js и включите его после jQuery. Примените его к каждому элементу формы при загрузке документа следующим образом:

$(function() {
    $('form').autoCompleteFix();
});

jsfiddle с тестами

MagicSux
источник
6

Попробуйте следующий jQueryкод, который работал для меня.

if ($.browser.webkit) {
    $('input[name="password"]').attr('autocomplete', 'off');
    $('input[name="email"]').attr('autocomplete', 'off');
}
Приянка
источник
удивительные удивительные решения
ДКР
Вы можете просто добавить autocomplete="off"в поле ввода вместо использования JQuery. И, кстати, это не работает. Предложения по паролю Chrome все еще появляются.
Кай Ноак
6

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

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

Крис Пратт
источник
Первая часть этого ответа, похоже, больше не соответствует действительности: Chrome Bug
Joshua Drake
Я не уверен, о чем ты. Эта «ошибка» является просто заполнителем для Chromium, для которого собирают сценарии использования autocomplete="off". Это возможно намерение состоит в том, чтобы удалить его, но это не всегда явно, и нет , конечно , ничего потребовав , умственный прыжок. Они могут просто хотеть рассмотреть альтернативные или лучшие способы лечения. В любом случае, это все еще часть спецификации, и опять же, нет никаких признаков того, что она тоже покинет спецификацию. И, насколько я знаю, он все еще работает во всех браузерах, включая Chrome.
Крис Пратт
У нас есть пара случаев, когда autocomplete = "off" не соблюдается Chrome.
Джошуа Дрейк
1. Пара случайных случаев не является доказательством. 2. Как я уже сказал в своем ответе, расширения для заполнения форм и тому подобное не могут и часто не соблюдают это. В конечном счете, как и все, это зависит от клиента и, следовательно, от пользователя. Все, что вы можете сделать, это предложить, чтобы оно не заполнялось автоматически.
Крис Пратт
6

Согласно сообщению об ошибке Chromium # 352347 Chrome больше не уважаетautocomplete="off|false|anythingelse" ни формы, ни входные данные.

Единственное решение, которое сработало для меня, это добавить фиктивное поле пароля :

<input type="password" class="hidden" />
<input type="password" />
Доктор Джанлуиджи Зане Занеттини
источник
6

Устанавливая autocompleteна offдолжен работать здесь у меня есть пример , который используется Google в поисковой странице. Я нашел это из элемента inspect.

введите описание изображения здесь

редактировать : если offне работает, попробуйте falseили nofill. В моем случае это работает с Chrome версии 48.0

mumair
источник
5

Вот грязный хак -

У вас есть ваш элемент здесь (добавив атрибут disabled):

<input type="text" name="test" id="test" disabled="disabled" />

А затем в нижней части вашей веб-страницы поместите немного JavaScript:

<script>
    setTimeout(function(){
        document.getElementById('test').removeAttribute("disabled");
        },100);
</script>
hyper_st8
источник
5

Отличное решение, основанное на webkit. Как уже упоминалось, каждый раз, когда Chrome находит поле пароля, он автоматически заполняет электронную почту. AFAIK, это независимо от автозаполнения = [что угодно].

Чтобы обойти это, измените тип ввода на текстовый и примените шрифт безопасности webkit в любой форме.

.secure-font{
-webkit-text-security:disc;}

<input type ="text" class="secure-font">

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

Майкл.
источник
Спасибо! Это единственное, что работает в Chrome 49. Предыдущие методы сломались, так как Chrome, кажется, заполняет все входные данные type="password"сейчас.
Epelc
4

Единственный способ, который работает для меня, был: (требуется jQuery)

$(document).ready(function(e) {
    if ($.browser.webkit) {
        $('#input_id').val(' ').val('');
    }
});
user3638028
источник
4

Я столкнулся с той же проблемой. А вот решение для отключения автозаполнения имени пользователя и пароля в Chrome (только что протестировано с Chrome)

    <!-- Just add this hidden field before password as a charmed solution to prevent auto-fill of browser on remembered password -->
    <input type="tel" hidden />
    <input type="password" ng-minlength="8" ng-maxlength="30" ng-model="user.password" name="password" class="form-control" required placeholder="Input password">
Тхыонг
источник
странное исправление, но почему-то это единственное, что работает для меня на Chrome 48 :)
Jacka