Я настраиваю форму для поиска или создания новой городской записи в веб-приложении. Мне нужно текстовое поле для города, чтобы сделать следующее:Keypress с задержкой, как ограничить только одно выполнение вызова функции?
- После получения ввода текста покажите «счетчик», указывающий, что компьютер обрабатывает вход.
- После того, как пользователь прекратил печатать в течение 1 секунды, отправьте запрос ajax для проверки ввода.
- Ответьте на состояние (действительно ли вход действителен).
У меня это почти работает, но у меня есть одна серьезная проблема: сценарий задержки, который я написал, работает, но после того, как задержка закончилась, он запускает остальную часть функции один раз за каждую клавишу, которая произошла во время задержки. Я бы хотел, чтобы он работал только один раз. Вот код, я работаю с (бревенчатыми консолями событие будет заменено с другими вызовами функций позже):
$(function() {
locationSelector.initialize();
});
var locationSelector = {
initialize: function() {
locationSelector.bindCityName $('input#city_name')
},
city: {
status: function(status) {
console.log("Status message: " + status);
},
error: function(message) {
console.log("Error message: " + message);
}
},
bindCityName: function(selector) {
selector.on('keyup', function() {
locationSelector.city.status('loading');
var timer = null;
if(timer) {
window.clearTimeout(timer);
}
timer = window.setTimeout(
function() { locationSelector.getCity(selector); },
1000
);
});
},
getCity: function(selector) {
if(selector.val() == "") {
locationSelector.city.error('Cannot be blank.');
} else {
console.log("AJAX REQUEST");
}
}
};
Почему функция getCity
в настоящее время выполняется один раз в KeyUp, и как я могу исправить это? Кроме того, честно говоря, я очень новичок в javascript, поэтому я был бы признателен за любые другие предложения о том, как улучшить этот код.
Спасибо!
jfriend и dbaseman, спасибо за ответы. Поскольку вы оба дали практически тот же ответ, я выбрал dbaseman, так как он был на 1 минуту раньше и имел значительно меньше репутации. Упрек для обоих, так как они были полезны. Спасибо! – Andrew