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".
我该怎么办?
该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秒的计时器,以清除已输入的字母缓存并开始一个新单词.
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |