Чи існує W3C дійсний спосіб відключити автозаповнення у формі HTML?


424

Використовуючи xhtml1-transitional.dtddoctype, збирайте номер кредитної картки із наступним HTML

<input type="text" id="cardNumber" name="cardNumber" autocomplete='off'/>

позначить попередження про валідатор W3C:

немає атрибута "автозаповнення".

Чи існує спосіб W3C / стандарти відключити автоматичне заповнення браузера на чутливих полях у формі?


10
Ви впевнені, що возитися з налаштуваннями автозаповнення користувача - це те, що ви хочете зробити? Якщо вони увімкнули, їм це, мабуть, подобається. Автозаповнення - це цілком функція, пов’язана з браузером, подібно до кнопки, яка дозволяє користувачеві змінювати розмір шрифту тощо. Ви не повинні втручатися у їхні бажання
rmeador

113
Навіть на щось таке чутливе, як номер кредитної картки? Я не можу придумати дуже багато людей, які хотіли б цього пам’ятати, тим більше, що автоматичне завершення за замовчуванням у більшості браузерів. Якщо вони хочуть, щоб це запам'яталося таким поганим, вони можуть використовувати щось, що заповнює такі форми, як панель інструментів Google.
мат б

13
Мій випадок використання дещо інший - я прокатую власне автозаповнення, і я не хочу, щоб він суперечив браузеру. Я тільки що виявив, що autocomplete = "off" недійсний, але, схоже, немає іншого простого рішення (
вводити

13
@rmeador, тому що іноді ми хочемо надати більш зручну альтернативу стандартному вікні автоматичних пропозицій. @corydoras, будь ласка, не натискайте на вагу вашої OSX, це не корисно для вирішення цього питання.
Джош М.

12
Проблема полягає в тому, що банки несуть відповідальність за торговця, якщо відбулася шахрайська операція ... навіть якщо вина клієнта на 100%. Тому в деяких умовах правомірно відключити функцію для замовника.
Олександр Х. Тремблей

Відповіді:


421

Ось хороша стаття з MDC, в якій пояснюються проблеми (та їх вирішення) щодо автоматичного завершення. Microsoft також опублікував щось подібне і тут .

Якщо чесно, якщо це щось важливе для ваших користувачів, таким чином "порушення" стандартів здається доцільним. Наприклад, Amazon використовує атрибут 'autocomplete' зовсім небагато, і він, здається, працює добре.

Якщо ви хочете видалити попередження цілком, ви можете використовувати JavaScript, щоб застосувати атрибут до браузерів, які його підтримують (IE і Firefox є важливими браузерами), використовуючи someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" );

Нарешті, якщо ваш сайт використовує HTTPS, IE автоматично вимикає автозавершення (як це роблять деякі інші браузери, наскільки я знаю).

Оновлення

Оскільки ця відповідь все ще отримує досить багато оновлень, я просто хотів зазначити, що в HTML5 ви можете використовувати атрибут "автозаповнення" у вашому елементі форми. Дивіться документацію на W3C для цього.


41
Схоже, Firefox не вимикає автозаповнення на https, але це корисна інформація. Дякую!
мат б

3
Safari не поважає атрибут autocomplete = "off". Див stackoverflow.com/questions/22817801 / ...
Skurpi

1
autocompleteможе використовуватися не лише на formелементі , а offзначення працює принаймні вchromium-40.0.2214.115
x-yuri

Схоже, w3c розширює стандарти для автозаповнення в HTML5.1 (у проекті станом на цей коментар) w3c.github.io/html/…
Джастін Нафі,

1
Якщо нічого не працює, використовуйте textarea замість текстового поля, щоб вимкнути автоматичне заповнення.
Бсіен

64

Я був би дуже здивований, якби W3C запропонував би спосіб, який би працював з (X) HTML4. Функція автозаповнення повністю базується на веб-переглядачах та була впроваджена протягом останніх років (вже після написання стандарту HTML4).

Не здивуємось, якби у HTML5 був такий.

Змінити: Як я думав, HTML5 робить є що особливість. Щоб визначити свою сторінку як HTML5, використовуйте такий доктіп (тобто: введіть це як перший текст у вихідному коді). Зауважте, що не всі веб-переглядачі підтримують цей стандарт, оскільки він все ще знаходиться в чернетковій формі.

<!DOCTYPE html>

7
Усі браузери очікують, що старіші версії Konqueror підтримують його. Навіть IE6 підтримує це. Це доктрип.
BalusC

56

HTML 4 : Ні

HTML 5 : Так

Атрибут автозаповнення - це перелічений атрибут. Атрибут має два стани. На ключових слова , карти в включеному стані, і від ключового слова карти в відключеному стані. Атрибут також може бути пропущений. За замовчуванням відсутнє значення - стан увімкнено . Стан вимкнено вказує на те, що за замовчуванням елементи керування форми у формі будуть вимкнено назву поля автозаповнення ; стан увімкнення вказує на те, що за замовчуванням для елементів управління у формі autofillім’я поля буде встановлено на "увімкнено".

Довідка: W3


@ freestock.tk Так, це зрозуміліше, ніж усі інші. Простота має значення.
OverCoder

32

Ні, але автоматичне заповнення браузера часто викликається полем, що має той самий nameатрибут, що і поля, які раніше були заповнені. Якби ви могли спровокувати розумний спосіб отримати рандомізовану назву поля , автозаповнення не зможе витягнути жодне раніше введене значення для поля.

Якби ви мали надати полі введення назву типу " email_<?= randomNumber() ?>", а потім мати сценарій, який отримує цю петлю даних через змінні POST або GET, шукає щось, що відповідає шаблону " email_[some number]", ви можете зняти це, і це матиме ( практично) гарантований успіх, незалежно від браузера .


6
Це ускладнить автоматичне тестування.
Девід Уотерс

14
Буде складніше автоматичне тестування, лише якщо ваше програмне забезпечення для тестування не справляється з перевіркою / зчитуванням полів, які, можливо, додають до них випадкове число. Можливо, час для оновлення програмного забезпечення для автоматичного тестування.
коридори

8
Інформація про автозаповнення все ще зберігатиметься в каталозі даних браузера, чи не так?
Joey Adams

2
Імовірно. Але не можна було очікувати, що коли-небудь дійсно з’явиться знову для користувача.
Phantom Watson

1
Зараз Chrome використовує атрибут type = "password", а не атрибут імені для певного сайту. У мене є name = "newpassword" autocomplete = 'off' type = "password", і він автоматично заповнюється! Якщо змінити тип, немає автозаповнення
Енігма Plus

31

Ні, хороша стаття тут у Mozila Wiki .

Я б продовжував використовувати інвалід attribute. Я думаю, що саме тут прагматизм повинен перемогти валідацію.


23

Як щодо налаштування його за допомогою JavaScript?

var e = document.getElementById('cardNumber');
e.autocomplete = 'off'; // Maybe should be false

Це не ідеально, але ваш HTML буде дійсним.


8
Використання javascript в якості вирішення помилок перевірки - це як підмітання пилу під килим. Незважаючи на те, що HTML-документ може стати дійсним, одержувана сторінка HTML + JS не буде.
fregante


11

Якщо ви використовуєте jQuery, ви можете зробити щось подібне:

$(document).ready(function(){$("input.autocompleteOff").attr("autocomplete","off");});

і використовуйте клас autocompleteOff там, де вам потрібно:

<input type="text" name="fieldName" id="fieldId" class="firstCSSClass otherCSSClass autocompleteOff" />

Якщо ви хочете, щоб усі були ваші дані autocomplete=off, ви можете просто скористатися цим:

$(document).ready(function(){$("input").attr("autocomplete","off");});

4
Просто використовувати доктрип HTML5 простіше і краще.
BalusC

5
так чи інакше не дійсний html, він просто встановлює (недійсний) autocompleteатрибут іншим чином, ніж у html
matt b

Цей код не працює для мене; Я використав, $('input.autocompleteOff').val('');що здається нормально.
dqd

5
Використання javascript в якості вирішення помилок перевірки - це як підмітання пилу під килим. Незважаючи на те, що HTML-документ може стати дійсним, одержувана сторінка HTML + JS не буде.
fregante

8

Ще один спосіб - який також допоможе забезпечити безпеку - називати поле вводу чимось іншим щоразу, коли ви показуєте його: як капфа. Таким чином, сеанс може читати лише одноразовий вхід, а автоматичне завершення нічого не може тривати.

Лише питання щодо питання rmeador про те, чи варто вам втручатися у роботу веб-переглядача: Ми розробляємо системи управління контактами та CRM, і коли ви вводите дані інших людей у ​​форму, вам не потрібно, щоб вони постійно пропонували ваші власні дані.

Це працює для наших потреб, але тоді ми маємо розкіш сказати користувачам отримати гідний браузер :)

autocomplete='off' 

8

autocomplete="off" це має вирішити проблему для всіх сучасних браузерів.

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

У поточних версіях браузерів Gecko атрибут автозаповнення працює чудово. Для попередніх версій, повертаючись до Netscape 6.2, він працював за винятком форм з "Адреса" та "Ім'я"

Оновлення

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

autocomplete="nope"

Оскільки це випадкове значення не є valid one, браузер відмовиться.

Документація


Сучасні браузери не поважають автозаповнення = вимкнено за вибором : / На жаль.
Олексій

@Alexus додав кілька оновлень ... Інтернет дуже швидко змінився
Emilio Gort

6

Використання випадкового атрибута 'name' працює для мене.

Я скидаю атрибут імені під час надсилання форми, щоб ви все одно могли отримати доступ до нього за назвою, коли форму надсилається. (використовуючи атрибут id для збереження імені)


5

Зауважте, що існує деяка плутанина щодо розташування атрибута автозаповнення. Він може бути застосований або до всього тегу FORM, або до окремих тегів INPUT, і це насправді не було стандартизовано перед HTML5 (що явно дозволяє обидва місця ). Більш старі документи, особливо в цій статті Mozilla, згадується лише тег FORM. У той же час деякі сканери безпеки шукатимуть автозаповнення лише у тезі INPUT та скарзяться, якщо він відсутній (навіть якщо він є у батьківській ФОРМІ). Більш детальний аналіз цього безладу розміщено тут: Плутанина щодо атрибутів AUTOCOMPLETE = OFF у формах HTML .


3

Не ідеально, але ви можете змінювати ідентифікатор та ім'я текстового поля щоразу, коли ви їх рендеруєте - вам також доведеться відстежувати його сторону сервера, щоб ви могли отримати дані.

Не впевнений, чи спрацює це чи ні, була лише думка.


2

Я думаю, що існує простіший спосіб. Створіть прихований вхід з випадковим іменем (через javascript) і встановіть ім'я користувача. Повторіть із паролем. Таким чином ваш бекенд-скрипт точно знає, що таке відповідна назва поля, зберігаючи автозаповнення в темряві.

Я, мабуть, помиляюся, але це просто ідея.


2
if (document.getElementsByTagName) {
    var inputElements = document.getElementsByTagName("input");
    for (i=0; inputElements[i]; i++) {
        if (inputElements[i].className && (inputElements[i].className.indexOf("disableAutoComplete") != -1)) {
            inputElements[i].setAttribute("autocomplete","off");
        }
    }
}

-1

Це рішення працює зі мною:

$('form,input,select,textarea').attr("autocomplete", "nope");

якщо ви хочете використовувати автозаповнення в цьому регіоні: додайте autocomplete="false"елемент ex:

<input id="search" name="search" type="text" placeholder="Name or Code" autcomplete="false">

-5

Дійсне автозаповнення вимкнено

<script type="text/javascript">
    /* <![CDATA[ */
    document.write('<input type="text" id="cardNumber" name="cardNumber" autocom'+'plete="off"/>');
    /* ]]> */ 
</script>

13
звичайно, якщо у користувача був відключений JS, він не може виконати замовлення, оскільки не може ввести номер своєї картки? Краще доповнити атрибут через JS, я б сказав - найгірше, JS off дає поле номера картки з потенціалом для автоматичного заповнення, але принаймні вони можуть оформити замовлення ... лише думка :)
Terry_Brown

3
Це навіть не смішно.
Рікардо Піпер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.