jQuery自动完成不选择项目

时间:2011-05-31 11:02:59

标签: javascript jquery jquery-ui-autocomplete

在选项“来源”中,我使用ajax得到结果+ 1个自定义注释文本,其中包含有关可能结果的信息。喜欢:“显示3456个结果中的2个”。它只是用户的信息。

对于-ul-列表中的最后一个条目,我不会处理以下事件:keyup,keydown,pageup和pagedown。

为此,我选择“打开”设置:

open: function(event, ui) {
$("ul.ui-autocomplete.ui-menu li:last").removeClass("ui-menu-item").removeAttr("role").html('Show 2 of 3456 results');
},

HTML现在看起来像这样:

<ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all" role="listbox" aria-activedescendant="ui-active-menuitem" style="z-index: 1; top: 39px; left: 79px; display: block; width: 273px;">
<li class="ui-menu-item" role="menuitem">
    <a class="ui-corner-all" tabindex="-1">Result 1</a>
</li>
<li class="ui-menu-item" role="menuitem">
    <a class="ui-corner-all" tabindex="-1">Result 2</a>
</li>
<li class="">Show 2 of 3456 results</li>
</ul>

如果它至少给出最小的一个实际结果,而不仅仅是最后一个音符文本。

但是如果没有结果可用且只有注释文本(最后一项)“没有结果”,那么我会在事件中收到一条错误消息:keyup,keydown,pageup和pagedown。

Firebug中的错误:item.offset()为null

<ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all" role="listbox" aria-activedescendant="ui-active-menuitem" style="z-index: 1; top: 39px; left: 79px; display: block; width: 273px;">
<li class="">No Results</li>
</ul>

如何添加自定义列表结尾并且无法选择?

jQuery-UI 1.8.13

2 个答案:

答案 0 :(得分:2)

我发现如果您的li元素不包含a标记,则此小部件会抱怨。我意识到这使得它可以选择,所以你要么必须为你的情况扩展一些类,要么创建一个CSS规则,确保li没有得到一个选定状态(这有点像黑客攻击,我承认)

答案 1 :(得分:1)

为什么不绑定到selectchange事件来检查您要添加到对象的自定义数据(可通过ui.item参数获取,而不是弄乱CSS选择器对那些事件)?你最终会得到这样的东西:

$(function() {
    $("#acInput").autocomplete({
                                    source: availableTags,
                                    select: function(event, ui) { 
                                        // if it's your info item, then
                                        event.preventDefault(); 
                                    },
                                    change: function(event, ui) { 
                                        // if it's your info item, then
                                        event.preventDefault();
                                    }
                               });
});

请注意,preventDefault()只会停止该事件。在某些情况下(使用键盘导航列表时),它将使用项目的值填充输入。如果您确定所选项目或要更改的值实际上是您的数据项,则您希望测试重置文本框的值。