I have a bit of JavaScript that builds some HTML for me and inserts it into a div
. I am using jQuery 1.7.2 for this test.
I'm interested in attaching a custom change or keyup event handler on an input
text field called gene_autocomplete_field
.
Here's what I have tried so far.
The following function builds the HTML, which is inserted into a div
called 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) );
In my calling HTML, I grab the gene_autocomplete_field
from the gene_container
element, and then I override the keyup
event handler for 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>
When I change the text in gene_autocomplete_field
, the refreshGenePicker()
function just sends an alert:
function refreshGenePicker(val) {
alert(val);
}
Result
If I type any letter into the gene_autocomplete_field
element, the event handler seems to call alert(val)
an infinite number of times. I get one alert after another and the browser gets taken over by the dialog boxes. The value returned is correct, but I worry that refreshGenePicker()
gets called over and over again. This is not correct behavior, I don't think.
Questions
- How do I properly capture the
keyup
event once, so that I only handle a content change to the autocomplete field the one time? - Is there a different event I should use for this purpose?
UPDATE
It turns out that more than just a keyCode
of 13 (Return/Enter) can be an issue — pressing Control, Alt, Esc or other special characters will trigger an event (but will be asymptomatic, as far as the infinite loop issue goes). The gene names I am filtering on do not have metacharacters in them. So I made use of an alphanumeric detection test to filter out non-alphanumeric characters from further event handling, which includes the Return key:
if (!alphaNumericCheck(event.keyCode)) return;