Обнаружение изменения ввода в JQuery?

360

При использовании jquery .changeнаinput событие будет только тогда, когда ввод теряет фокус

В моем случае мне нужно позвонить в службу (проверить, является ли значение допустимым), как только изменилось входное значение. Как я мог сделать это?

сирена воздушной тревоги
источник
3
какой вид ввода? текстовое окно? Флажок? радио? текстовое поле? давайте посмотрим, что вы придумали до сих пор
Патриция
Извините, это ввод текста типа. И, как я уже сказал, я попытался изменить, но это не так, как мне нужно (для каждого изменения в тексте во входных данных). Я также пробовал нажатие клавиш, но для того, чтобы это работало, мне придется отслеживать, если вход «грязный» или нет.
Банши
2
если они нажимают клавишу, она будет меняться в 99% случаев, вы всегда можете проверить, какие клавиши отсутствуют в обработчике событий.
Патриция

Ответы:

546

ОБНОВЛЕНО для пояснения и примера

примеры: http://jsfiddle.net/pxfunc/5kpeJ/

Способ 1. inputСобытие

В современных браузерах используют inputсобытие. Это событие будет срабатывать, когда пользователь вводит текстовое поле, вставляя, отменяя, в основном, каждый раз, когда значение изменяется от одного значения к другому.

В jQuery сделай так

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

начиная с jQuery 1.7, заменить bindна on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Способ 2. keyupсобытие

Для более старых браузеров используйте это keyupсобытие (оно будет срабатывать после отпускания клавиши на клавиатуре, это событие может давать своего рода ложное срабатывание, поскольку при отпускании «w» значение ввода изменяется и keyupсобытие срабатывает, но также и когда Клавиша «Shift» отпускается, когда происходит keyupсобытие, но не было внесено никаких изменений во ввод.). Также этот метод не срабатывает, если пользователь щелкает правой кнопкой мыши и вставляет из контекстного меню:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Способ 3. Таймер ( setIntervalили setTimeout)

Чтобы обойти ограничения, keyupвы можете установить таймер, чтобы периодически проверять значение входа, чтобы определить изменение значения. Вы можете использовать setIntervalили setTimeoutсделать эту проверку таймера. Посмотрите помеченный ответ на этот вопрос SO: событие изменения текстового поля jQuery или посмотрите на скрипку рабочий пример, используя focusи blurсобытия для запуска и остановки таймера для определенного поля ввода

MikeM
источник
Не могли бы вы объяснить подробнее об этом решении? Как я могу получить текущее значение? Как я могу заставить это работать только тогда, когда изменения внесены в текущее значение?
Банши
входное событие? в jQuery нет входного события (пока) ... stackoverflow.com/q/11189136/104380
vsync
Для метода 2 я обычно связываюсь как с keyup, так и с изменением. Таким образом, в ситуациях, когда ввод происходит без нажатия клавиш (например, вставка), он по меньшей мере инициирует событие, когда ввод теряет фокус.
rspeed
1
@AdiDarachi MutationObserver будет отслеживать изменения в элементах DOM. Однако пользователь, изменяющий данные в поле ввода, не вызывает изменения MutationObserver ... Я устанавливаю тестовый пример, только изменение кода JS на атрибут innerTextor value(имитирующее пользовательский ввод) вызовет событие MutationObserver jsfiddle.net/pxfunc/ 04chgpws / 1 (см. Console.log для ведения журнала событий MutationObserver). У вас есть другой тестовый пример, на который я могу посмотреть?
MikeM
1
это не работает, когда скрипт меняет значение
FalcoGer
189

Если у вас есть HTML5:

  • oninput (срабатывает только тогда, когда изменение действительно происходит, но делает это немедленно)

В противном случае вам нужно проверить все эти события, которые могут указывать на изменение значения элемента input:

  • onchange
  • onkeyup( нет keydown или keypressкак значение ввода не будет иметь нового нажатия клавиши еще)
  • onpaste (когда поддерживается)

и возможно:

  • onmouseup (Я не уверен в этом)
Альнитак
источник
@naomik из моего теста это работает для входов флажка; кроме IE / Edge. Могут появиться некоторые другие исключения, но для этих типов ввода разумнее использовать onchange (IMHO).
HellBaby
82

С HTML5 и без использования jQuery вы можете использовать inputсобытие :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Это будет срабатывать каждый раз, когда изменяется текст ввода.

Поддерживается в IE9 + и других браузерах.

Попробуйте это вживую в jsFiddle здесь .

Дрю Ноакс
источник
1
«change» срабатывает только при размытии, а не при изменении текста. Используйте событие «input», чтобы обнаружить изменения текста.
Дермот Доэрти
14

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

$ input . on ( 'изменить keydown keypress keyup mousedown click mouseup' , обработчик );

Если вы думаете , что может поместиться, вы можете добавить focus, blurи другие события тоже.
Я предлагаю не превышать в событиях прослушивание, так как он загружает в память браузера дальнейшие процедуры, выполняемые в соответствии с поведением пользователя.

Внимание: обратите внимание, что изменение значения элемента ввода с помощью JavaScript (например, с помощью .val()метода jQuery ) не вызовет ни одно из указанных выше событий.
(Ссылка: https://api.jquery.com/change/ ).

Эмануэле Дель Гранде
источник
Я также рекомендую добавить фокусировку, чтобы избежать проблем с автозаполнением
binar
Понимаю. Я искал, и focusout, кажется, поддерживается только IE и частично Chrome, я прав?
Эмануэле Дель Гранде
5
Как мягкое дополнение, чтобы вызвать событие из jQuery, вы можете вызвать соответствующее действие после, .val()например, для события изменения в поле ввода, вы должны сделать что-то вроде этого ... $('#element').val(whatever).change()
SourceVisor
2

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

Jivings
источник
Хорошо, но это не более или менее так же, как клавиатура? Я должен буду проверить, является ли вход "грязным" сам?
Банши
@SnowJim, если вы хотите что-то делать только тогда, когда ввод действительно изменяется, вы должны либо использовать onchange, либо отслеживать состояние самостоятельно. keydownне работает, потому что срабатывает до изменения состояния входа.
Альнитак
@Alnitak точно, и именно поэтому я задаю вопрос здесь. Обмен не работает, он только выбрасывается при выходе из входа.
Банши
Слон в комнате, конечно, мобильный. Уверен, что никакие события клавиатуры или мыши не будут здесь полезны. : p
Askdesigners
События @Askdesigners Keyup / down на мобильных устройствах должны работать аналогичным образом.
Jivings
2

// .blur срабатывает, когда элемент теряет фокус

$('#target').blur(function() {
  alert($(this).val());
});

// Для запуска вручную используйте:

$('#target').blur();
Kszili
источник
1
.change, как я уже сказал, генерируется только тогда, когда inout теряет фокус и значение изменяется, мне нужно получить даже, как только ввод (текст) изменяется (как только изменяется текст на входе). Размытие срабатывает только тогда, когда вход теряет фокус.
Банши
1

Существуют события jQuery, такие как keyup и keypress, которые вы можете использовать с входными HTML-элементами. Вы можете дополнительно использовать событие blur () .

разработчик программного обеспечения
источник
1
.change, как я уже сказал, генерируется только тогда, когда inout теряет фокус и значение изменяется, мне нужно получить даже, как только ввод (текст) изменяется (как только изменяется текст на входе). Размытие срабатывает только тогда, когда вход теряет фокус.
Банши
1
Вы не можете надежно проверить значение ввода во время keypressсобытия, потому что нажатая клавиша еще не изменила это значение.
Альнитак
0

Это покрывает каждое изменение ввода, используя jQuery 1.7 и выше:

$(".inputElement").on("input", null, null, callbackFunction);
rybo111
источник