Chrome Autofill охватывает Autocomplete для API Карт Google v3

Я использую Google Maps Javascript v3 для настройки автозаполнения в поле ввода HTML следующим образом:

http://imgur.com/Rm6X2FI.png - (без автозаполнения)

У меня проблема в том, что автозаполнение Chrome закрывает автозаполнение карт следующим образом:

http://imgur.com/7a2QM7L.png - (с автозаполнением)

Я нашел решение в сети пару месяцев назад (см.: Отключение автозаполнения Chrome), но, похоже, это решение больше не имеет никакого эффекта.

<input type="text" name="address" id="address_fake" autocomplete="off" style="display:none">
<input type="text" name="address" id="address" autocomplete="off" placeholder="Address" />

Можно ли как-то остановить отображение автозаполнения Chrome в верхней части списка автозаполнения Карт Google?

РЕДАКТИРОВАТЬ: остановить Google Chrome автозаполнение ввода не обеспечивает решение моей текущей проблемы. Проблема связана с раскрывающимся списком автозаполнения Chrome в поле ввода, а не с тем, что поле ввода автоматически заполняется значением автозаполнения.

Ответы

Ответ 1

Это сводило меня с ума. Иметь такую же проблему. Мы используем скрипты, чтобы вытащить значения полей для пользователя, чтобы выбрать его, и НЕ хотите, чтобы браузер автоматически отключил его. Хром, похоже, является bugger (последняя версия 42.0.2311.135 m), Firefox (FF), с которой мы можем работать.

Таким образом, мы имеем дело с браузером автозаполнения и хромированной автозаполнения, а также. Если я добавлю: <form autocomplete = "off"> наверху, он останавливает автозаполнение в FF и Chrome, но не AUTOFILL в Chrome. Изменение "off" на "false" ничего не делает для любого браузера. Решена проблема FF, но не Chrome, поскольку она показывает уродливое поле AUTOFILL над содержимым.

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

Теперь странно, что если вы измените значение в отдельном поле ввода с "off" на "false", то, похоже, он встряхнет Chrome, и для поля у вас есть этот параметр для автозаполнения = "false", тогда вы ТОЛЬКО видите значения автозаполнения (если что-то было введено в поле раньше), и все остальные поля ввода ничего не показывают! Вы также можете установить это значение как no или xx или что-то еще, и похоже на Chrome barfs на недопустимое значение для автозаполнения, и форма реагирует странно. Если у вас есть 5 полей и установите это для третьего поля, поля 1,2, 4 и 5 пусты, но поле 3 показывает автозаполнение.

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

<!DOCTYPE html>
<html>

<head>
  <title>Signup</title>
</head>

<body>
  <form autocomplete="off" method="post">
    First name:
    <input name="Firstname" type="text">
    <br />Last name:
    <input name="Lastname" type="text" style="width: 124px">
    <br />Address:
    <input autocomplete="false" name="Address" type="text" style="width: 383px">
    <br />Phone number:
    <input name="Phone" type="text">
    <br />E-mail:
    <input name="Email" type="text" style="width: 151px">
    <br />
    <input type="submit">
  </form>
</body>

</html>

Мое решение отключить автозаполнение и автозаполнение Chrome (вы можете поместить скрытое поле ввода сверху или снизу ниже submit). Добавьте этот <input autocomplete = "false" name = "hidden" type = "text" style = "display: none;"> в код:

<!DOCTYPE html>
<html>

<head>
  <title>Signup</title>
</head>

<body>
  <form autocomplete="off" method="post">
    <input autocomplete="false" name="hidden" type="text" style="display:none;">
    <br />First name:
    <input name="Firstname" type="text">
    <br />Last name:
    <input name="Lastname" type="text" style="width: 124px">
    <br />Address:
    <input name="Address" type="text" style="width: 383px">
    <br />Phone number:
    <input name="Phone" type="text">
    <br />E-mail:
    <input name="Email" type="text" style="width: 151px">
    <br />
    <input type="submit">
  </form>
</body>

</html>

Итог: Chrome придерживается автозаполнения = выключен, но проблема с автозаполнением Chrome - проблема. Надеюсь это поможет.

Ответ 2

Ни один из вышеперечисленных ответов не работал для меня (Chrome 64.0.3282.186, x64 windows).

TL; DR: Код Google Maps меняется autocomplete атрибут off, так что даже если вы установите его на new-password, вы все равно получите автозаполнение. Хак, который я использую, - это прослушивать мутации этого атрибута и затем переопределять его. Примечание. Простое изменение атрибута после вызова в Google Maps не работает.

Настройте MutationObserver перед инициализацией Автозаполнения Карт Google, который немедленно прекращает прослушивание мутаций, а затем устанавливает атрибут new-password.

    var autocompleteInput = document.getElementById("id-of-element");

    var observerHack = new MutationObserver(function() {
        observerHack.disconnect();
        $("#id-of-element").attr("autocomplete", "new-password");
    });

    observerHack.observe(autocompleteInput, {
        attributes: true,
        attributeFilter: ['autocomplete']
    });

Ответ 3

Решение jQuery:

$('#address').focus(function() {
    $(this).attr('autocomplete', 'new-password');
});

Ответ 4

Чтобы процитировать Elmux, прокомментируйте ответ fooobar.com/questions/10066636/... выше:

В Chrome 71 я удалил атрибут-заполнитель из консоли, и он работает автоматически. Если я изменю значение атрибута на что-то другое, оно тоже будет работать. Наконец, избегайте использования термина "Адрес" в атрибуте заполнителя. - Elmux

Для меня (30 декабря 2018 года, Chrome 71) это был правильный, но не интуитивный ответ.

Ответ 5

Благодаря GSTAR. Вместо Jquery я использовал приведенный ниже код, и это работает для меня

<input type="text" value="" id="address" class="form-control" placeholder="Enter a location" autocomplete="new-password" onfocus="this.setAttribute('autocomplete', 'new-password');">

Ответ 6

Для тех, кто использует Angularjs, я создал директиву, основанную на ответе @Rimmel, который работает для меня в Chrome 66.0.3359.139. Ниже приведен код:

(function(){
  'use strict'; 
  angular.module('app.directive')
    .directive('stopAutofill', stopAutofillDirective);

  function stopAutofillDirective() {
      return {
        restrict: 'A',
        link: function (scope, element) {
            var observerHack = new MutationObserver(function () {
                observerHack.disconnect();
                element.attr("autocomplete", "new-password");
            });

            observerHack.observe(element[0], {
                attributes: true,
                attributeFilter: ['autocomplete']
            });
        }
      };
    };
})();

Ответ 7

Используйте autocomplete = "new-password" для поля ввода, для которого вы хотите отключить автозаполнение. Google Chrome намеренно игнорирует autocomplete = "off | false", но если вы установите "новый пароль", то он игнорирует автозаполнение.

Также проверьте способ использования автозаполнения API Google Адресов, в идеале это должен быть подход к реализации: https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform

Ответ 8

Я попробовал образец из Google Address Finder и получил ту же проблему:

enter image description here

Обновленный ответ

С новой версией хром вам нужно добавить: autocomplete="off" на ваш вход:

<input id="autocomplete" autocomplete="off" placeholder="Enter your address" onFocus="geolocate()" type="text"/>

Оригинальный ответ - обход

Это вход автокомплекта, который имеет событие: onFocus="geolocate()":

<input id="autocomplete" placeholder="Enter your address" onFocus="geolocate()" type="text"/>

Я добавил эту строку для геолокации, чтобы скрыть автозаполнение:

function geolocate() {
    // add this line to hide the autocomplete
    $("#autocomplete").attr("autocomplete", "new-password");

    // other stuff
}

Ответ 9

Временное решение:

$('#Name').on('mouseup keyup', function () {
        var val = $('#Name').val();
        val = val.length;
        if (val === 0) {
            $('#Name').attr('autocomplete', 'on');
        }
        else {
            $('#Name').attr('autocomplete', 'new-password');
        }
    }).on('mousedown keydown', function () {
        var val = $('#Name').val();
        var length = val.length;
        if (!length) {
            $('#Name').attr('autocomplete', 'new-password');
        }
    })

Ответ 10

Мне удалось исправить эту проблему для Chrome 69, изменив местозаполнитель ввода.

У меня было 2 входа, привязанных к автозаполнению Google Адресов. Как только вы щелкнете по полю, автозаполнение отобразится, предлагая варианты автозаполнения. У меня также была настройка прослушивателя для изменения атрибута "автозаполнение" ввода на что-то случайное, например "no-google-autofill". Это работало хорошо, пока я не обновился до Chrome 69.

В конце концов, я исправил это, изменив местозаполнитель ввода с "Почтовый индекс" на "Площадь". Судя по всему, автозаполнение вызвано из-за заполнителя. Иногда Chrome пытается быть слишком умным для своего же блага.

Ответ 11

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

Короче говоря, то, что раньше было полем с именем "cust_address", стало "cust_a734ohljehgto87y34hpwy9pho3ghseddress", так же как и идентификатор поля. Мой код ввода текстового поля выглядел так:

'<input type=text name="cust_a%sessionid%ddress" id="cust_a%sessionid%ddress" value="" autocomplete="new-password">'

Для дополнительных мер предосторожности я добавил autocomplete = "new-password", который, кажется, работает для других полей, но не для адреса, хотя, кажется, он иногда работает, и я не определился, что вызывает его сбой или работу (пока)...

Когда мой пользователь запрашивает форму, я загружаю ее в переменную в PHP и заменяю все экземпляры% sessionid% идентификатором сеанса текущего сеанса пользователя, а затем выводю его в браузер.

До сих пор это работало как прелесть, но моя система все еще находится на стадии бета-тестирования, поэтому Chrome не контролировал тысячи входов, чтобы Chrome мог понять логику и обойти ее - надеюсь, они не тратят слишком много времени на обход эти исправления, особенно с учетом того, что GOOGLES OWN SYSTEM переопределяет GOOGLES OWN SYSTEM с автозаполнением, переопределяя автозаполнение из API календарных мест!

Ответ 12

У меня были поля имени пользователя и пароля на той же странице.

Поместите простой неиспользуемый <form></form> вокруг них, и это решило проблему автозаполнения.

Ответ 13

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

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

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

Я надеюсь, что это может помочь другим.

Ответ 14

<input id="autocomplete" autocomplete="nope" type="text" onFocus="this.setAttribute('autocomplete','nope'); geolocate();">

Ответ 15

попробуйте добавить это в свой файл css:

.pac-container{
    display:none!important;
}