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
keyupevent 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;
alertis called infinite times because you use the ‘Enter’ key to confirm/dismiss the alert. Use.on('change')instead. This will preventrefreshGenePickerfrom being called when you use enter in analert.keyup(Click on OK to prevent infinite alerts).changeHowever, the
'change'event will only trigger if the input element looses focus. If you want to userefreshGenePickeron every key, use the following approach instead:This will filter any incoming enter keyup events (jsFiddle demo). Also switch to
.onand drop.live.EDIT: Note that there are more possibilities to dismiss an
alertmodal, such as theescapeorspacekey. You should add a check inside yourrefreshGenePickerwhether the value has actually changed.