如何检测用户何时忽略jquery自动完成建议

如果用户输入文本而不选择一组自动完成建议,我们需要能够调用处理程序。

在我们的例子中,输入的文本是否与任何自动完成值匹配并不重要 – 我们只关心用户是否单击/选择自动完成值。

我们的表单的工作方式是用户开始输入联系人的姓氏,并获得自动填充建议,包括联系人的全名和公司。 如果用户选择其中一个自动填充建议,我们会填充多个字段。 这一切都很好。

新的要求是,如果用户没有选择其中一个建议,我们需要删除多个字段 – 我们希望使用从自动完成库调用的处理程序来实现这些字段。

看看以前的 答案 ,看起来我们不能用JörnZaefferer的自动完成插件做到这一点,但是如果你有一个补丁或一些想法如何实现这个function,那么这就是我们试图将其推入的库。

我遇到了非常有趣的答案。 它涉及jQuery插件如何管理其状态。 当我看着firebug(带有firequery)时,我发现当我点击显示DOM节点的jQuery属性的图标时(在HTML选项卡中),它显示了附加到DOM节点的所有插件数据,并附加到整个自动完成参数。 因此我找到了解决方案。

$('#test').autocomplete({ change:function( event, ui ) { var data=$.data(this);//Get plugin data for 'this' if(data.autocomplete.selectedItem==undefined) alert("manual"); else alert("selected"); } }); 

自动完成的作用是,如果我们从列表中选择,则selectedItem包含我们刚刚选择的JSON对象及其所有属性。 但是如果我们按ESC或取消自动填充,它将被设置为null。

jquery自动完成具有一些有用的function,您可以使用它们来解决问题。 如果使用忽略自动完成消化,那么你可以使用下面的代码从sugestion中选择值。

假设您的自动填充输入名称是“txtName”,那么您可以将代码编写为:

 $('#txtName').change(function(me) { $('#txtName').search(); }); 

好吧,这是我如何做到的,万一它有所帮助。 每当自动完成字段留下而没有提出建议时,我清除了隐藏字段的值。

我相信search()函数会执行您想要的实际检查,如果在没有data元素的情况下调用result() ,那么您就知道没有使用自动完成。

 autocompleteField.result(function(event, data, formatted) { if (data) { //auto-complete matched //NB: this might get called twice, but that's okay } else { //must have been triggered by search() below //there was no match } }); autocompleteField.blur(function(){ autocompleteField.search(); //trigger result() on blur, even if autocomplete wasn't used }); 

我认为这样做的简单方法是存储文本建议数组,并将其与文本框中实际输入的内容进行比较。 这是onblur还是onsubmit。 在数组中查找实际的条目……如果它不存在则会输入自己的文本。

当用户选择结果时,该插件将触发result事件。 只需在页面加载时将变量初始化为true,然后在“结果”中将其设置为false,然后检查它是否为真。 就像是

 (function() { var typed_in = true; $("#auto").bind("result", function() { typed_in = false }); $("#form").blur(function() { if (typed_in) { // do stuff } else { // do other stuff } typed_in = true; }); )();