Ng-form и autocomplete = "off"

У меня такая угловатая форма

<ng-form name="AddTaskForm" autocomplete="off">
   ......
</ng-form>

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

Как я могу предотвратить отображение в Chrome (и во всех браузерах) выпадающего меню с ранее введенными значениями?

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

enter image description here

Ответ 1

Несмотря на то, что autocomplete является довольно четко определенной частью спецификации HTML5, в Chrome произошла ошибка при использовании свойства autocomplete. Изначально почитая autocomplete="off" (2013), они решили, что разработчики должны использовать его неправильно, а браузер должен просто игнорировать его.

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

(Источник: ошибка Chromium 2015 года, помеченная как WontFix)

В соответствии с Приоритетом избирательных округов:

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

... Что оставляет нас, разработчиков, в неудачном месте поиска обходного пути. Эта статья из MDN хорошо описывает текущее состояние и предлагает решение для установки autocomplete в new-password:

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

Я не уверен, как долго это будет оставаться в силе, но на данный момент (протестировано в Chrome 53 в сентябре 2016 года) это самое простое решение:

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

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

Изменение: Обновленная информация: Более новые версии Chrome еще раз уважают атрибут autocomplete=off, , как указал Александр Абакумов в своем ответе. Он работал на Chrome 68, работает на Chrome 70 для меня.

Ответ 2

autocomplete="off" работает сейчас. Протестировано в текущем Chrome 70.0.3538.110.

Демо.

Ответ 3

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

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

myApp.directive('autocomplete', function() {

    return {    

        restrict: 'A',
        link: function( $scope, el, attr ) {

            el.bind('change', function(e) {

                e.preventDefault();

            }
        }
    }

});