使用jQuery UI自动完成组合框可以限制输入无效的击键吗?

使用jQuery UI自动完成组合框可以限制输入无效的击键吗?,jquery,keypress,jquery-ui-autocomplete,Jquery,Keypress,Jquery Ui Autocomplete,当使用组合框时,我认为有一个选项可以根据列表强制输入有效的键。是否有任何方法不允许使用无效密钥,以便您只能在列表中输入有效项?还有,有没有办法设置combobox的默认值 如果我的列表中有(C#、Java、Python) 我可以开始输入“abcds…”,这样我就可以输入了。我希望只允许有效的条目。您的问题似乎也是在上的常见要求,并且在人们一直在讨论这个问题的情况下 这个问题的答案是正确的。因此,我们的解决方案确实值得获得声誉积分 或者,您可以使用“mustMatch”选项 $(文档).read

当使用组合框时,我认为有一个选项可以根据列表强制输入有效的键。是否有任何方法不允许使用无效密钥,以便您只能在列表中输入有效项?还有,有没有办法设置combobox的默认值

如果我的列表中有(C#、Java、Python)


我可以开始输入“abcds…”,这样我就可以输入了。我希望只允许有效的条目。

您的问题似乎也是在上的常见要求,并且在人们一直在讨论这个问题的情况下

这个问题的答案是正确的。因此,我们的解决方案确实值得获得声誉积分

或者,您可以使用“mustMatch”选项


$(文档).ready(函数(){
var availableTags=[“csharp”、“java”、“python”];
$(“#标记”).autocomplete(可用标记{
mustMatch:对
});
});
更新

起初,我没想到您想要一个组合框解决方案。谢谢你说得更清楚

我需要做一些修改,使它在表单中实际工作。我引入了一个短暂的延迟,以确保事件按正确的顺序发生。除此之外,我插入了Hoffiday医生的解决方案

我使用了一个“change”事件,但是您也可以使用“close”事件使某些内容正常工作。我不想这么说,但到目前为止,我使用新的jQueryUIAutoComplete的经验是,它有点不可靠。当您配置了多种类型的事件回调时,事情似乎会一团糟

更新2

我根据Doc Hoffiday的解决方案添加了一个新的自定义选择器,以便在输入的文本与valid选项的开头匹配时不会被覆盖。我还对其进行了更新,以便源代码将提供的选项限制为更精确的匹配。我希望这更接近你的要求


更新2

Tested on
Internet Explorer 6 and later
Chrome
Firefox
Opera
演示:

核心JavaScript代码:

    var Tags = ['csharp', 'java', 'python' ];

    $("#autocomplete").keypress(function(event) {
        //Firefox workaround..
        if (!event.which &&
            ((event.charCode || event.charCode === 0) ? event.charCode: event.keyCode)) {

            event.which = event.charCode || event.keyCode;
        }
        var charCode = String.fromCharCode(event.which).toLowerCase();
        var search_val = this.value + charCode;
        var x = search_val.length - 1;
        var match;
        for (var i = 0; i < Tags.length; i++) {
            if (charCode == Tags[i][x] && Tags[i].indexOf(search_val) != -1) {
                match = true;
            }
        }
        //Backspace functionality added!
        if (!match && event.which != 8 ) {
            event.preventDefault();
        }
    });
var标记=['csharp','java','python'];
$(“#自动完成”)。按键(功能(事件){
//Firefox解决方案。。
如果(!event.which)&&
((event.charCode | | event.charCode==0)?event.charCode:event.keyCode)){
event.which=event.charCode | | event.keyCode;
}
var charCode=String.fromCharCode(event.which.toLowerCase();
var search_val=this.value+charCode;
var x=搜索值长度-1;
var匹配;
对于(var i=0;i
注意:

    var Tags = ['csharp', 'java', 'python' ];

    $("#autocomplete").keypress(function(event) {
        //Firefox workaround..
        if (!event.which &&
            ((event.charCode || event.charCode === 0) ? event.charCode: event.keyCode)) {

            event.which = event.charCode || event.keyCode;
        }
        var charCode = String.fromCharCode(event.which).toLowerCase();
        var search_val = this.value + charCode;
        var x = search_val.length - 1;
        var match;
        for (var i = 0; i < Tags.length; i++) {
            if (charCode == Tags[i][x] && Tags[i].indexOf(search_val) != -1) {
                match = true;
            }
        }
        //Backspace functionality added!
        if (!match && event.which != 8 ) {
            event.preventDefault();
        }
    });
  • 根据列表仅强制输入有效的密钥
  • 设置默认值
  • 轻量级实现;-)
    让我知道

    设置自动完成后,使用此代码防止空格字符和等于字符(ASCII代码32和61)。以及设定默认值

         $("#myautocompletectrl").keypress(function (e) {
            if (e.which == 32 | e.which == 61) {
              e.preventDefault();
            }
         }).val('mydefaultvalue');
    
    它的行为就像从未按下过键一样(正如您所说的)

    在Firefox3.63和jQueryUI1.8自动完成上测试

    此外,如果您发现还想在jQuery UI 1.8自动完成中实现mustMatch功能,请查看以下内容:

    编辑:我看到您已经阅读并评论了我的帖子……)


    它对我有用。。。谢谢你,马克·迈凯轮-我正努力让这个功能在combobox上发挥作用。我将问题中的链接更新为clarify@Mark迈凯轮-我在chrome和firefox上都试过了,它允许我输入“jjjj..”,所以它似乎不会限制我的阅读keystrokes@Mark迈凯轮-我不希望它清除完整的输入,当我输入一个无效的键,我只希望它的行为,就像从来没有按下过键。例如,如果我输入“java”,然后输入“a”,则组合框应保持为“java”“@aSeptik-它似乎可以在ie和chrome上运行。完美的这在Firefox 3.6.4hey bro上不起作用,我已经修复了它,就像Firefox不讨厌这个事件一样。keykode!但现在不必担心,这是固定的!;-)让我知道!查看更新的演示链接!PS:不要在jsbin上测试它!探险家太差劲了!现在它似乎在firefox上也能工作,所以谢谢你。这里缺少的一件事(仅在firefox中)是对backspace键的支持,因为您不能返回,这似乎是次优的。思想?退格似乎在IE和Chrome中起作用
    $("#myautocompletectrl").keypress(function (e) {
        if (e.which == 32 | e.which == 61) {
          e.preventDefault();
        }
     }).val('mydefaultvalue');