(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Пользовательский агент должен отправить это событие, когда один или более символов. Эти символы могут исходить из множества источников, например символов, возникающих в результате нажатия или отпускания ключа на клавиатурном устройстве, обработки обработки редактора метода ввода или в результате голосовой команды. Если операция «вставить» генерирует простую последовательность символов, т. Е. Текстовый проход без какой-либо информации о структуре или стиле, этот тип события также должен быть сгенерирован.
blockquote>
input
- Тип события HTML5 .Уволен в элементах управления, когда пользователь меняет значение
blockquote>Firefox, Chrome, IE9 и другие современные браузеры.
Это событие происходит сразу после модификации, в отличие от события onchange, которое происходит, когда элемент теряет фокус.
blockquote>
function updatePlots() {
// this way, the global plant function is not overwritten
// @see JavaScript variable scope
var plant;
// You might want to 'var' your other local (?) variables, too
// var fullplots, i, status, growth;
fullplots = [];
for (i = 0; i < plots.length; i++) { //get fullplots
if (plots[i].length) {
fullplots.push(i);
}
}
for (i = 0; i < fullplots.length; i++) {
// at this line of code you overwrite the global plant, which is not a function anymore then
plant = plots[fullplots[i]][0];
status = plots[fullplots[i]][1];
growth = plots[fullplots[i]][2];
if (growth < 100) { //increment
plots[fullplots[i]][2]++;
}
}
if (document.getElementById('plots').style.display == 'block') {
getPlots();
}
}
Проблема возникает в методе updatePlots, вызываемом setInterval. Здесь вы присваиваете «заводу» новое значение
plant = plots[fullplots[i]][0];
Затем, когда вызывается «растение», оно указывает на новое значение, назначенное вам в updatePlots, вместо функции, которую вы изначально имел. Вы должны объявить новую переменную в updatePlots, чтобы избежать изменения метода установки. Я бы использовал другое имя, чтобы избежать путаницы.