2009-09-18 3 views

ответ

179

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

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

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

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

+0

К сожалению, это не работает для скрытого ввода. Возможное решение, когда требуется, поменять на скрытый вход: (с css). – NickGreen

+265

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

+4

Отличный комментарий @pimvdb. Я использовал это и превратил его в ответ на этот вопрос. – iPadDeveloper2011

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

Проблема этой опции заключается в том, что она работает только тогда, когда вы потеряли фокус ввода – Yises

+0

Это все равно подойдет некоторым случаям. –

69

Я предложил бы использовать KeyUp что-то событие, как показано ниже:

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

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

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

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

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

Я определенно рекомендую этот текст для ввода текста! – Vercas

+17

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

+0

также, изменение по-прежнему требуется для захвата флажков – turbo2oh

1

Вы можете использовать .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

3
$("input").keyup(function() { 
    alert("Changed!"); 
}); 
206

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

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

(см documentation.)

Это настолько полезно, это стоит поместить его в ответ. В настоящее время (v1.8 *?) Нет .Входного() удобства Fn в JQuery, так что способ сделать это

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

Опасность здесь заключается в том, что она не поддерживается повсюду, хотя ... – pimvdb

+6

В частности, IE <9 не поддерживает вообще. – dlo

+12

Поскольку вы можете связываться с несколькими событиями '$ ('form'). On ('change input', function),' сделал трюк для меня. Благодарю. – Norris

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.

+0

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

+11

Написание и запуск такого кода - безумие с экстремальным воздействием на производительность. –

+0

@ ŁukaszLech Пожалуйста, расскажите мне об этом. Но если вы нажмете события focus/blur, как я уже упоминал, интервал будет работать только временно. Разумеется, даже intel 386 с 1988 года может обрабатывать один интервал? – David

23

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

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

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

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

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

4
<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

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

Сценарий:

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

Html,

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

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

1

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

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

Это не добавляет существенных ответов на существующие ответы. – Pang

0

Это сработало для меня. Если поле с именем нажатием на поле A или любая введенная клавиша вводит его поле с идентификатором fieldB.

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