Подія зміни JavaScript на елементі введення спрацьовує лише при втраті фокусу


84

У мене є елемент введення, і я хочу продовжувати перевіряти довжину вмісту, і всякий раз, коли довжина стає рівною певному розміру, я хочу ввімкнути кнопку надсилання, але я стикаюся з проблемою події onchange Javascript як події спрацьовує лише тоді, коли вхідний елемент виходить за межі області дії, а не коли зміст змінюється.

<input type="text" id="name" onchange="checkLength(this.value)" />

---- onchange не спрацьовує на зміну вмісту імені, а спрацьовує лише тоді, коли ім'я виходить з фокусу.

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

Я хочу щось, що може працювати, коли зміст поля змінюється чи то за допомогою клавіатури, чи за допомогою миші ... будь-які ідеї?


Ви могли б використовувати onkeyupі onchange?
James Allardice

1
Єдина проблема у мене полягає в тому, що вибір автозаповнювача в браузері не спричинить жодної з цих подій.
Sachin Midha

Що це за поле введення?
powtac

о ... я забув додати його до зразка коду, це текстове поле.
Sachin Midha

1
Я думав, що це було б дуже поширеною проблемою, і багато людей стикалися б із цим, але зараз, здається, навпаки ... :)
Sachin Midha

Відповіді:


120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

Це буде зловити change, натискання клавіш, paste, textInput, input(при наявності). І не стріляти більше, ніж потрібно.

http://jsfiddle.net/katspaugh/xqeDj/


Список літератури:

textInput- тип події W3C DOM рівня 3. http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

Агент користувача повинен надіслати цю подію, коли введено один або кілька символів. Ці символи можуть походити з різних джерел, наприклад, символи, що є результатом натискання або відпускання клавіші на клавіатурному пристрої, обробки редактора методу введення або результату голосової команди. Якщо операція “вставка” генерує просту послідовність символів, тобто уривок тексту без будь-якої інформації про структуру чи стиль, слід генерувати і цей тип події.

input- тип події HTML5 .

Здійснюється на елементах керування, коли користувач змінює значення

Це підтримують Firefox, Chrome, IE9 та інші сучасні браузери.

Ця подія відбувається відразу після модифікації, на відміну від події onchange, яка відбувається, коли елемент втрачає фокус.


1
це не працює ... ти перевірив свій код у своєму кінці ?? це працювало над вибором з автокомплекту ...?
Sachin Midha

Я перевірив textInputChrome 15, і він працює. Я перевірив inputподію в IE9, і вона теж працює. Firefox повинен підтримувати DOMAttrModified, але у мене його не встановлено. Ці дві події - найкраще, на що ви можете сподіватися, оскільки вони запускаються при будь-якому введенні тексту.
katspaugh

1
Дивовижне рішення .... введення спрацювало для мене як благословення ... нічого іншого, крім введення, не потрібно, це саме працює досить. він працює на ff4, але не на 3.x, і у мене було 3.6 на робочому столі, і він ніколи не працював ...
Sachin Midha

5
З метою постійного оновлення речей, в даний час це рішення запускається кілька разів за одну зміну вводу в FF22, вам не потрібно використовувати натискання клавіш або події введення тексту, введення та зміна властивостей має бути достатнім
cyber-guard

1
Я виявив, що change, keyupі inputбув найкращою комбінацією для покриття IE9 та Firefox (36.0.4). keypressПодія , схоже , не на роботу в IE9 , тому що це не захопити речі , як Видаляти і Backspace, а також inputподії чохлів обклеювання з клавіатурою і за допомогою контекстного меню.
TLS

9

Як розширення відповіді katspaugh, ось спосіб зробити це для декількох елементів за допомогою класу css.

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });

4

На його пошук у мене пішло 30 хвилин, але це працює в червні 2019 року.

<input type="text" id="myInput" oninput="myFunction()">

і якщо ви хочете програмно додати прослуховувач подій у js

inputElement.addEventListener("input", event => {})

3

Зробіть це способом jQuery:

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});

1
Це також буде запущено лише тоді, коли поле втратить фокуси.
Фелікс Клінг,

@Felix Kling, правда, змінив його на keyup ();)
powtac

знову та сама проблема з клавіатурою ... Я використовував це, і у мене була проблема з цим. прочитайте моє повне запитання.
Sachin Midha

0

Ви можете використовувати onkeyup

<input id="name" onkeyup="checkLength(this.value)" />

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

0

Вам потрібно було б використовувати комбінацію onkeyupта onclick(або onmouseup), якщо ви хочете вловити кожну можливість.

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />

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

Єдине, що я можу придумати, і це неприємно неприємно, це setTimeoutперіодично перевіряти значення поля ... Що саме ти хочеш зробити?
DaveRandom

Це дуже неприємно ...: D Це щось подібне до того, що робить індикатор надійності пароля, він повідомляє вам про міцність пароля при введенні в нього. Я хочу увімкнути кнопку лише тоді, коли введений рядок має довжину 10, інакше залишати його вимкненим. Сподіваюсь, ти зрозумів ...
Sachin Midha

0

Ось ще одне рішення, яке я розробляю для тієї ж проблеми. Однак я використовую багато полів введення, тому зберігаю старе значення як визначений користувачем атрибут самих елементів: "значення даних". Використовуючи jQuery, ним так легко керувати.

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

ось, я використовував 5-6 вхідних вікон із класом 'filterBox', я роблю метод filterBy запускатися, лише якщо значення даних відрізняється від власного значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.