Chrome игнорирует autocomplete = “off”

Я создал веб-приложение, в котором используется тегбокс. Это отлично работает во всех браузерах, кроме браузера Chrome (версия 21.0.1180.89).

Несмотря на то, что оба поля input и поле form имеют атрибут autocomplete="off" , Chrome настаивает на том, чтобы отобразить раскрывающийся список предыдущих записей для поля, который стирает список тегов.

ОБНОВИТЬ

Теперь Chrome игнорирует style="display: none;" или style="visibility: hidden; атрибуты.

Вы можете изменить его на что-то вроде:

   

По моему опыту, Chrome только автозаполняет первый и предыдущий . Поэтому я добавил:

   

В начало

и корпус был разрешен.

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

   

Запретить автозаполнение поля ( может не работать ):

  

Объяснение:

autocomplete все еще работает на несмотря на то, что имеет autocomplete="off" , но вы можете перейти к случайной строке, например nope .


Другие «решения» для отключения автозаполнения поля (это не правильный способ сделать это, но он работает):

1.

HTML:

  

JS (onload):

 (function() { var some_id = document.getElementById('some_id'); some_id.type = 'text'; some_id.removeAttribute('autocomplete'); })(); 

или с помощью jQuery:

 $(document).ready(function() { var some_id = $('#some_id'); some_id.prop('type', 'text'); some_id.removeAttr('autocomplete'); }); 

2.

HTML:

 

JS (onload):

 (function() { var input = document.createElement('INPUT'); input.type = 'text'; document.getElementById('form').appendChild(input); })(); 

или с помощью jQuery:

 $(document).ready(function() { $('', { type: 'text' }).appendTo($('#form')); }); 

Чтобы добавить несколько полей с помощью jQuery:

 function addField(label) { var div = $('
'); var input = $('', { type: 'text' }); if(label) { var label = $('
  

Похоже, Chrome теперь игнорирует autocomplete="off" если он не находится в

.

Для надежного обходного пути вы можете добавить этот код на свою страницу макета:

 

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

Это не будет работать с полями пароля – в Chrome они обрабатываются совсем по-другому. Дополнительную информацию см. На странице https://code.google.com/p/chromium/issues/detail?id=468153 .

ОБНОВЛЕНИЕ: ошибка закрыта как «не будет исправлена» от Chromium Team 11 марта 2016 года. См. Последний комментарий в моем первоначально поданном отчете об ошибке , для полного объяснения. TL; DR: использовать семантические атрибуты автозаполнения, такие как autocomplete = «new-street-address», чтобы избежать выполнения автозаполнения Chrome.

Современный подход

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

  

Постройте свой вход так, чтобы он не выглядел как вход для ввода

 input[readonly] { cursor: text; background-color: #fff; } 

РАБОЧИЙ ПРИМЕР

В Chrome версии 34 теперь игнорируется autocomplete=off , см. Это .

Много дискуссий о том, хорошо это или плохо? Каковы ваши взгляды?

В настоящее время решением является использование type="search" . Google не применяет автозаполнение к входам с типом поиска.

См .: https://twitter.com/Paul_Kinlan/status/596613148985171968

Обновление 04/04/2016: Похоже, это исправлено! См. http://codereview.chromium.org/1473733008

Ну, немного поздно вечеринке, но кажется, что есть немного недоразумений о том, как autocomplete должно и не должно работать. Согласно спецификациям HTML, пользовательский агент (в данном случае Chrome) может переопределить autocomplete :

https://www.w3.org/TR/html5/forms.html#autofilling-form-controls:-the-autocomplete-attribute

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

Таким образом, в случае с 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 не установлено вообще, оно по умолчанию включено.

Резюме

Чтобы отключить autocomplete по всей форме:

 

Или если вам динамически нужно это сделать:

 

Чтобы отключить autocomplete на отдельном элементе (независимо от того, какая форма установлена ​​или нет)

  

Или если вам динамически нужно это сделать:

  

И помните, что некоторые пользовательские агенты могут отменить даже ваши самые трудные попытки отключить autocomplete .

Браузер не заботится об автозаполнении = выключен автоматически или даже заполняет учетные данные в неправильном текстовом поле?

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

исправить автозаполнение браузера в: readonly и настроить writeble в фокусе (при щелчке мыши и перемещении по полям)

   

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

  для  

Демо-версия https://jsfiddle.net/danielsuess/n0scguv6/

// UpdateEnd

Кстати, больше информации о моем наблюдении:

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

Вы можете использовать autocomplete="new-password"

   

Работает в:

  • Хром: 53, 54, 55
  • Firefox: 48, 49, 50

для тех, кто ищет решение этого, я, наконец, понял это.

Chrome только подчиняется autocomplete = “off”, если страница является HTML5-страницей (я использовал XHTML).

Я преобразовал свою страницу в HTML5, и проблема исчезла (facepalm).

Виден хром игнорировать autocomplete="off" , я решаю его глупым способом, который использует «поддельный вход», чтобы обмануть хром, чтобы заполнить его вместо заполнения «реального».

Пример:

   

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

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

Поместите этот код в начало вашей формы

 

Затем, для вашего реального поля пароля, используйте

  

Прокомментируйте этот ответ, если он больше не работает или возникает проблема с другим браузером или версией.

Утверждено:

  • Chrome: 49
  • Firefox: 44, 45
  • Край: 25
  • Internet Explorer: 11

До тех пор, пока только на прошлой неделе, два решения ниже оказались для Chrome, IE и Firefox. Но с выпуском Chrome версии 48 (и все еще в 49) они больше не работают:

  1. В верхней части формы:
   
  1. В элементе ввода пароля:

    автозаполнения = «выключено»

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

 setTimeout(function(){$('#PasswordData').prop('disabled', false);}, 50); 

Но это казалось таким сумасшедшим, и я сделал еще несколько поисков и нашел ответы @tibalts в разделе Отключение Chrome Autofill . Его ответ заключается в использовании autocomplete = «new-password» в пароле ввода, и это, похоже, работает во всех браузерах (я сохранил номер исправления № 1 выше на данном этапе).

Вот ссылка в обсуждении разработчика Google Chrome: https://code.google.com/p/chromium/issues/detail?id=370363#c7

Вместо autocomplete = “off” использовать autocomplete = “false” 😉

от: https://stackoverflow.com/a/29582380/75799

autocomplete=off в основном игнорируется в современных браузерах – в основном из-за менеджеров паролей и т. д.

Вы можете попробовать добавить этот autocomplete="new-password" он не полностью поддерживается всеми браузерами, но он работает на некоторых

Начиная с версии Chrome 42, ни одно из решений / взломов в этой теме (по состоянию на 2015-05-21T12:50:23+00:00 ) не работает для отключения автозаполнения для отдельного поля или всей формы.

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

 

Хорошей новостью является то, что, поскольку «подпись формы» повреждена этим, ни одно из полей не автозаполняется, поэтому для очистки фальшивых полей перед отправкой не требуется JS.

Старый ответ:

Единственное, что, по моему мнению, по-прежнему жизнеспособно, – вставить два фиктивных поля типа email и password перед реальными полями. Вы можете установить их для display: none чтобы скрыть их (он недостаточно умен, чтобы игнорировать эти поля):

 

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

 form.addEventListener('submit', function() { form.elements['fake_email'].value = ''; form.elements['fake_password'].value = ''; }); 

Обратите внимание, что очистка значения с помощью Javascript позволяет переопределить автозаполнение. Поэтому, если допустимо нарушение надлежащего поведения с отключенным JS, вы можете упростить все это с помощью автозаполнения JS «polyfill» для Chrome:

 (function(document) { function polyfillAutocomplete(nodes) { for(var i = 0, length = nodes.length; i < length; i++) { if(nodes[i].getAttribute('autocomplete') === 'off') { nodes[i].value = ''; } } } setTimeout(function() { polyfillAutocomplete(document.getElementsByTagName('input')); polyfillAutocomplete(document.getElementsByTagName('textarea')); }, 1); })(window.document); 

После chrome v. 34 установка autocomplete="off" в

не работает

Я внес изменения, чтобы избежать этого раздражающего поведения:

  1. Удалите name и id ввода пароля
  2. Поместите class на вход (например: passwordInput )

(Пока Chrome не будет помещать сохраненный пароль на вход, но форма теперь сломана)

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

 var sI = $(".passwordInput")[0]; $(sI).attr("id", "password"); $(sI).attr("name", "password"); 

В моем случае я использовал hav id="password" name="password" в пароле ввода, поэтому я вернул их перед запуском отправки.

Измените атрибут type="search" ввода на type="search" .

Google не применяет автоматическое заполнение к входам с типом поиска.

Я просто обновился до Chrome 49 и решение Diogo Cid больше не работает.

Я сделал другое обходное решение, скрывающее и удаляющее поля во время выполнения после загрузки страницы.

Chrome теперь игнорирует исходное обходное решение, применяя учетные данные к первому отображаемому type="password" и его предыдущему type="text" , поэтому я скрыл оба поля, используя visibility: hidden; CSS visibility: hidden;

  
.chromeHack-autocomplete { height: 0px !important; width: 0px !important; opacity: 0 !important; padding: 0 !important; margin: 0 !important; } jQuery(window).load(function() { $(".chromeHack-autocomplete").delay(100).hide(0, function() { $(this).remove(); }); });

Я знаю, что это может показаться не очень элегантным, но оно работает.

В Chrome 48+ используйте это решение:

  1. Поместите поддельные поля перед реальными полями:

     
  2. Скрыть поддельные поля:

     .visually-hidden { margin: -1px; padding: 0; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip: rect(0, 0, 0, 0); position: absolute; } 
  3. Ты сделал это!

Также это будет работать для более старых версий.

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

Chrome полностью игнорирует autocomplete = “off”. Хотя JS-хаки могут хорошо работать, я нашел простой способ, который работает на момент написания:

Задайте значение поля пароля для символа управления 8 ( "\x08" в PHP или  в HTML). Это останавливает автоматическое заполнение Chrome полем, потому что оно имеет значение, но фактическое значение не вводится, потому что это символ обратного пространства.

Да, это все еще хак, но это работает для меня. YMMV.

Я решил по-другому. Вы можете попробовать это.

   

После того, как вы попробовали все решения, вот что работает для версии chrome: 45, с формой с паролем:

  jQuery('document').ready(function(){ //For disabling Chrome Autocomplete jQuery( ":text" ).attr('autocomplete','pre'+Math.random(0,100000000)); }); 

Я нашел это решение наиболее подходящим:

 function clearChromeAutocomplete() { // not possible, let's try: if (navigator.userAgent.toLowerCase().indexOf('chrome') >= 0) { document.getElementById('adminForm').setAttribute('autocomplete', 'off'); setTimeout(function () { document.getElementById('adminForm').setAttribute('autocomplete', 'on'); }, 1500); } } 

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

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

В моем случае у меня было поле с текстом заполнителя «Город или почтовый ящик», который я использовал с автозаполнением Google Place. Оказалось, что он пытался автозаполнять, как если бы он был частью адресной формы. Трюк не сработал, пока я не поместил тот же заполнитель в скрытый элемент, как на реальном вводе:

   

У меня была аналогичная проблема, когда поле ввода принимало либо имя, либо электронное письмо. Я установил autocomplete = “off”, но Chrome все еще настаивал на предложениях. Turns out it was because the placeholder text had the words “name” and “email” in it.

Например

  

I got around it by putting a zero width space into the words in the placeholder. No more Chrome autocomplete.

  

Looks like this is fixed! See https://codereview.chromium.org/1473733008

When using a widget like jQuery UI’s Autocomplete make sure to check that it is not adding/changing to autocomplete attribute to off. I found this to be true when using it and will break any work you may have done to override any browser field caching. Make certain that you have a unique name attribute and force a unique autocomplete attribute after the widget initializes. See below for some hints on how that might work for your situation.

    

I’ve solved the endless fight with Google Chrome with the use of random characters.

  

Hope that it will help to other people.

  • Возможно ли иметь автозаполнение с использованием jtextfield и Jlist?
  • Автозаполнение jquery с json-ответом
  • item.geometry.location.kb & item.geometry.location.jb, возвращающий неопределенные
  • Автозаполнение Angularjs от $ http
  • Автозаполнение, применяющее значение, не помеченное в текстовое поле
  • выбор контакта из автозаполнения textview
  • Давайте будем гением компьютера.