jquery自动完成取消焦点事件

我有一个自动完成function,但是当我键入要搜索的文本并将鼠标移到自动完成的结果上时,自动完成中的文本会更改为上一个(删除)。 有谁知道如何改善这种行为。

我在jQuery.com上读过

焦点类型:autocompletefocus

在将焦点移动到项目(不选择)之前,ui.item指的是焦点项目。 焦点的默认操作是将文本字段的值替换为焦点项的值,但前提是焦点事件是由键盘交互触发的。 取消此事件可防止更新值,但不会阻止菜单项被聚焦。

但我不知道如何取消焦点事件。

你是对的,jquery autocpmplete在他们自己的[demo page] [1]上有这个bug。
如果您键入一些文本并且自动完成显示了一些答案,您可以获得它; 然后你添加一些额外的文本,同时你徘徊在一个答案,程序将削减你的附加文本。
您可以在自动完成小部件中查看源代码

blur: function (event, ui) { // don't set the value of the text field if it's already correct // this prevents moving the cursor unnecessarily if (self.menu.element.is(":visible") && (self.element.val() !== self.term)){ self.element.val(self.term); } } 

你可以通过注释掉这行self.element.val(self.term);来找出你的问题self.element.val(self.term); 但这不是一个好主意。 您可以将错误发布到jquery!

默认情况下,jquery-ui的自动完成小部件不会替换鼠标hover时的输入文本。 但是,如果您复制了以下代码,请访问http://jqueryui.com/demos/autocomplete/#custom-data :

 1 $( "#project" ).autocomplete({ 2 minLength: 0, 3 source: projects, 4 focus: function( event, ui ) { 5 $( "#project" ).val( ui.item.label ); 6 return false; 7 }, 

这正是你得到的。 如果您不想要这种行为,只需从第4-7行中删除焦点选项即可。

正如您在问题中所述,可以取消jQuery自动完成的焦点事件 。 Focus是一个函数,第一个参数是jQuery Event对象。 根据活动文档:

事件

…它标准化目标,relatedTarget,metaKey和pageX / Y属性,并提供stopPropagation()和preventDefault()方法。

然后,您可以使用preventDefault()方法:

 $( ".selector" ).autocomplete({ focus: function( event, ui ) { event.preventDefault(); } }); 

通过调用event.preventDefault()来取消事件(并非所有事件都可以取消,请检查event.cancelable )。 https://developer.mozilla.org/en/DOM/event.preventDefault

这将设置值为输入,删除焦点

  $( "#to" ).autocomplete({ source: availableTags, select: function (event, ui) { $( "#to" ).val( ui.item.label ); $('#to').blur(); return false ; } });