Может ли jQuery проверить, изменилось ли входное содержимое?
можно ли привязать событие javascript(jQuery лучше всего) к" изменению " входного значения формы?
Я знаю, о .change()
метод, но он не запускается, пока вы (курсор) не покинете(ы) поле ввода. Я также рассмотрел возможность использования .keyup()
метод, но он реагирует и на клавиши со стрелками и так далее.
мне нужно просто вызвать действие каждый раз текст на входе изменяется, даже если это только одно изменение буквы.
9 ответов
существует простое решение, которое является HTML5 input
событие. Он поддерживается в текущих версиях всех основных браузеров для <input type="text">
элементы и есть простой обходной путь для IE
пример (кроме IE
$("#your_id").on("input", function() {
alert("Change to " + this.value);
});
да, сравните его со значением, которое было до его изменения.
var previousValue = $("#elm").val();
$("#elm").keyup(function(e) {
var currentValue = $(this).val();
if(currentValue != previousValue) {
previousValue = currentValue;
alert("Value changed!");
}
});
другой вариант-запускать измененную функцию только на определенных клавишах. Использовать e.KeyCode
чтобы выяснить, какая клавиша была нажата.
function checkChange($this){
var value = $this.val();
var sv=$this.data("stored");
if(value!=sv)
$this.trigger("simpleChange");
}
$(document).ready(function(){
$(this).data("stored",$(this).val());
$("input").bind("keyup",function(e){
checkChange($(this));
});
$("input").bind("simpleChange",function(e){
alert("the value is chaneged");
});
});
вот скрипка http://jsfiddle.net/Q9PqT/1/
вы также можете сохранить начальное значение в атрибуте данных и проверить его с текущим значением.
<input type="text" name="somename" id="id_someid" value="" data-initial="your initial value" />
$("#id_someid").keyup(function() {
return $(this).val() == $(this).data().initial;
});
вернет true, если начальное значение не изменилось.
вы можете использовать использование данных в jQuery и поймать все события, которые затем проверяет его на последнее значение (непроверенное):
$(document).ready(function() {
$("#fieldId").bind("keyup keydown keypress change blur", function() {
if ($(this).val() != jQuery.data(this, "lastvalue") {
alert("changed");
}
jQuery.data(this, "lastvalue", $(this).val());
});
});
это будет работать довольно хорошо против длинного списка элементов. Используя jQuery.data
означает, что вам не нужно создавать переменную javascript для отслеживания значения. Вы могли бы сделать $("#fieldId1, #fieldId2, #fieldId3, #fieldId14, etc")
для отслеживания многих областях.
обновление: добавил blur
до bind
список.
мне пришлось использовать этот код для сканера, который вставлял материал в поле
$(document).ready(function() {
var tId,oldVal;
$("#fieldId").focus(function() {
oldVal = $("#fieldId").val();
tId=setInterval(function() {
var newVal = $("#fieldId").val();
if (oldVal!=newVal) oldVal=newVal;
someaction() },100);
});
$("#fieldId").blur(function(){ clearInterval(tId)});
});
Не проверял...
Я не думаю, что есть "простое" решение. Вероятно, вам нужно будет использовать оба события onKeyUp и onChange, чтобы вы также ловили, когда изменения производятся с помощью мыши. Каждый раз, когда вызывается ваш код, вы можете сохранить значение, которое вы "видели" на этом.seenValue прикрепляется прямо к полю. Это должно быть немного проще.
вы можете установить события на комбинации клавиш и мыши событий, а также onblur, чтобы быть уверенным. В этом случае сохраните значение входных данных. В следующем вызове сравните текущее значение с последним сохраненным значением. Делай свою магию, только если она действительно изменилась.
чтобы сделать это более или менее чистым способом:
вы можете связать данные с элементом DOM (поиск api.jquery.com/jQuery.data ) таким образом, вы можете написать общий набор обработчиков событий, назначенных всем элементы в форме. Каждое событие может передать элемент, который был вызван одной общей функцией. Эта одна функция может добавить старое значение к данным элемента. Таким образом, Вы сможете реализовать это как общий фрагмент кода, который работает на всей вашей форме и каждой форме, которую вы будете писать с этого момента. :) И это, вероятно, займет не более 20 строк кода, я думаю.
пример в этой скрипке:http://jsfiddle.net/zeEwX/
поскольку пользователь может войти в меню ОС и выбрать вставить с помощью мыши, нет безопасного события, которое вызовет это для вас. Единственный способ, которым я обнаружил, что всегда работает, - это иметь setInterval, который проверяет, изменилось ли входное значение:
var inp = $('#input'),
val = saved = inp.val(),
tid = setInterval(function() {
val = inp.val();
if ( saved != val ) {
console.log('#input has changed');
saved = val;
},50);
вы также можете настроить это с помощью специального события jQuery.