【问题标题】:jQuery autocomplete should skip disabled element when using keyboard使用键盘时,jQuery 自动完成应该跳过禁用的元素
【发布时间】:2013-08-27 12:31:11
【问题描述】:

如果你看到这个Fiddle demo,不是我做的,那么我该如何避免键盘向下并选择禁用的元素?鼠标工作正常(无法选择它)但我可以用键盘向下并选择它,导致搜索为空:-/

Fiddle 演示来自这篇文章,How to disable element in jQuery autocomplete list

jQuery 代码:

$(function () {
var availableTags = [
    "ActionScript",
    "AppleScript",
    "Asp",
    "BASIC",
    "C",
    "C++",
    "Clojure",
    "COBOL",
    "ColdFusion",
    "Erlang",
    "Fortran",
    "Groovy",
    "Haskell",
    "Java",
    "JavaScript",
    "Lisp",
    "Perl",
    "PHP",
    "Python",
    "Ruby",
    "Scala",
    "Scheme"];

$("#tags").autocomplete({
    source: availableTags,
    response: function (event, ui) {
        if (ui.content.length > 3) {
            while (ui.content.length > 3) {
                ui.content.pop();
            }
            ui.content.push({
                'label': 'Please narrow down your search',
                    'value': ''
            });
        }
    }
}).data("ui-autocomplete")._renderItem = function (ul, item) {
    return $("<li " + (item.value == '' ? 'class="ui-state-disabled"' : '') + ">")
        .append("<a>" + item.label + "</a>")
        .appendTo(ul);
};
});

【问题讨论】:

  • 我也有同样的问题...

标签: jquery jquery-ui events jquery-ui-autocomplete


【解决方案1】:

自动完成“知道”以根据每个 li&lt;a&gt; 的存在来突出显示项目。您可以通过移除锚点来禁用事件的键盘选择:

.data("ui-autocomplete")._renderItem = function (ul, item) {
        var $el = $("<li>");
        if (item.value === '') {
            $el.addClass("ui-state-disabled")
               .text(item.label);

        } else {
            $el.append("<a>" + item.label + "</a>");
        }

        return $el.appendTo(ul);
    };

示例: http://jsfiddle.net/m6zvf/12/

【讨论】:

  • 为什么要写 var $el = $("&lt;li&gt;") 而不仅仅是 var el = $("&lt;li&gt;")? $-sign 是其他编码语言的旧习惯还是在 jQuery 的其他地方需要?
  • 如果你想指定一个变量包含一个jQuery对象,你可以使用这个约定。这只是惯例,不是必需的。请参阅此this question 了解更多信息。
  • 这似乎不再适用于新的 jQuery UI (1.11)。希望看到解决方案。
  • @ragulka:我现在没有时间想出一个例子,但是这里的“类别”例子jqueryui.com/autocomplete/#categories有一个列表中无法选择的项目的例子。跨度>
  • @ragulka 这肯定是 jQuery UI 1.11 中的错误吗?必须明确设置 this.widget().menu("option", "items", "&gt; :not(.ui-state-disabled)"); 对我来说似乎很奇怪。
【解决方案2】:

对于 Andrews 的回答,如果您想保留将焦点包裹到第一个项目的向下键,您可以使用 focus 事件在无法聚焦的项目成为焦点时触发第一个项目上的 mouseenter。

只需将下面的代码添加为焦点属性

WORKING JS FIDDLE

    focus: function(event, ui){
        var curr = $(event.currentTarget).find('a.ui-state-focus');
        if(curr.parent().hasClass('ui-state-disabled'))
        {
            event.preventDefault(); 
            curr.parent().siblings().first().children('a').mouseenter();  
        }
    }

【讨论】:

  • mouseenter 不会将值放入输入中,因此我触发 keydown:focus : function(event, ui) { if (ui.item === '') { event.preventDefault(); // 跳过第一项并选择第二项 var secondItem = $(event.currentTarget).children().eq(1); var e = jQuery.Event("keydown"); e.keyCode = 40; secondItem.trigger(e); } }
猜你喜欢
  • 1970-01-01
  • 2022-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多