Як я можу реалізувати зміну <input type = "text"> за допомогою jQuery?


Відповіді:


219

Можна використовувати .change()

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

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

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


На жаль, це не працює для прихованого вводу. Можливе рішення, коли потрібна зміна на прихованому вході, є: <input type = 'text' style = 'display: none' /> (з css) ..
NickGreen

304
Зверніть увагу, що changeвін запуститься лише тоді, коли вхідний елемент втратить фокус. Існує також inputподія, яка спрацьовує кожного разу, коли текстове поле оновлюється, не втрачаючи уваги. На відміну від ключових подій, він також працює для вставки / перетягування тексту.
pimvdb

4
Чудовий коментар @pimvdb. Я цим скористався і перетворив це на відповідь на це питання.
iPadDeveloper2011

1
Як я це намагаюся, і щойно я дізнався, що подія стається лише тоді, коли виконуються дві умови: 1) зміна значення; і 2) розмиття, мені цікаво, чи багато людей, які очікують змін (), краще впораються з клавіатурою ()?
TARKUS

Оскільки changeIE9 не підтримується, ви можете використовувати focusoutодне й те саме
Soma

247

Як сказав @pimvdb у своєму коментарі,

Зауважте, що зміна запуститься лише тоді, коли вхідний елемент втратить фокус. Існує також подія введення, яка спрацьовує кожного разу, коли текстове поле оновлюється, не втрачаючи уваги. На відміну від ключових подій, він також працює для вставки / перетягування тексту.

(Див. Документацію .)

Це настільки корисно, що варто відповісти на це. Наразі (v1.8 *?) У jquery немає зручності .input (), тому спосіб зробити це

$('input.myTextInput').on('input',function(e){
 alert('Changed!')
});

6
Зокрема, IE <9 взагалі не підтримує.
dlo

13
Оскільки ви можете прив’язатись до кількох подій, $('form').on('change input', function);зробили для мене трюк. Дякую.
justnorris

9
@Norris. Це, ймовірно, запуститься двічі, коли елемент буде змінено (1-й), і втратить фокус (2-й). Це не є проблемою для багатьох цілей, але все-таки варто зазначити.
iPadDeveloper2011

Тестований на IE9, зворотний
простір

Зверніть увагу, це буде активовано для кожної внесеної зміни (що може бути те, що ви шукаєте). Але якщо ви шукаєте подію на кшталт "Коли закінчується зміна", ось чудовий приклад .
Тревор Нестман

79

Я б запропонував використовувати подію клавіатури приблизно на кшталт нижче:

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

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

Оновлення: Це працює лише для ручного введення, не копіюйте та вставляйте.

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

$('elementName').on('input',function(e){
 // Code here
});

Я напевно рекомендую цей текст для введення тексту!
Веркас

20
Зміст елемента введення можна змінювати, не запускаючи клавіатуру. Наприклад, ви можете вставити текст за допомогою миші.
celicni

також, здається, зміни все ще потрібні для захоплення прапорців
turbo2oh

30

Ось код, який я використовую:

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

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

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

Це працює досить непогано, особливо, коли вони поєднані з jqGridкеруванням. Ви можете просто набрати в текстове поле і негайно переглянути результати у своєму jqGrid.


22

Існує один і єдиний надійний спосіб зробити це , - це витягуючи значення в інтервалі та порівнюючи його з кешованим значенням.

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

На щастя, завдяки інфраструктурі подій у jQuery, досить легко додати власну подію для зміни входу. Я так зробив тут:

$.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.


Чи можливо зробити так, щоб ваш код працював так $('body').on('inputchange', 'input', function() { console.log(this.value) });:? Чи ні, як тут згадується: github.com/EightMedia/hammer.js/pull/98 ?
TheFrost

13
Написання та запуск такого коду - це божевілля з надзвичайним впливом на продуктивність.
Дунайський матрос

@ ŁukaszLech Будь ласка, розкажіть про це. Але якщо ви потрапите на фокус / розмиття подій, як я вже згадував, інтервал буде працювати лише тимчасово. Напевно, навіть Intel 386 з 1988 року може обробити один інтервал?
Девід Гелсінг

5
<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ключове слово, щоб отримати доступ до всього елемента, щоб ви могли зробити все необхідне з цим елементом.


4

Далі працює, навіть якщо це динамічні / Ajax дзвінки.

Сценарій:

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

Html,

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

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



2

Ви можете просто працювати з ідентифікатором

$("#your_id").on("change",function() {
    alert(this.value);
});

Це не суттєво доповнює існуючі відповіді.
Панг

2

Зробити це можна різними способами, клавіатура - один з них. Але я наводжу приклад нижче із зміною.

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

Примітка: input [name = "vat_id"] замініть на вхідний ідентифікатор або ім'я .


2

Якщо ви хочете ініціювати подію під час введення , використовуйте наступне:

$('input[name=myInput]').on('keyup', function() { ... });

Якщо ви хочете ініціювати подію після виходу з поля введення , використовуйте наступне:

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

Чомусь це не спрацювало для мене, але це було так:$(document).on('change', 'input[name=myInput]', function() { ... });
Стефан

1
@Stefan, код у вашому прикладі називається делегуванням подій. Поля введення, можливо, було додано після ініціалізації сторінки, тому мій код не працював для вас.
Усман Ахмед

1
$("input").change(function () {
    alert("Changed!");
});

4
Проблема цього варіанту полягає в тому, що працює лише тоді, коли ви втратили фокус на вході
Yises

Це все одно підходить для деяких випадків.
Джеймс Дрінкард

1

Це працювало для мене. Якщо натиснуто поле з полем іменіA або введена будь-яка клавіша, оновиться поле з полем idB .

jQuery("input[name='fieldA']").on("input", function() {
    jQuery('#fieldB').val(jQuery(this).val());
});

0

Ви можете використовувати .keypress().

Наприклад, розгляньте HTML:

<form>
  <fieldset>
    <input id="target" type="text" value="Hello there" />
  </fieldset>
</form>
<div id="other">
  Trigger the handler
</div>

Обробник подій може бути прив'язаний до поля введення:

$("#target").keypress(function() {
  alert("Handler for .keypress() called.");
});

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


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