Подія зміни текстового поля jQuery не спрацьовує, поки текстова скринька не втратить фокус?


133

Я виявив, що подія зміни jQuery у текстовій скриньці не спрацьовує, поки я не натискаю її за межі поля.

HTML:

<input type="text" id="textbox" />

JS:

$("#textbox").change(function() {alert("Change detected!");});

Дивіться демонстрацію на JSFiddle

Моя програма вимагає, щоб подія була задіяна при кожній зміні символів у текстовому полі. Я навіть намагався використовувати клавіатуру замість ...

$("#textbox").keyup(function() {alert("Keyup detected!");});

... але відомий факт, що подія клавіатури не запускається при натисканні та вставці правою кнопкою миші.

Будь-яке вирішення? Чи виникне у обох слухачів якісь проблеми?


^^ Це. Ви можете мати стільки обробників подій, скільки вам подобається.
Відновіть Моніку Селліо

Відповіді:


298

Прив’язка до обох подій - типовий спосіб зробити це. Ви також можете прив'язати до події вставки.

Ви можете прив’язати до кількох подій на кшталт цієї:

$("#textbox").on('change keyup paste', function() {
    console.log('I am pretty sure the text box changed');
});

Якщо ви хочете бути педантичним щодо цього, вам слід також прив’язати мишу, щоб задовольнити перетягування тексту навколо, та додати lastValueзмінну, щоб переконатися, що текст насправді змінився:

var lastValue = '';
$("#textbox").on('change keyup paste mouseup', function() {
    if ($(this).val() != lastValue) {
        lastValue = $(this).val();
        console.log('The text box really changed this time');
    }
});

І якщо ви хочете бути super duperпедантичними, тоді вам слід скористатися інтервальним таймером, щоб забезпечити автоматичне заповнення, плагіни тощо:

var lastValue = '';
setInterval(function() {
    if ($("#textbox").val() != lastValue) {
        lastValue = $("#textbox").val();
        console.log('I am definitely sure the text box realy realy changed this time');
    }
}, 500);

9
Нарешті хтось прочитав питання і відповів на все це!
Відновіть Моніку Селліо

4
.on('change keyup paste', function() {...}насправді вистрілює кілька разів! Якщо я набрав символ, а потім натиснув назовні, події "зміни" та "клавіш" будуть запущені, що призводить до того, що функція виконується кілька разів! Якщо я клацнув правою кнопкою миші, а потім натиснув назовні, "змінити" та "вставити" будуть запущені. Чорт! Якщо використовувати Ctrl + V, щоб вставити, а потім натиснути назовні, воно запускається тричі !!
SNag

1
@SNag так, так само вам слід додати чек за допомогою lastValueзмінної, щоб переконатися, що він фактично змінився.
Petah

1
+1. Однак, чи обов'язкові для "зміни" тут навіть необхідні? Мені незрозуміло, який випадок, який би вирішувався, не був би вирішений до того моменту, коли він змінився.
Madbreaks

1
Подія вставки запускається до того, як текст буде фактично вставлений
developerbmw

85

В сучасних браузерах, ви можете використовувати на inputподію :

DEMO

$("#textbox").on('input',function() {alert("Change detected!");});

1
Приємно - я цього не знав. Це HTML5 річ?
Відновіть Моніку Селліо

4
Я б хотів прийняти цю відповідь, але, як ви сказали, це рішення для сучасних браузерів. Моя веб-програма націлена на користувачів, які все ще використовують IE8, і це не працює на IE8. :( Що я можу сказати .. :(
SNag

Не запускається, якщо, наприклад, виберіть весь текст і натисніть клавішу видалення
jjxtra

4
$(this).bind('input propertychange', function() {
        //your code here
    });

Це працює для набору тексту, вставлення, клацання правою кнопкою миші тощо.


1
Це здається найкращим рішенням, оскільки воно не запускає кілька подій, якщо ви робите щось на зразок натискання стрілки вгору на числовому полі.
Джастін

Просте та ефективне рішення
Абдулхамед

4
if you write anything in your textbox, the event gets fired.
code as follows :

HTML:

<input type="text" id="textbox" />

JS:

<script type="text/javascript">
  $(function () {
      $("#textbox").bind('input', function() {
      alert("letter entered");
      });
   });
</script>

2

Спробуйте це:

$("#textbox").bind('paste',function() {alert("Change detected!");});

Дивіться демонстрацію на JSFiddle .


Оскільки питання на пасті, це не працює. подія не запускається при натисканні та вставці правою кнопкою миші.
Дхаваль Мартак

І що це стосується використання bind()?
Відновіть Моніку Селліо

він сказав , що він подія KeyUp не спрацьовує , коли права кнопка миші + вставити на нього, так keyupі change()має своє власне типова поведінка так ід він хоче виконати подія , то pasteможе бути варіантом
Dhaval Marthak

Звичайно, але це все ще не відповідає чому використовувати bindзамість цього on.
Відновіть Моніку Селліо

0

Спробуйте наведений нижче код:

$("#textbox").on('change keypress paste', function() {
  console.log("Handler for .keypress() called.");
});

Як це робить захоплення вставки мишею, про що йдеться у запитанні?
Відновіть Моніку Селліо

натискання клавіші підходить, оскільки він сказав, щоevent to be fired on every character change in the textbox
Venkat.R

Якщо ви хочете прочитати всі питання ви бачите , що він також сказав,"...but it's a known fact that the keyup event isn't fired on right-click-and-paste."
відновить Моніку Cellio

0

Читання ваших коментарів привело мене до брудної виправлення. Я знаю, що це не вірний спосіб, але це може бути обхід.

$(function() {
    $( "#inputFieldId" ).autocomplete({
        source: function( event, ui ) {
            alert("do your functions here");
            return false;
        }
    });
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.