Определение момента заполнения автозаполнения

После долгой борьбы я наконец нашел единственный способ очистить стили автозаполнения в каждом браузере:

$('input').each(function() {
    var $this = $(this);

    $this.after($this.clone()).remove();
});

Проблема в том, что его нельзя запустить в load, потому что автозаполнение полей происходит когда-то постфактум. Прямо сейчас я запускаю его с таймаутом в 100 миллисекунд после load:

// Kill autofill styles
$(window).on({
    load: function() {
        setTimeout(function() {
            $('.text').each(function() {
                var $this = $(this);

                $this.after($this.clone()).remove();
            });
        }, 100);
    }
});

и это кажется безопасным даже для самых медленных систем, но на самом деле не элегантно. Есть ли какое-то надежное событие или проверка, которую я могу сделать, чтобы увидеть, завершено ли автозаполнение?

РЕДАКТИРОВАТЬ: это автозаполнение.

http://dl.dropbox.com/u/2463964/autofill.png


person Ry-♦    schedule 17.03.2012    source источник
comment
Просто любопытно, почему вы хотите очистить поля автозаполнения формы?   -  person j08691    schedule 17.03.2012
comment
@ j08691: я не хочу очищать поля автозаполнения (это не то, что это делает), я хочу очистить уродливый желтый фон, который также нельзя изменить в CSS.   -  person Ry-♦    schedule 17.03.2012
comment
@NicolaPeluchetti: см. Отредактировать. Нет, это не плагин.   -  person Ry-♦    schedule 17.03.2012
comment
Срабатывает ли функция onChange, когда они заполняются автоматически?   -  person ajax333221    schedule 17.03.2012
comment
Попробуйте это значение атрибута: autocomplete='off' на входах.   -  person gdoron is supporting Monica    schedule 17.03.2012
comment
@ ajax333221: К сожалению, нет.   -  person Ry-♦    schedule 17.03.2012
comment
@gdoron: я не хочу отключать автозаполнение. Я хочу отключить его стили.   -  person Ry-♦    schedule 17.03.2012


Ответы (4)


Обнаружена ошибка на странице http://code.google.com/p/chromium/issues/detail?id=46543#c22, в связи с этим, похоже, что в конечном итоге может (должно) стать возможным просто перезаписать стиль по умолчанию с помощью селектора !important, который будет самое элегантное решение. Код будет примерно таким:

input {
    background-color: #FFF !important;
}

На данный момент, хотя ошибка все еще открыта, и похоже, что ваше хакерское решение является единственным решением для Chrome, однако а) решение для Chrome не требует setTimeout и б) похоже, что Firefox может уважать флаг !important или какой-то селектор CSS с высоким приоритетом, как описано в Переопределить заполнение форм и выделение ввода в браузере с помощью HTML / CSS. Это помогает?

person conartist6    schedule 17.03.2012
comment
К сожалению, для этого действительно требуется setTimeout, и Firefox имеет ту же проблему. Поверьте, я продолжаю пробовать вариации обоих, пока мы говорим :) - person Ry-♦; 17.03.2012
comment
Поток, который я добавил в конце, также имеет решение, которое было отмечено как работающее, которое заключается в использовании селектора input: focus и использовании javascript onload для поочередного фокусирования каждого элемента формы. - person conartist6; 18.03.2012
comment
Я видел это, но, как ни странно, у меня это не работает. Я использую Chrome Canary, так что, возможно, эта ошибка была исправлена ​​:) - person Ry-♦; 18.03.2012

Если вы используете Chrome или Safari, вы можете использовать селектор input:-webkit-autofill CSS для получения автозаполненных полей.

Пример кода обнаружения:

setInterval(function() {
    var autofilled = document.querySelectorAll('input:-webkit-autofill');
    // do something with the elements...
}, 500);
person Tyilo    schedule 17.03.2012
comment
Я знаю об этом селекторе. Однако мне не нужны ни setInterval, ни setTimeout в моем коде. - person Ry-♦; 17.03.2012
comment
Это НАМНОГО лучшее решение проблемы Chrome и автозаполнения, которое я когда-либо видел. input: -webkit-autofill намного лучше, чем опрос и setTimeout () и т. д. БОЛЬШОЕ СПАСИБО за то, что действительно предоставили ответ на эту давнюю проблему! - person ChrisN; 05.06.2015
comment
@ChrisN, в этом ответе используется setInterval. - person Ry-♦; 07.07.2015

Я предлагаю вам в первую очередь избегать автозаполнения, а не пытаться обмануть браузер

<form autocomplete="off">

Дополнительная информация: http://www.whatwg.org/specs/web-forms/current-work/#the-autocomplete

Если вы хотите сохранить режим автозаполнения, но изменить стиль, возможно, вы можете сделать что-то вроде этого (jQuery):

$(document).ready(function() { 
  $("input[type='text']").css('background-color', 'white');
});
person Marcos Besteiro López    schedule 02.04.2012
comment
Пожалуйста, прочтите комментарии. Мы установили, что я не хочу отключать автозаполнение. Что касается установки background-color на white, это не работает. Именно поэтому мне нужен обходной путь. - person Ry-♦; 02.04.2012
comment
Просто прочтите, извините @minitech, извините, я действительно думаю, что вам понадобится тайм-аут, так как через некоторое время формы заполняются самим браузером, а не DOM - person Marcos Besteiro López; 03.04.2012

$(window).load(function()
{
    if ($('input:-webkit-autofill'))
    {
        $('input:-webkit-autofill').each(function()
        {
            $(this).replaceWith($(this).clone(true,true));
        });
        // RE-INITIALIZE VARIABLES HERE IF YOU SET JQUERY OBJECT'S TO VAR FOR FASTER PROCESSING
    }
});

Я заметил, что опубликованное вами решение jQuery не копирует вложенные события. Опубликованный мной метод работает для jQuery 1.5+ и должен быть предпочтительным решением, поскольку он сохраняет присоединенные события для каждого объекта. Если у вас есть решение для перебора всех инициализированных переменных и их повторной инициализации, тогда будет доступно полное 100% рабочее решение jQuery, в противном случае вам придется повторно инициализировать установленные переменные по мере необходимости.

например, вы делаете: var foo = $ ('# foo');

тогда вам нужно будет позвонить: foo = $ ('# foo');

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

person Richard Vannauker    schedule 15.02.2013
comment
Однако это определенно не мое предпочтительное решение, потому что а) оно использует обнюхивание браузера, что неверно, потому что Firefox имеет ту же ошибку, и б) оно все еще не работает, потому что нет тайм-аута. - person Ry-♦; 15.02.2013
comment
В какой версии Firefox есть ошибка? Поэтому я могу соответствующим образом отредактировать свой комментарий, потому что моя текущая версия не демонстрирует такого поведения. Если вам не нравится нюхать в браузере, просто запустите оператор if, чтобы проверить, существует ли этот элемент. Основная причина, по которой вам нужна какая-то проверка, заключается в том, что некоторые переменные, возможно, потребуется повторно инициализировать, поскольку исходных копий больше нет. Кроме того, если вам нужен тайм-аут, его легко подключить, но моя работала безупречно, и никто не присутствовал, поэтому я не упомянул об этом в своем ответе. - person Richard Vannauker; 16.02.2013