【问题标题】:jQuery autocomplete - need to initiate only when a special character is typedjQuery 自动完成 - 仅在输入特殊字符时才需要启动
【发布时间】:2011-06-11 07:25:21
【问题描述】:

相信你们已经看过这个优秀的插件了:

http://code.drewwilson.com/entry/autosuggest-jquery-plugin

我检查了它,但找不到启动自动提示插件的选项只有在输入特定字符时。在这种情况下,我需要它是 at 符号“@”。

我看到它可以选择设置最小字符数: minChars:数字(默认为 1)

但是,我需要在输入 @ 符号之前不显示下拉菜单。

仅供参考,这里是 jquery.autoSuggest.js 中的选项

        var defaults = { 
        asHtmlID: false,
        startText: "Enter Name Here",
        emptyText: "No Results Found",
        preFill: {},
        limitText: "No More Selections Are Allowed",
        selectedItemProp: "value", //name of object property
        selectedValuesProp: "value", //name of object property
        searchObjProps: "value", //comma separated list of object property names
        queryParam: "q",
        retrieveLimit: false, //number for 'limit' param on ajax request
        extraParams: "",
        matchCase: false,
        minChars: 1,
        keyDelay: 400,
        resultsHighlight: true,
        neverSubmit: false,
        selectionLimit: false,
        showResultList: true,
        start: function(){},
        selectionClick: function(elem){},
        selectionAdded: function(elem){},
        selectionRemoved: function(elem){ elem.remove(); },
        formatList: false, //callback function
        beforeRetrieve: function(string){ return string; },
        retrieveComplete: function(data){ return data; },
        resultClick: function(data){},
        resultsComplete: function(){}
    };  
    var opts = $

谢谢!

【问题讨论】:

    标签: jquery plugins autocomplete autosuggest


    【解决方案1】:

    我觉得你可以和beforeRetrieve一起玩:

    beforeRetrieve: function(string){
     if (string.indexOf('@') == -1) return "";
     return string;
    }
    

    来自文档:

    beforeRetrieve:回调函数 - 在发出 AJAX 请求之前或搜索本地对象之前运行的自定义函数。这用于在处理之前修改搜索字符串。因此,如果用户在 AutoSuggest 框中输入了“jim”,您可以调用此函数在他们的查询前加上“guy_”。进行最终查询 =“guy_jim”。搜索查询被传递到此函数中。示例: beforeRetrieve: function(string){ return string; }

    【讨论】:

    • 感谢您的回复...但是这造成了一种奇怪的行为,突出显示了下拉菜单中字符之间的所有空格。
    【解决方案2】:

    我以前从未使用过此控件,但您似乎想查看jquery.autoSuggest.js 文件(未缩小)。看看这个案例陈述。我认为您需要将 default: 大小写更改为 case x: 其中x 是您要用于触发自动完成的键的 ascii 代码。

                    switch(e.keyCode) {
                        case 38: // up
                            e.preventDefault();
                            moveSelection("up");
                            break;
                        case 40: // down
                            e.preventDefault();
                            moveSelection("down");
                            break;
                        case 8:  // delete
                            if(input.val() == ""){                          
                                var last = values_input.val().split(",");
                                last = last[last.length - 2];
                                selections_holder.children().not(org_li.prev()).removeClass("selected");
                                if(org_li.prev().hasClass("selected")){
                                    values_input.val(values_input.val().replace(","+last+",",","));
                                    opts.selectionRemoved.call(this, org_li.prev());
                                } else {
                                    opts.selectionClick.call(this, org_li.prev());
                                    org_li.prev().addClass("selected");     
                                }
                            }
                            if(input.val().length == 1){
                                results_holder.hide();
                                 prev = "";
                            }
                            if($(":visible",results_holder).length > 0){
                                if (timeout){ clearTimeout(timeout); }
                                timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay);
                            }
                            break;
                        case 9: case 188:  // tab or comma
                            tab_press = true;
                            var i_input = input.val().replace(/(,)/g, "");
                            if(i_input != "" && values_input.val().search(","+i_input+",") < 0 && i_input.length >= opts.minChars){ 
                                e.preventDefault();
                                var n_data = {};
                                n_data[opts.selectedItemProp] = i_input;
                                n_data[opts.selectedValuesProp] = i_input;                                                                              
                                var lis = $("li", selections_holder).length;
                                add_selected_item(n_data, "00"+(lis+1));
                                input.val("");
                            }
                        case 13: // return
                            tab_press = false;
                            var active = $("li.active:first", results_holder);
                            if(active.length > 0){
                                active.click();
                                results_holder.hide();
                            }
                            if(opts.neverSubmit || active.length > 0){
                                e.preventDefault();
                            }
                            break;
                        default:
                            if(opts.showResultList){
                                if(opts.selectionLimit && $("li.as-selection-item", selections_holder).length >= opts.selectionLimit){
                                    results_ul.html('<li class="as-message">'+opts.limitText+'</li>');
                                    results_holder.show();
                                } else {
                                    if (timeout){ clearTimeout(timeout); }
                                    timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay);
                                }
                            }
                            break;
                    }
    

    还可以这样

                    switch(e.keyCode) {
                        case 38: // up
                            e.preventDefault();
                            moveSelection("up");
                            break;
                        case 40: // down
                            e.preventDefault();
                            moveSelection("down");
                            break;
                        case 8:  // delete
                            if(input.val() == ""){                          
                                var last = values_input.val().split(",");
                                last = last[last.length - 2];
                                selections_holder.children().not(org_li.prev()).removeClass("selected");
                                if(org_li.prev().hasClass("selected")){
                                    values_input.val(values_input.val().replace(","+last+",",","));
                                    opts.selectionRemoved.call(this, org_li.prev());
                                } else {
                                    opts.selectionClick.call(this, org_li.prev());
                                    org_li.prev().addClass("selected");     
                                }
                            }
                            if(input.val().length == 1){
                                results_holder.hide();
                                 prev = "";
                            }
                            if($(":visible",results_holder).length > 0){
                                if (timeout){ clearTimeout(timeout); }
                                timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay);
                            }
                            break;
                        case 9: case 188:  // tab or comma
                            tab_press = true;
                            var i_input = input.val().replace(/(,)/g, "");
                            if(i_input != "" && values_input.val().search(","+i_input+",") < 0 && i_input.length >= opts.minChars){ 
                                e.preventDefault();
                                var n_data = {};
                                n_data[opts.selectedItemProp] = i_input;
                                n_data[opts.selectedValuesProp] = i_input;                                                                              
                                var lis = $("li", selections_holder).length;
                                add_selected_item(n_data, "00"+(lis+1));
                                input.val("");
                            }
                        case 13: // return
                            tab_press = false;
                            var active = $("li.active:first", results_holder);
                            if(active.length > 0){
                                active.click();
                                results_holder.hide();
                            }
                            if(opts.neverSubmit || active.length > 0){
                                e.preventDefault();
                            }
                            break;
                        case x:
                            if(opts.showResultList){
                                if(opts.selectionLimit && $("li.as-selection-item", selections_holder).length >= opts.selectionLimit){
                                    results_ul.html('<li class="as-message">'+opts.limitText+'</li>');
                                    results_holder.show();
                                } else {
                                    if (timeout){ clearTimeout(timeout); }
                                    timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay);
                                }
                            }
                            break;
                        default:
                                //Do Nothing
                    }
    

    【讨论】:

    • 非常感谢您的回复....此代码现在似乎根本没有启动下拉菜单....我只需要在输入 at 符号时激活它。即当有人键入@时,它将处于开启状态,并在他们在@之后键入更多文本时开始自动提示。还有其他想法吗?
    • 应该是 case:64 我相信...所以当我添加它时,它不会激活,因为它正在尝试搜索数据中是否有 @ 符号可用,而它永远不会是....当我为空格键添加 case:32 时,它确实成功激活了,因为它实际上在数据中找到了空格....我只需要它在输入 @ 符号时“激活”。谢谢
    • 其实是case:50...所以现在可以了...问题是它正在搜索数据中的@符号...我只需要找到at之后的字符串标志。感谢您提供任何其他帮助
    • @mm-93 找到了在符号@之后找到字符串的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多