<p:selectOneMenu caseSensitive ="true">似乎没有任何效果

Imr*_*ram 5 jsf selectonemenu primefaces

我有以下选择一个菜单.但是区分大小写并不适用.当我按小a或大写A时,它总是显示小a(以先发生者为准).

        <p:selectOneMenu id="tempSelect" caseSensitive="true">
                        <f:selectItem itemLabel="0" itemValue="0"/>
                        <f:selectItem itemLabel="a" itemValue="a"/>
                        <f:selectItem itemLabel="A" itemValue="A"/>
                        <f:selectItem itemLabel="b" itemValue="b"/>
        </p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

我的主要版本是5.2.

当选择框处于焦点时.我按下字母"a"字母或者按下大写字母"A",在这两种情况下它只在框中显示"a"(因为它首先出现在列表中).这是实际行为.

我的预期行为是,当我按下"a"时它会输出"a",当我按下"A"时,它会在框中输入"A".

我该怎么办?

Mar*_*ros 6

Primefaces 5.2文档(页430)说,关于区分大小写的选项:

定义过滤是否区分大小写.

因此,此选项仅在您使用filter ="true"时适用,并且仅适用于您在过滤器框中键入的值.

当您专注于SelectOneMenu控件并输入一个值时,搜索将始终不区分大小写,您可以在Primefaces源代码中看到(第848行).请注意,在比较之前,文本放在LowerCase中.

return $(this).text().toLowerCase().indexOf(text.toLowerCase()) === 0;
Run Code Online (Sandbox Code Playgroud)

解决此问题的一种方法(不是很优雅)是覆盖负责此过滤器的Primefaces函数.请记住,在这种情况下,同一页面中的其他SelectOneMenu控件也将区分大小写.

所以848行会变成这样:

return $(this).text().indexOf(text) === 0;
Run Code Online (Sandbox Code Playgroud)

可能应该考虑的另一个细节(如果你真的要覆盖该函数)是源代码的第842行,Primefaces丢弃所有具有Shift键的条目.

metaKey = e.metaKey||e.ctrlKey||e.shiftKey;
Run Code Online (Sandbox Code Playgroud)

因此,这条线也应该像下面那样改变以便于输入大写字母:

metaKey = e.metaKey||e.ctrlKey;
Run Code Online (Sandbox Code Playgroud)

因此,考虑到这两个变化,以及Primefaces 5.2最终版本(缩小),解决方案是在SelectOneMenu之后的某处添加以下代码.

<script>
    PrimeFaces.widget.SelectOneMenu.prototype.bindKeyEvents = function() {
        var a = this;
        this.focusInput.on("keydown.ui-selectonemenu", function(d) {
            var c = $.ui.keyCode, b = d.which;
            switch (b) {
            case c.UP:
            case c.LEFT:
                a.highlightPrev(d);
                break;
            case c.DOWN:
            case c.RIGHT:
                a.highlightNext(d);
                break;
            case c.ENTER:
            case c.NUMPAD_ENTER:
                a.handleEnterKey(d);
                break;
            case c.TAB:
                a.handleTabKey();
                break;
            case c.ESCAPE:
                a.handleEscapeKey(d);
                break
            }
        }).on(
                "keyup.ui-selectonemenu",
                function(g) {
                    var f = $.ui.keyCode, d = g.which;
                    switch (d) {
                    case f.UP:
                    case f.LEFT:
                    case f.DOWN:
                    case f.RIGHT:
                    case f.ENTER:
                    case f.NUMPAD_ENTER:
                    case f.TAB:
                    case f.ESCAPE:
                    case f.SPACE:
                    case f.HOME:
                    case f.PAGE_DOWN:
                    case f.PAGE_UP:
                    case f.END:
                    case f.DELETE:
                    case 16:
                    case 17:
                    case 18:
                    case 224:
                        break;
                    default:
                        var i = $(this).val(), c = null, h = g.metaKey
                                || g.ctrlKey;
                        if (!h) {
                            clearTimeout(a.searchTimer);
                            c = a.options.filter(function() {
                                return $(this).text()
                                        .indexOf(i) === 0
                            });
                            if (c.length) {
                                var b = a.items.eq(c.index());
                                if (a.panel.is(":hidden")) {
                                    a.selectItem(b)
                                } else {
                                    a.highlightItem(b);
                                    PrimeFaces.scrollInView(
                                            a.itemsWrapper, b)
                                }
                            }
                            a.searchTimer = setTimeout(function() {
                                a.focusInput.val("")
                            }, 1000)
                        }
                        break
                    }
                })
    }
</script>
Run Code Online (Sandbox Code Playgroud)

要测试,请记住每次击键之间有一个1秒的计时器,以清除已输入的字母缓存并开始一个新单词.