Обнаружение автозаполнения при вводе формы с помощью jQuery - PullRequest
31 голосов
/ 23 июля 2010

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

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

Ответы [ 9 ]

25 голосов
/ 15 июля 2014

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

Например:

$(input).on('input', function() { 
    console.log($(this).val()); 
});
15 голосов
/ 17 марта 2011

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

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

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

12 голосов
/ 14 мая 2015

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

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

, который добился цели в Chrome.input это то, что заставило его работать для автозаполнения.

2 голосов
/ 10 августа 2013

Моя проблема заключалась в обнаружении автозаполнения (через плагин, например 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 .

1 голос
/ 20 декабря 2012

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

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

$(".center_left_box").bind("mouseover", function() {
    displayFullSubcribeForm();
});
0 голосов
/ 23 июня 2015

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

$(document).bind('mouseover', function(){
        liveValidate();
    });
0 голосов
/ 17 марта 2015

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

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

Пример Coffeescript:

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

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

0 голосов
/ 17 июня 2012

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

Использовать событие js onpropertychange.

0 голосов
/ 23 июля 2010

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

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

$(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>

План B

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

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