我在让 jQuery 的自动完成小部件为我工作时遇到了很多麻烦。我正在使用来自服务器的键/值对列表。
我有以下要求:
如果用户从小部件中选择一个值,我想将 ID 传递给服务器。
如果用户没有选择值并输入原始文本,或者修改了已选择的值,我希望清除 ID 字段并将原始文本发送到服务器。
假设someAjaxFunction
返回自动完成小部件期望的对象数组:{label:label, value:key}
.
最初我像这样设置自动完成小部件:
$(input).autocomplete({
source: sourceFunction,
minLength: 1
});
即使通过将鼠标悬停在其中一项上来更改选择,也会将 $(input) 引用的文本框中的文本更改为基础键,而不是标签。从用户交互的角度来看,这是非常不可取的——事实上,我正在调查这个问题的真正原因是因为我正在构建的网站的用户一直对他们输入的文本似乎变成随机数感到困惑!
我在文本框下添加了一个隐藏字段并实现了 select() 和 focus() 事件,以便像这样隐藏 ID:
$(input).autocomplete({
source: sourceFunction,
minLength: 1
focus: function(event, ui) {
$(idField).val(ui.item.value);
$(this).val(ui.item.label);
return false;
},
select: function(event, ui) {
$(idField).val(ui.item.value);
$(this).val(ui.item.label);
return false;
},
minLength: 1
});
当用户坚持使用自动完成下拉菜单提供的脚本时,这很有效。ID 被隐藏并正确提交给服务器。不幸的是,如果用户想在框中输入一些自由格式的文本并根据该值进行搜索,则 ID 字段不会重置,并且之前选择的 ID 会提交给服务器。这也是相当混乱的。
jQuery UI Autocomplete 文档列出了一个change
事件,并声明参数的item
属性ui
将设置为所选项目。我想我可以在按键时重置隐藏的 id 字段,如果自动完成更改,则重新填充 ID。不幸的是,除了 keypress 事件捕获一大堆不应重置 ID的按键之外,return false
上述select
事件中管理文本框中文本所必需的语句会阻止change
事件正确分配 ui.item。
所以现在我被困住了——我真的不知道我还能尝试什么让小部件支持默认情况下应该支持的功能。要么这个过程比它应该的要复杂得多,要么我错过了一些非常明显的东西。我已经挑选了所有可用的事件和所有示例,但空手而归。事实上,即使是 jQuery UI 页面上的“自定义数据和显示”示例也存在这个问题。
我可以在服务器端添加一些技巧来解决这个问题,但我真的更希望能够在客户端级别做到这一点。
我也更愿意坚持使用 jQuery UI 自动完成小部件,而不是切换到另一个小部件。