Обнаружение автозаполнения при вводе формы с помощью jQuery

У меня есть форма, которая определяет, действительны ли все текстовые поля для каждого keyup () и focus (); если все они действительны, пользователь сможет нажать кнопку отправки. Однако, если пользователь заполняет один из текстовых полей с помощью функции автозаполнения в браузере, это предотвращает включение кнопки отправки.

Есть ли способ определить, изменился ли какой-либо ввод независимо от того, как он был изменен, с помощью jQuery?


person Ryan    schedule 22.07.2010    source источник
comment
вот решение этой проблемы = ›это   -  person Mourad El Aomari    schedule 19.04.2016
comment
посмотрите мой ответ здесь   -  person Lev Kazakov    schedule 08.01.2017


Ответы (9)


Событие изменения jQuery срабатывает только при размытии. Событие keyup будет срабатывать по мере ввода. Ни один огонь при нажатии опции автозаполнения. Я также ищу способ обнаружить это, но в настоящее время я использую

$(selector).bind("change keyup",function(){
    //Do something, probably with $(this).val()
});

Но это не совсем решает проблему ...

person Spycho    schedule 17.03.2011
comment
К сожалению, мне пришлось проголосовать против этого! У меня был 90% хороших впечатлений от change keyup, но клавиатура не привязана к автозаполнению в chrome-case и change подключается к автозаполнению только в том случае, если фокус теряется! Chrome иногда сохраняет текстовый курсор внутри поля ввода после автозаполнения и не инициировал событие изменения! Может проблема только с хромом ... - person Grim; 17.07.2016
comment
@PeterRader: Да, я думал, что ясно дал это в ответе. - person Spycho; 08.08.2016
comment
@Spycho Если у вас есть третье поле после username и password, тогда change вызывается для username и password каждый раз! Это обходной путь, достигающий 100%. - person Grim; 08.08.2016
comment
@PeterRader: Отлично. Опубликуйте это как ответ? - person Spycho; 09.08.2016

Вы можете попробовать использовать on input для обнаружения текстовых изменений (кроме таких ключей, как ctrl и shift) в <input>.

Например:

$(input).on('input', function() { 
    console.log($(this).val()); 
});
person cheshireoctopus    schedule 14.07.2014
comment
Ввод не работает в IE11, если учетные данные уже введены браузером при загрузке страницы. - person Vincent Sels; 21.11.2016

Я использовал

$(selector).on("change keyup blur input", function() {});

что помогло в Chrome. input - это то, что заставило его работать с автозаполнением.

person avoliva    schedule 14.05.2015
comment
Не работает надежность в Chrome. Если я быстро дважды обновляю страницу, это не улавливает значения автозаполнения. - person ᴍᴀᴛᴛ ʙᴀᴋᴇʀ; 28.03.2017

Моя проблема заключалась в обнаружении автозаполнения (через плагин, например lastpass или 1password), а также в описанной выше проблеме.

Решение, которое сработало для меня, было:

$(function(){    
    function validate(){
        if($('#email').val() !== '' && $('#password').val() !== '')
            $('#submit').prop('disabled', false);
        else
            $('#submit').prop('disabled', true);
    }

    // Validate after user input
    $('#email, #password').on('keyup change', validate);

    // Validate on mouse enter of body and login form
    // to catch auto-fills from roboform/1password etc...
    $('body, #loginform').on('mouseenter', validate);

    // Validate onload incase of autocomplete/autofill
    validate();
});

См. демонстрацию в JSFiddle.

person Justin    schedule 09.08.2013
comment
Я знаю, что это старый, но разве ты не можешь сделать вместо этого $("#email, "#password").on("keyup change", validate);? - person eytanfb; 26.08.2014
comment
Когда срабатывает FYI - mouseenter, он появляется при наведении курсора, и хотя это может работать для диспетчера паролей, он не кажется идеальным, поскольку запускает проверку при наведении, а поле недействительно (становится красным). Это мелочь, но я бы предпочел не давать отрицательных отзывов о событиях зависания. Все еще ищу событие единорога, чтобы обнаружить lastpass fill_in. - person kross; 17.03.2015

Вы можете использовать функцию jQuery .change().

После первоначальной загрузки страницы вы можете проверить всю форму, просто чтобы убедиться, что она действительно не заполнена. После этого вы можете использовать _ 2_, чтобы проверить, не изменилось ли что-то в форме, и, если что-то изменилось, еще раз подтвердите форму.

$(document).ready(function() {
   // validate form once, just to be sure (if valid, activate submit button)
});
...
<form>
  <input class="target" type="text" value="Field 1" />
  <select class="target">
    <option value="option1" selected="selected">Option 1</option>
    <option value="option2">Option 2</option>
  </select>
</form>
<script type="text/javascript">     
    $('.target').change(function() {
        alert('Something changed');
        // Try validating form again (if valid, activate submit button)
    });
</script>

План Б

Другой вариант - всегда иметь кнопку отправки кликабельной, но использовать .submit(), чтобы привязать ее к валидатору формы. . Затем, если форма действительна, продолжайте. Если форма НЕПРАВИЛЬНА, используйте .preventDefault(), чтобы остановить отправку формы .... . и вы также отобразите предупреждающее сообщение с указанием отсутствующих полей.

person Peter Ajtai    schedule 22.07.2010

Ответ был дан в this вопрос. Он не использует jQuery, но работает с автозаполнением:

Используйте событие js onpropertychange.

person Yehuda Shapira    schedule 17.06.2012

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

$("#emailaddress").bind("keyup", function() {
    displayFullSubcribeForm();
});

$(".center_left_box").bind("mouseover", function() {
    displayFullSubcribeForm();
});
person James Wilson    schedule 20.12.2012
comment
Многие пользователи не используют мышь - они либо вкладывают, чтобы сфокусировать поля, либо нажимают на нее. - person goat; 18.06.2017

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

Чтобы сделать это для обычного ввода, я смог подключить keyup с функцией debounce, а blur подключен для немедленной проверки. Хотя кажется, что keyup запускается lastpass, поскольку я его отклонил, произошла задержка проверки. Благодаря @ peter-ajtai я попытался добавить событие change, и оно действительно улавливает последний проход и оставляет другие тонкости в покое.

Пример Coffeescript:

@fieldExp .keyup($.debounce(@_onExpChange, 3000)) .blur(@_onExpChange) .change(@_onExpChange)

Это сработало, и заполнение формы lastpass вызывает немедленную проверку.

person kross    schedule 17.03.2015

это идеальное решение, гарантированно работающее

$(document).bind('mouseover', function(){
        liveValidate();
    });
person StillLearningGuy    schedule 23.06.2015
comment
также на мобильном телефоне? - person EricC; 20.01.2017