Событие изменения Javascript на элементе ввода срабатывает только при потере фокуса


84

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

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

---- onchange не срабатывает при изменении содержимого имени, а только срабатывает, когда имя выходит из фокуса.

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

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


Вы могли бы использовать onkeyupи onchange?
Джеймс Аллардис

1
Единственная проблема, с которой я столкнулся, заключается в том, что выбор автозаполнения в браузере не вызовет ни одного из этих событий.
Сачин Мидха

Что это за поле ввода?
powtac

о ... Я забыл добавить это в пример кода, это текстовое поле.
Сачин Мидха

1
Я думал, что это была бы очень распространенная проблема, и многие люди столкнулись бы с ней, но теперь кажется, что все наоборот ... :)
Сачин Мидха

Ответы:


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 Level 3. http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

Пользовательский агент должен отправить это событие, когда был введен один или несколько символов. Эти символы могут происходить из множества источников, например, символов, возникающих в результате нажатия или отпускания клавиши на клавиатуре, в результате обработки редактором метода ввода или в результате голосовой команды. Если операция «вставки» генерирует простую последовательность символов, т. Е. Текстовый отрывок без какой-либо информации о структуре или стиле, этот тип события также должен генерироваться.

input- тип события HTML5 .

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

Firefox, Chrome, IE9 и другие современные браузеры поддерживают его.

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


1
это не работает ... вы проверили свой код в конце ?? он работал над выбором из автозаполнения ...?
Сачин Мидха

Я проверил textInputChrome 15, и он работает. Я проверил inputсобытие в IE9, и он тоже работает. Firefox должен поддерживать DOMAttrModified, но у меня он не установлен. Эти два события - лучшее, на что вы можете надеяться, поскольку они запускаются при вводе любого текста.
katspaugh

1
Отличное решение .... ввод сработал для меня как благословение ... ничего другого, кроме ввода, не требуется, этого само по себе достаточно. он работает на ff4, но не на 3.x, и у меня было 3.6 на моем рабочем столе, и он никогда не работал ...
Сачин Мидха

5
В целях постоянного обновления, в настоящее время это решение запускалось несколько раз при одном изменении ввода в FF22, вам не нужно использовать события нажатия клавиши или textinput, ввода и изменения свойств должно быть достаточно
cyber-guard

1
Я обнаружил , что change, keyupи inputбыла лучшая комбинация для покрытия IE9 и Firefox (36.0.4). keypressСобытие , похоже , не на работу в IE9 , потому что это не захватить вещи , как Удалять и Backspace, а также inputсобытия чехлов оклейки с клавиатурой и с помощью контекстного меню.
TLS,

9

В качестве дополнения к ответу Катспо, вот способ сделать это для нескольких элементов с помощью класса 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

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

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)" />

хорошая попытка, но проблема здесь в том, что я нажимаю мышь не на элемент ввода, а на автозаполнение, которое не запускает это событие ...
Сачин Мидха

Единственное, что я могу придумать, и это отвратительно, - это setTimeoutпериодически проверять значение поля ... Что именно вы хотите сделать?
DaveRandom

Это очень неприятно ...: D это что-то похожее на то, что делает индикатор надежности пароля, он сообщает вам силу пароля, когда вы продолжаете вводить его. Я хочу включить кнопку, только когда введенная строка имеет длину 10, иначе оставьте ее отключенной. Я надеюсь, вы поняли ...
Сачин Мидха

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.