如何在匹配前更改输入的文本

时间:2009-05-13 12:30:39

标签: jquery autocomplete

我有一个jQuery.autocomplete字段,显示有限范围的十进制数字。例如:

var the_list = ['+2.23', '+1.10', '-1.10', '-2.00', '-3.00',]

但我允许用户输入“2.3”和“-5”等数据。当我开始输入这些值时,至少我可以得到部分匹配来帮助我。

但是,如果我(或其他手指笨拙的人)输入'2,3'(用逗号而不是小数点),该怎么办?一旦我点击逗号,我就不会得到任何匹配。这可以通过某种方式解决吗?

我的想法是在 keydown上创建一个处理程序 -event在autocomplet-handler启动之前用小数点替换逗号。我试图在字段中添加一个事件处理程序,但随后自动完成程序停止工作,并且似乎无法指定处理程序的执行顺序。

如果可能的话,请告诉我如何做到这一点。欢迎任何建议。

2 个答案:

答案 0 :(得分:2)

假设您正在使用此处找到的jquery的自动完成插件: http://www.pengoworks.com/workshop/jquery/autocomplete.htm

然后修改插件文件以更改此内容:

    function onChange() {
    // ignore if the following keys are pressed: [del] [shift] [capslock]
    if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ) return $results.hide();
    var v = $input.val();
    if (v == prev) return;
    prev = v;
    if (v.length >= options.minChars) {
        $input.addClass(options.loadingClass);
        requestData(v);
    } else {
        $input.removeClass(options.loadingClass);
        $results.hide();
    }
};

到此:

    function onChange() {
    // ignore if the following keys are pressed: [del] [shift] [capslock]
    if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ) return $results.hide();
    var v = $input.val();
            v = fixBadChars(v);
    if (v == prev) return;
    prev = v;
    if (v.length >= options.minChars) {
        $input.addClass(options.loadingClass);
        requestData(v);
    } else {
        $input.removeClass(options.loadingClass);
        $results.hide();
    }
};
    function fixBadChars(v) {
         // Customize this to your tastes
         return v.replace(',','.');
    };

我只是快速浏览一下这个插件,但我猜/希望这可能会有用......

//开始编辑 两者之间的差异是:

    v = fixBadChars(v);

    function fixBadChars(v) {
         // Customize this to your tastes
         return v.replace(',','.');
    };

//结束编辑

以下是该插件的直接链接: 参考:http://www.pengoworks.com/workshop/jquery/lib/jquery.autocomplete.js

答案 1 :(得分:0)

非常感谢DismissedAsDrone帮助我设法让我的东西工作。我对建议的解决方案稍作修改,因为我想更新输入框的实际值,而不仅仅是搜索中使用的值。

这就是我所做的

我开始使用jQuery的this autocomplete-plugin(v1.0.2)。

我在 $。Autocompleter.defaults 对象代码中添加了一个preFilter选项(1行代码):

$.Autocompleter.defaults = {
    inputClass: "ac_input",
    ...,
    preFilter: function(value) { return value; },
    ...

在onChange函数中,我在 var currentValue ... 行之后添加了preFilter(4行代码)的用法:

var currentValue = $input.val();

if ( options.preFilter(currentValue) != currentValue ) {
    $input.val(options.preFilter(currentValue));
    return;
}

如何使用

要使用新选项来解决我的具体问题,我就这样使用它:

$(function() {
    $("#the_inputfield").autocomplete(the_data, {
        minChars: 0,
        max: 100,
        selectFirst: false,
        matchContains: true,
        preFilter: function(value) { return value.replace(',','.'); },
    });
});