Как реализовать замену <input type = "text"> на jQuery? - PullRequest
161 голосов
/ 18 сентября 2009

<select> имеет этот API. А как насчет <input>?

Ответы [ 13 ]

231 голосов
/ 27 сентября 2012

Как сказал @pimvdb в своем комментарии,

Обратите внимание, что изменение сработает только тогда, когда элемент ввода потерял фокус. Существует также событие ввода, которое срабатывает при каждом обновлении текстового поля. без необходимости терять фокус. В отличие от ключевых событий это также работает для вставка / перетаскивание текста.

(см. документация .)

Это так полезно, это стоит поставить в ответ. В настоящее время (v1.8 *?) Нет никакого удобства .input () fn в jquery, поэтому способ сделать это - 1011 *

$('input.myTextInput').on('input',function(e){
 alert('Changed!')
});
203 голосов
/ 18 сентября 2009

Вы можете использовать .change()

$('input[name=myInput]').change(function() { ... });

Однако это событие будет срабатывать только тогда, когда селектор потерял фокус, поэтому вам нужно будет щелкнуть где-нибудь еще, чтобы выполнить эту работу.

Если это не совсем подходит для вас, вы можете использовать другие jQuery-события , такие как keyup , keydown или keypress - в зависимости от желаемого эффекта.

74 голосов
/ 18 сентября 2009

Я бы предложил использовать событие keyup примерно так:

$('elementName').keyup(function() {
 alert("Key up detected");
});

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

Обновление: работает только для ручного ввода, а не для копирования и вставки.

Для копирования и вставки я бы рекомендовал следующее:

$('elementName').on('input',function(e){
 // Code here
});
27 голосов
/ 29 августа 2014

Вот код, который я использую:

$("#tbSearch").on('change keyup paste', function () {
    ApplyFilter();
});

function ApplyFilter() {
    var searchString = $("#tbSearch").val();
    //  ... etc...
}

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

Это работает довольно хорошо, особенно в паре с элементом управления jqGrid. Вы можете просто ввести текстовое поле и немедленно просмотреть результаты в вашем jqGrid

22 голосов
/ 02 июля 2013

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

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

К счастью, благодаря инфраструктуре событий в jQuery, довольно легко добавить собственное событие inputchange. Я так и сделал здесь:

$.event.special.inputchange = {
    setup: function() {
        var self = this, val;
        $.data(this, 'timer', window.setInterval(function() {
            val = self.value;
            if ( $.data( self, 'cache') != val ) {
                $.data( self, 'cache', val );
                $( self ).trigger( 'inputchange' );
            }
        }, 20));
    },
    teardown: function() {
        window.clearInterval( $.data(this, 'timer') );
    },
    add: function() {
        $.data(this, 'cache', this.value);
    }
};

Используйте это как: $('input').on('inputchange', function() { console.log(this.value) });

Здесь есть демоверсия: http://jsfiddle.net/LGAWY/

Если вы боитесь нескольких интервалов, вы можете связать / отменить привязку этого события на focus / blur.

5 голосов
/ 16 сентября 2014
<input id="item123" class="firstName" type="text" value="Hello there" data-someattr="CoolExample" />

$(".firstName").on('change keyup paste', function () {
   var element = $(this);
   console.log(element);
   var dataAttribute = $(element).attr("data-someattr");
   console.log("someattr: " + dataAttribute );
});

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

3 голосов
/ 18 июня 2015

Следующее будет работать, даже если это динамические / Ajax вызовы.

Сценарий:

jQuery('body').on('keyup','input.addressCls',function(){
  console.log('working');
});

Html

<input class="addressCls" type="text" name="address" value="" required/>

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

3 голосов
/ 13 июня 2012
$("input").keyup(function () {
    alert("Changed!");
});
2 голосов
/ 01 марта 2017

Вы можете просто работать с идентификатором

$("#your_id").on("change",function() {
    alert(this.value);
});
1 голос
/ 22 октября 2018

Вы можете сделать это по-разному, keyup является одним из них. Но я приведу пример с изменениями.

$('input[name="vat_id"]').on('change', function() {
    if($(this).val().length == 0) {
        alert('Input field is empty');
    }
});

NB: input [name = "vat_id"] заменить на ваш ID или name .

...