12

私は jquery ui オートコンプリート コンボボックスを使用しています。うまく機能していますが、今は少し貪欲になっています。カテゴリを追加できるようにしたいと思います。コンボボックスはメニューから生成されるため、カテゴリを追加すると、以下の例を参照してください。タグは、カテゴリがjquery ui オートコンプリート カテゴリ バージョンにあるように表示されます

<select>
<optgroup name="Cat 1">    
<option value="1a">One A</option>
<option value="1b">One B</option>
<option value="1c">One C</option>
</optgroup>
<optgroup name="Cat 2">    
<option value="2a">Two A</option>
<option value="2b">Two B</option>
<option value="2c">Two C</option>
</optgroup>
</select>

私はhttp://jsfiddle.net/nH3b6/11/ .

助けや指示をありがとう。

4

4 に答える 4

3

jquery 10 にはいくつかの機能があります。jquery ui の Web サイトからオートコンプリート コンボボックスを取得します: http://jqueryui.com/autocomplete/#combobox と Andrew Whitaker の回答に参加します。

(function( $ ) {
$.widget( "custom.combobox_with_optgroup", {
    _create: function() {
        this.wrapper = $( "<span>" )
            .addClass( "custom-combobox" )
            .insertAfter( this.element );
        this.element.hide();
        this._createAutocomplete();
        this._createShowAllButton();
    },
    _createAutocomplete: function() {
        var selected = this.element.find( ":selected" ),
            value = selected.val() ? selected.text() : "";
        this.input = $( "<input>" )
            .appendTo( this.wrapper )
            .val( value )
            .attr( "title", "" )
            .addClass( "custom-combobox-input ui-widget ui-widget-content ui-state-default ui-corner-left" )
            .autocomplete({
                delay: 0,
                minLength: 0,
                source: $.proxy( this, "_source" )
            })
            .tooltip({
                tooltipClass: "ui-state-highlight"
            });
        this._on( this.input, {
            autocompleteselect: function( event, ui ) {
                ui.item.option.selected = true;
                this._trigger( "select", event, {
                    item: ui.item.option
                });
            },
            autocompletechange: "_removeIfInvalid"
        });

        this.input.data("uiAutocomplete")._renderMenu = function(ul, items) {
            var self = this,
                currentCategory = "";
            $.each(items, function(index, item) {
                if (item.category != currentCategory) {
                    if (item.category) {
                        ul.append("<li class='custom-autocomplete-category'>" + item.category + "</li>");
                    }
                    currentCategory = item.category;
                }
                self._renderItemData(ul, item);
            });
        };
    },
    _createShowAllButton: function() {
        var input = this.input,
            wasOpen = false;
        $( "<a>" )
            .attr( "tabIndex", -1 )
            .attr( "title", "Показать все" )
            .tooltip()
            .appendTo( this.wrapper )
            .button({
                icons: {
                    primary: "ui-icon-triangle-1-s"
                },
                text: false
            })
            .removeClass( "ui-corner-all" )
            .addClass( "custom-combobox-toggle ui-corner-right" )
            .mousedown(function() {
                wasOpen = input.autocomplete( "widget" ).is( ":visible" );
            })
            .click(function() {
                input.focus();

                if ( wasOpen ) {
                    return;
                }

                input.autocomplete( "search", "" );
            });
    },
    _source: function( request, response ) {
        var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
        response( this.element.find( "option" ).map(function() {
            var text = $( this ).text();
            if ( this.value && ( !request.term || matcher.test(text) ) )
                return {
                    label: text,
                    value: text,
                    option: this,
                    category: $(this).closest("optgroup").attr("label")
                };
        }) );
    },
    _removeIfInvalid: function( event, ui ) {

        if ( ui.item ) {
            return;
        }

        var value = this.input.val(),
            valueLowerCase = value.toLowerCase(),
            valid = false;
        this.element.find( "option" ).each(function() {
            if ( $( this ).text().toLowerCase() === valueLowerCase ) {
                this.selected = valid = true;
                return false;
            }
        });

        if ( valid ) {
            return;
        }

        this.input
            .val( "" )
            .attr( "title", value + " не существует" )
            .tooltip( "open" );
        this.element.val( "" );
        this._delay(function() {
            this.input.tooltip( "close" ).attr( "title", "" );
        }, 2500 );
        this.input.data( "ui-autocomplete" ).term = "";
    },
    _destroy: function() {
        this.wrapper.remove();
        this.element.show();
    }
});
})( jQuery );
于 2013-09-02T07:26:39.957 に答える
2

jQueryUI docsでわかるように、それを行うにはウィジェットをカスタマイズする必要があります

_renderMenu: function( ul, items ) {
            var self = this,
                currentCategory = "";
            $.each( items, function( index, item ) {
                if ( item.category != currentCategory ) {
                    ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" );
                    currentCategory = item.category;
                }
                self._renderItem( ul, item );
            });
        }

これはテストされていませんが、良いスタートになるはずです:

_renderMenu: function( ul, items ) {
            var self = this,
                currentCategory = "";
            $.each( items, function( index, item ) {
                if ( item.parent.attr('label') != currentCategory ) {
                    ul.append( "<li class='ui-autocomplete-category'>" + item.parent.attr('label') + "</li>" );
                    currentCategory = item.parent.attr('label');
                }
                self._renderItem( ul, item );
            });
        }

これが機能しない場合は、デバッグしてitems、_renderMenu のパラメーターとして渡される配列に何が入っているかを確認する必要があります。

補足:これはMonkeyPatchingと呼ばれます。これをあまり行うことはお勧めしませんが、ドキュメントに示されているので、そうするように言います。

于 2012-06-14T19:39:32.090 に答える
1

私は webapp で jqueryui オートコンプリート ウィジェットを使用しており、コンボボックス モンキー パッチ、optgroup (カテゴリ)、およびカテゴリ名でも検索する機能を備えています。検索用語は、互換性のあるオプションと optgroup 内でも強調されます。この時点に到達するために、stackoverflow と jqueryui の Web サイトからいくつかの回答を使用しました。

jqueryui の最新バージョンで動作し続けるのが好きです。Jqueryui 1.9 と 1.11 は重大な変更を導入し (オートコンプリートとメニュー プラグインで、最新のものは前者で使用されています)、最終的に jqueryui (1.11.0) と jquery (2.1.1) の最新バージョンで動作させることに成功しました。

jsbinはこちら

重要な部分 : メニュー ウィジェット オプションを変更して、新しい項目オプションを介してカテゴリを通常のメニュー リンクと見なさないようにします (ドキュメント内ではなく、1.11 への jqueryui アップグレード ガイドにある新しいものです)。

$.extend($.ui.menu.prototype.options, {
    items: "> :not(.aureltime-autocomplete-category)"
});
于 2014-08-05T20:13:59.903 に答える