У меня есть немного JavaScript, который собирает некоторый HTML для меня и вставляет его в div
.Я использую jQuery 1.7.2 для этого теста.
Я заинтересован в том, чтобы прикрепить пользовательский обработчик события изменения или keyup к текстовому полю input
с именем gene_autocomplete_field
.
Вот что я пробовал до сих пор.
Следующая функция создает HTML, который вставляется в div
с именем gene_container
:
function buildGeneContainerHTML(count, arr) {
var html = "";
// ...
html += "<input type='text' size='20' value='' id='gene_autocomplete_field' name='gene_autocomplete_field' placeholder='Enter gene name...' /><br/>";
// ...
return html;
}
// ...
$('#gene_container').html( buildGeneContainerHTML(count, geneNameArr) );
В моем вызовеHTML, я извлекаю gene_autocomplete_field
из элемента gene_container
, а затем перезаписываю обработчик событий keyup
для gene_autocomplete_field
:
<script>
$(document).ready(function() {
$("#gene_container input:[name=gene_autocomplete_field]").live('keyup', function(event) {
refreshGenePicker($("#gene_container input:[name=gene_autocomplete_field]").val());
});
});
</script>
Когда я изменяю текст в gene_autocomplete_field
,refreshGenePicker()
Функция просто отправляет предупреждение:
function refreshGenePicker(val) {
alert(val);
}
Результат
Если я наберу любую букву в элемент gene_autocomplete_field
, обработчик события, кажется, вызывает alert(val)
бесконечное количество раз.Я получаю одно предупреждение за другим, и браузер переходит в диалоговые окна.Возвращенное значение верное, но я волнуюсь, что refreshGenePicker()
вызывается снова и снова.Я не думаю, что это неправильное поведение.
Вопросы
- Как правильно перехватить событие
keyup
один раз, чтобы я мог толькообрабатывать изменение содержимого в поле автозаполнения один раз? - Есть ли другое событие, которое я должен использовать для этой цели?
ОБНОВЛЕНИЕ
Получается, что больше, чем простоkeyCode
из 13 (Return / Enter) может быть проблемой - нажатие Control, Alt, Esc или других специальных символов вызовет событие (но будет бессимптомным, поскольку проблема бесконечного цикла идет).Имена генов, по которым я фильтрую, не содержат метасимволов.Поэтому я использовал буквенно-цифровой тест обнаружения , чтобы отфильтровать не алфавитно-цифровые символы от дальнейшей обработки события, включая ключ Return:
if (!alphaNumericCheck(event.keyCode)) return;