it-swarm.com.ru

Переопределить заполнение формы браузера и подсветку ввода с помощью HTML/CSS

У меня есть 2 основных формы - войти и зарегистрироваться, обе на одной странице. Теперь у меня нет проблем с автозаполнением формы входа, но форма автозаполнения также заполняется, и мне это не нравится.

Кроме того, стили форм получают желтый фон, который мне не удается переопределить, и я не хочу использовать встроенный CSS для этого. Что я могу сделать, чтобы они перестали быть желтыми и (возможно) автозаполнение? Заранее спасибо!

117
casraf

для автозаполнения вы можете использовать:

<form autocomplete="off">

в отношении проблемы окраски:

из вашего скриншота видно, что webkit генерирует следующий стиль:

input:-webkit-autofill {
    background-color: #FAFFBD !important;
}

1) поскольку # id-стили еще более важны, чем стили .class, работают следующие могут:

#inputId:-webkit-autofill {
    background-color: white !important;
}

2) если это не сработает, вы можете попробовать установить стиль с помощью javascript программно 

$("input[type='text']").bind('focus', function() {
   $(this).css('background-color', 'white');
});

3) если это не сработает, ты обречен :-) Учтите это: Это не скроет желтый цвет, но сделает текст снова читаемым.

input:-webkit-autofill {
        color: #2a2a2a !important; 
    }

4) решение css/javascript:

cSS:

input:focus {
    background-position: 0 0;
}

и следующий javascript должен быть запущен при загрузке:

function loadPage()
{
    if (document.login)//if the form login exists, focus:
    {
        document.login.name.focus();//the username input
        document.login.pass.focus();//the password input
        document.login.login.focus();//the login button (submitbutton)
    }
}

например:

<body onload="loadPage();">

удачи :-)

5) Если ничего из вышеперечисленного не работает, попробуйте удалить элементы ввода, клонировать их, а затем поместить клонированные элементы обратно на страницу (работает в Safari 6.0.3)

<script>
function loadPage(){

    var e = document.getElementById('id_email');
    var ep = e.parentNode;
    ep.removeChild(e);
    var e2 = e.cloneNode();
    ep.appendChild(e2);

    var p = document.getElementById('id_password');
    var pp = p.parentNode;
    pp.removeChild(p);
    var p2 = p.cloneNode();
    pp.appendChild(p2);
}

document.body.onload = loadPage;
</script>

6) С здесь :

if (navigator.userAgent.toLowerCase().indexOf("chrome") >= 0) {
    $(window).load(function(){
        $('input:-webkit-autofill').each(function(){
            var text = $(this).val();
            var name = $(this).attr('name');
            $(this).after(this.outerHTML).remove();
            $('input[name=' + name + ']').val(text);
        });
    });
}
134
Phil Rykoff

Обманите его «сильной» внутренней тенью:

input:-webkit-autofill {
    -webkit-box-shadow:0 0 0 50px white inset; /* Change the color to your own background color */
    -webkit-text-fill-color: #333;
}

input:-webkit-autofill:focus {
    -webkit-box-shadow: /*your box-shadow*/,0 0 0 50px white inset;
    -webkit-text-fill-color: #333;
} 
163
Tamás Pap

Добавьте это правило CSS, и желтый цвет фона исчезнет. :)

input:-webkit-autofill {
    -webkit-box-shadow: 0 0 0px 1000px white inset;
}
22
MCBL
<form autocomplete="off">

Почти все современные браузеры будут уважать это.

14
Jason Kester

После 2 часов поиска кажется, что Google Chrome все-таки переопределяет желтый цвет, но я нашел исправление Это будет работать для парения, фокусировки и т.д. Все, что вам нужно сделать, это добавить !important к нему.

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
    -webkit-box-shadow: 0 0 0px 1000px white inset !important;
}

это полностью удалит желтый цвет из полей ввода

12
don

Вы также можете изменить атрибут name ваших элементов формы, чтобы он создавался так, чтобы браузер не отслеживал его. ОДНАКО Firefox 2.x + и Google Chrome, похоже, не имеют особых проблем с этим, если URL-адрес запроса идентичен. Попробуйте в основном добавить параметр запроса соли и имя поля соли для формы регистрации.

Однако я думаю, что autocomplete = "off" по-прежнему является лучшим решением :)

3
Dmitriy Likhten

Иногда автозаполнение в браузере все еще выполняется автоматически, когда у вас есть только код в элементе <form>.

Я также попытался поместить его в элемент <input>, и он работал лучше.

<form autocomplete="off">  AND  <input autocomplete="off">

Однако поддержка этого атрибута прекращается, прочитайте https://bugzilla.mozilla.org/show_bug.cgi?id=956906#c1

https://bugzilla.mozilla.org/show_bug.cgi?id=956906


Еще одна работа, которую я нашел, - это удаление заполнителей внутри полей ввода, которые предполагают, что это поле электронной почты, имени пользователя или телефона (т. Е. «Ваша электронная почта», «Электронная почта» и т.д.)

enter image description here

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

3
andstud.io

Вы можете отключить автозаполнение с HTML5 (через autocomplete="off"), но вы НЕ МОЖЕТЕ переопределить подсветку браузера. Вы можете попробовать поиграться с ::selection в CSS (большинству браузеров для этого нужен префикс поставщика), но это, вероятно, вам тоже не поможет.

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

3
Alan Plum

Это устраняет проблему как в Safari, так и в Chrome

if(navigator.userAgent.toLowerCase().indexOf("chrome") >= 0 || navigator.userAgent.toLowerCase().indexOf("safari") >= 0){
window.setInterval(function(){
    $('input:-webkit-autofill').each(function(){
        var clone = $(this).clone(true, true);
        $(this).after(clone).remove();
    });
}, 20);
}
2
Arjan

Если он находится в поле ввода, вы пытаетесь "снять желтый" ...

  1. Установите цвет фона с помощью css ... скажем, #ccc (светло-серый).
  2. Add value = "sometext", который временно заполняет поле "sometext"
  3. (необязательно) Добавьте немного javascript, чтобы прояснить «sometext», когда вы собираетесь вставить настоящий текст.

Итак, это может выглядеть так:

<input id="login" style="background-color: #ccc;" value="username"
    onblur="if(this.value=='') this.value='username';" 
    onfocus="if(this.value=='username') this.value='';" />
1
whitehorse

Простое решение для JavaScript для всех браузеров:

setTimeout(function() {
    $(".parent input").each(function(){
        parent = $(this).parents(".parent");
        $(this).clone().appendTo(parent);   
        $(this).attr("id","").attr("name","").hide();
    }); 
}, 300 );

Клонировать ввод, сбросить атрибут и скрыть исходный ввод

0
Mite

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

<!-- unused field to stop browsers from overriding form style -->
<input type='password' style = 'display:none' />
0
Kt Mack

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

<input class="input input-xxl input-watery" type="text" name="password"/>

Автозаполнение начинается после загрузки окна. Это нормально. Но когда тип вашего поля не «пароль», браузер не знал, какие поля он должен заполнить. Таким образом, в полях формы не будет автозаполнения.

После этого привязать событие focusin к полю пароля, например. в магистрали:

'focusin input[name=password]': 'onInputPasswordFocusIn',

В onInputPasswordFocusIn просто измените тип поля на пароль, просто проверив:

if (e.currentTarget.value === '') {
    $(e.currentTarget).attr('type', 'password');
}

Вот и все! 

UPD: эта штука не работает с отключенным JavaSciprt

UPD в 2018 году. Также нашел какой-то забавный трюк. Установите атрибут readonly в поле ввода и удалите его в событии focus. Во-первых, запретить браузеру автозаполнение полей, во-вторых, позволит вводить данные.

0
volodymyr3131

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

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

var initialFocusedElement = null
  , $inputs = $('input[type="text"]');

var removeAutofillStyle = function() {
  if($(this).is(':-webkit-autofill')) {
    var val = this.value;

    // Remove change event, we won't need it until next "input" event.
    $(this).off('change');

    // Dispatch a text event on the input field to trick the browser
    this.focus();
    event = document.createEvent('TextEvent');
    event.initTextEvent('textInput', true, true, window, '*');
    this.dispatchEvent(event);

    // Now the value has an asterisk appended, so restore it to the original
    this.value = val;

    // Always turn focus back to the element that received 
    // input that caused autofill
    initialFocusedElement.focus();
  }
};

var onChange = function() {
  // Testing if element has been autofilled doesn't 
  // work directly on change event.
  var self = this;
  setTimeout(function() {
    removeAutofillStyle.call(self);
  }, 1);
};

$inputs.on('input', function() {
  if(this === document.activeElement) {
    initialFocusedElement = this;

    // Autofilling will cause "change" event to be 
    // fired, so look for it
    $inputs.on('change', onChange);
  }
});
0
Ernests Karlsons

На скриншоте, на который вы ссылаетесь, сказано, что WebKit использует селектор input:-webkit-autofill для этих элементов. Вы пытались вставить это в свой CSS?

input:-webkit-autofill {
    background-color: white !important;
}

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

0
benzado

Элемент form имеет атрибут autocomplete, который можно установить равным off. Что касается CSS, директива !important после свойства предотвращает его переопределение:

background-color: white !important;

Только IE6 не понимает этого.

Если я вас неправильно понял, есть также свойство outline, которое вы можете найти полезным.

0
zneak

Я видел функцию автозаполнения панели инструментов Google, отключенную с помощью JavaScript. Это может работать с некоторыми другими инструментами автозаполнения; Я не знаю, поможет ли это браузерам, встроенным в автозаполнение.

<script type="text/javascript"><!--
  if(window.attachEvent)
    window.attachEvent("onload",setListeners);

  function setListeners(){
    inputList = document.getElementsByTagName("INPUT");
    for(i=0;i<inputList.length;i++){
      inputList[i].attachEvent("onpropertychange",restoreStyles);
      inputList[i].style.backgroundColor = "";
    }
    selectList = document.getElementsByTagName("SELECT");
    for(i=0;i<selectList.length;i++){
      selectList[i].attachEvent("onpropertychange",restoreStyles);
      selectList[i].style.backgroundColor = "";
    }
  }

  function restoreStyles(){
    if(event.srcElement.style.backgroundColor != "")
      event.srcElement.style.backgroundColor = "";
  }//-->
</script>
0
Adam

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

$(window).load(function() {
    setTimeout(function() {
        $('input:-webkit-autofill')
            .val('')
            .css('-webkit-box-shadow', '0 0 0px 1000px white inset')
            .attr('readonly', true)
            .removeAttr('readonly')
        ;
    }, 50);
});

Не стесняйтесь комментировать, я открыт для всех улучшений, если вы найдете некоторые.

0
TwystO