如何知道是否使用ENTER选择了jQueryUI自动完成建议?

bfa*_*tto 5 jquery jquery-ui-autocomplete

我正在尝试使用jQuery 1.7.2和jQueryUI 1.8.12来实现具有以下行为的自动填充字段:

  • 如果选择了自动完成建议(使用鼠标或键盘),请调用功能A
  • 如果没有匹配项(因此未选择任何建议)ENTER并被按下,则调用功能B

我遇到的问题是,当我用键盘选择建议时,我的检查ENTER也被触发,这使我在不应该使用时调用函数B。这是一个简单的示例(也在jsfiddle上):

$('input').autocomplete({
    source: ['foo', 'bar', 'baz' ],
    select: function(event, ui) {
      console.log('suggestion selected');   
    }
}).keydown(function(e) {
    if(e.keyCode == 13) console.log('ENTER (keydown)');
}).keyup(function(e) {
    if(e.keyCode == 13) console.log('ENTER (keyup)');
});
Run Code Online (Sandbox Code Playgroud)

根据控制台,在自动完成选择事件(这很奇怪)之后,会触发keyup / keydown处理程序,因此,我试图阻止它(通过尝试冒泡,阻止默认值或同时阻止两者)。我还遍历了事件对象的originalEvent属性,直到最顶层的父对象(原始的KeyboardEvent)为止,但这似乎也无法阻止。

有谁知道我要完成的目标的简单解决方案,最好避免使用标志来表明select事件已被触发?我想避免这种情况,因为这样的标志必须在其他地方清除,这似乎容易出错。

PSL*_*PSL 4

这个怎么样。在注册keydown事件之前,只需绑定一个autocomplete.keydown事件即可。这保证在你按下键盘之前执行。请注意,事件注册的顺序也很重要。

http://jsfiddle.net/zFPZH/

$('input')
    .autocomplete({
        source: ['foo', 'bar', 'baz' ],
        select: function(event, ui) {
            console.log('suggestion selected');         
        }
    }).bind("keydown.autocomplete", function() {
        if(event.keyCode == 13){ 
            console.log('keydown.autocomplete (keyup)'); 
        };
    }).keydown(function(e) {
        if(e.keyCode == 13){ 
            console.log('ENTER (keydown)');
        };
    }).keyup(function(e) {
        if(e.keyCode == 13){ 
            console.log('ENTER (keyup)');
        };
    });
Run Code Online (Sandbox Code Playgroud)