如何使 jQuery 自动完成列表显示所有选项 onfocus 并在选择选项后隐藏?

Posted

技术标签:

【中文标题】如何使 jQuery 自动完成列表显示所有选项 onfocus 并在选择选项后隐藏?【英文标题】:How to make jQuery autocomplete list display all options onfocus and hide after option is selected? 【发布时间】:2012-01-02 15:28:03 【问题描述】:

我有一个带有自动完成功能的表单,它启动搜索“onfocus”并在用户点击搜索字段时显示选项列表,即使他们没有输入任何内容。

问题是自动完成需要使用键盘选择选项(向下箭头后跟制表符/返回或双击)。我的第一个想法是单击一下会使焦点保留在搜索字段中,因此自动完成功能保持可见。但是,第二次单击后搜索字段仍保持焦点,但第二次单击后自动完成消失。

有什么想法吗?

<script>
$(document).ready(function() 

    var autocomplete_focus = function()           
        if ($(this).val().length == 0) 
            $(this).autocomplete("search", "%");
        
       

    $( ".autocomplete" ).autocomplete(
            source: "../../db/autocomplete_list.php",
            minLength: 0
    );

    $( ".autocomplete" ).focus(autocomplete_focus);

);
</script>

我知道similar question 之前已经在这里发布过;但是,建议的解决方案对我不起作用。

【问题讨论】:

你看到问题here了吗? 是的,这似乎有效;但是,由于某种原因,问题似乎只发生在远程源上。 啊,好的。我会做更多的挖掘。 谢谢!请参阅下面亚历克斯的回答。那也是我得到的最接近的;然而,并不完美! 【参考方案1】:

这个方法:

$( ".autocomplete" ).autocomplete(
        source: "../../db/autocomplete_list.php",
        minLength: 0
).focus(function()            
        $(this).trigger('keydown.autocomplete');
);

为我工作。

来源:

Display jquery ui auto-complete list on focus event

【讨论】:

这是我找到的最好的解决方案;但是,这只显示“第一个”焦点上的所有值。当我在页面加载后专注于搜索字段时,它会显示所有值。但是,如果我然后单击搜索字段(移除焦点),然后再次单击它,它不会再次拉出完整列表。【参考方案2】:

不确定这是否是一个可接受的解决方案,但一种方法是使用焦点值填充input。这可以防止菜单显示两次:

/* snip: */
focus: function (event, ui) 
    this.value = ui.item.value;
,

这是一个例子: http://jsfiddle.net/wxQf7/

尝试删除focus 事件处理程序以查看问题中的症状。

【讨论】:

美丽的解决方案...你是最棒的! :) 谢谢!! @Michael:没问题!乐意效劳。这实际上应该在小部件本身中修复。【参考方案3】:

试试这个。 这段代码实际上删除了有问题的 keydown.autocomplete。相反,它会在您每次关注文本字段时进行搜索。

$( ".autocomplete" ).autocomplete(
    source: "../../db/autocomplete_list.php",
    minLength: 0
).focus(function() 
    $(this).data("autocomplete").search($(this).val());

但是,如果您希望下拉菜单在您选择条目后立即消失,请添加此行

$( ".autocomplete" ).autocomplete(
    source: "../../db/autocomplete_list.php",
    minLength: 0
).focus(function()

    **if ($(this).autocomplete("widget").is(":visible"))
       return;**
    $(this).data("autocomplete").search($(this).val());

当控件在鼠标点击的情况下接收到焦点时,如果下拉列表已经显示,它不会执行 display-all-on-focus。这就是这段代码的作用

【讨论】:

以上是关于如何使 jQuery 自动完成列表显示所有选项 onfocus 并在选择选项后隐藏?的主要内容,如果未能解决你的问题,请参考以下文章

向 jquery 自动完成添加更多行

Jquery UI自动完成列表不刷新

Grails:如何使 g:textfield 自动完成?

如何在选项选择上使用 jquery 自动完成来进行回发?

设置默认值时,如何使浏览器显示所有数据列表选项?

在 jQuery 自动完成下拉列表中选择选项时失去焦点