0

我想在 jquery 自动完成中突出显示匹配的字符。

如果我输入 GC,它会在下面给我,没关系

Green Community

现在我希望 G 和 C 都大胆/强烈。

$('#9').autocomplete({
    source: "auto_loc_name.php",
    selectFirst: true, 
         minLength: 0,
    select: function (event, ui) {
        alert(ui.item.value);
    }
});
4

2 回答 2

0

您可以根据jQueryUI 中的代码尝试类似的操作:如何自定义格式化自动完成插件结果?

function monkeyPatchAutocomplete() {

$.ui.autocomplete.prototype._renderItem = function (ul, item) {
    var matchstring = [];
    $.each(this.term.split(""), function(index, c){         
         matchstring.push("^"+c+"|\b"+c);
    });

    var output = item.label.replace(new RegExp("(" + matchstring.join("|") + ")", "gi"), '<span class="ui-menu-item-highlight">$1</span>');

    return $("<li>")
        .append($("<a>").html(output))
        .appendTo(ul);
};
}

$(function () {
    monkeyPatchAutocomplete();
});

可能会或可能不会工作。这个想法是为每个字符获取一个像 ^G|\bG 这样的正则表达式字符串。我敢肯定这会遗漏很多案例,所以请继续努力。

编辑:工作 jFiddle。http://jsfiddle.net/9MC5M/与上面的代码类似,但修复了一些错误。搜索被故意破坏,它只返回所有项目以展示突出显示。

于 2013-06-27T13:06:29.973 回答
0

我使用 JQuery Autocomplete 作为组合框,您的需求与我配合得很好,您可以查看以下代码可能对您有所帮助:

(function( $ ) {
            $.widget( "ui.combobox", {
                _create: function() {
                    var input,
                    self = this,
                    select = this.element.hide(),
                    selected = select.children( ":selected" ),
                    value = selected.val() ? selected.text() : "",
                    wrapper = $( "<span>" )
                    .addClass( "ui-combobox" )
                    .insertAfter( select );

                    input = $( "<input>" )
                    .appendTo( wrapper )
                    .val( value )
                    .addClass( "ui-state-default" )
                    .autocomplete({
                        delay: 0,
                        minLength: 0,
                        source: function( request, response ) {
                            var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
                            response( select.children( "option" ).map(function() {
                                var text = $( this ).text();
                                if ( this.value && ( !request.term || matcher.test(text) ) )
                                    return {
                                        label: text.replace(
                                        new RegExp(
                                        "(?![^&;]+;)(?!<[^<>]*)(" +
                                            $.ui.autocomplete.escapeRegex(request.term) +
                                            ")(?![^<>]*>)(?![^&;]+;)", "gi"
                                    ), "<strong>$1</strong>" ),
                                        value: text,
                                        option: this
                                    };
                            }) );
                        },
                        select: function( event, ui ) {
                            ui.item.option.selected = true;
                            self._trigger( "selected", event, {
                                item: ui.item.option
                            });
                        },
                        change: function( event, ui ) {
                            if ( !ui.item ) {
                                var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" ),
                                valid = false;
                                select.children( "option" ).each(function() {
                                    if ( $( this ).text().match( matcher ) ) {
                                       this.selected = valid = true;
                                        return false;
                                    }
                                });
                                if ( !valid ) {
                                    // remove invalid value, as it didn't match anything
                                    $( this ).val( "" );
                                    select.val( "" );
                                    input.data( "autocomplete" ).term = "";
                                    return false;
                                }
                            }
                        }
                    })
                    .addClass( "ui-widget ui-widget-content ui-corner-left" );

                    input.data( "autocomplete" )._renderItem = function( ul, item ) {
                        return $( "<li></li>" )
                        .data( "item.autocomplete", item )
                        .append( "<a>" + item.label + "</a>" )
                        .appendTo( ul );
                    };

                    $( "<a>" )
                    .attr( "tabIndex", -1 )
                    .attr( "title", "Show All Items" )
                    .appendTo( wrapper )
                    .button({
                        icons: {
                            primary: "ui-icon-triangle-1-s"
                        },
                        text: false
                    })
                    .removeClass( "ui-corner-all" )
                    .addClass( "ui-corner-right ui-button-icon" )
                    .click(function() {
                        // close if already visible
                        if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
                            input.autocomplete( "close" );
                            return;
                        }

                        // work around a bug (likely same cause as #5265)
                        $( this ).blur();

                        // pass empty string as value to search for, displaying all results
                        input.autocomplete( "search", "" );
                        input.focus();
                   });
                }

            });
        })( jQuery );

我认为您在以下部分中需要,但我不知道如何在您的代码中使用它:

source: function( request, response ) {
                            var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
                            response( select.children( "option" ).map(function() {
                                var text = $( this ).text();
                                if ( this.value && ( !request.term || matcher.test(text) ) )
                                    return {
                                        label: text.replace(
                                        new RegExp(
                                        "(?![^&;]+;)(?!<[^<>]*)(" +
                                            $.ui.autocomplete.escapeRegex(request.term) +
                                            ")(?![^<>]*>)(?![^&;]+;)", "gi"
                                    ), "<strong>$1</strong>" ),
                                        value: text,
                                        option: this
                                    };
                            }) );
                        },
于 2013-06-27T13:41:33.010 回答