【发布时间】:2012-04-01 13:11:46
【问题描述】:
我有一些 JavaScript 可以为我构建一些 HTML 并将其插入到 div 中。我正在使用 jQuery 1.7.2 进行此测试。
我有兴趣在名为 gene_autocomplete_field 的 input 文本字段上附加自定义更改或 keyup 事件处理程序。
这是我迄今为止尝试过的。
以下函数构建 HTML,将其插入到名为 gene_container 的 div 中:
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_container 元素中获取 gene_autocomplete_field,然后覆盖 gene_autocomplete_field 的 keyup 事件处理程序:
<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事件,以便我只处理一次对自动完成字段的内容更改? - 我应该为此目的使用其他事件吗?
更新
事实证明,不仅仅是 13 的 keyCode(回车/回车)可能是一个问题——按下 Control、Alt、Esc 或其他特殊字符会触发一个事件(但不会出现症状,只要无限循环问题)。我过滤的基因名称中没有元字符。所以我使用alphanumeric detection test 过滤掉进一步事件处理中的非字母数字字符,其中包括返回键:
if (!alphaNumericCheck(event.keyCode)) return;
【问题讨论】:
-
看来 .live 被贬值了 .on api.jquery.com/live
-
你介意发fiddle
标签: javascript jquery html events event-handling