12

次のコードがあります。js エラーは発生しません。結果を表示するオートコンプリートを取得できません:

$(function() {
    $.ajax({
    url: "data.xml",
    dataType: "xml",
    cache: false,
    success: function (xmlResponse) {
        var data_results = $("Entry", xmlResponse).map(function () {
            return {
                var1: $.trim($("Partno", this).text()),
                var2: $.trim($("Description", this).text()),
                var3: $.trim($("SapCode", this).text()),
                var4: $("Title", this).text(),
                var5: $.trim($("File", this).text()),
                var6: $.trim($("ItemID", this).text())
            };
        }).get();

        $("#searchresults").autocomplete({
            source: data_results,
            minLength: 3,
            select: function (event, ui) {
                ...
            }
        }).data( "autocomplete" )._renderItem = function( ul, item ) {
                return $( "<li></li>" ).data("item.autocomplete", item)
                    .append( "<a>" + item.var1 + "<br>" + item.var2 + "</a>")
                    .appendTo( ul );
        };

    }
});

私が見逃している可能性のあるアイデアはありますか?前もって感謝します。

4

2 に答える 2

30

今だそう.data('autocomplete')です.data('ui-autocomplete')

ソース: http://jqueryui.com/upgrade-guide/1.10/#re​​moved-data-fallbacks-for-widget-names

于 2013-07-18T10:37:53.940 に答える
7

デフォルトでは、オートコンプリートは、ソース配列にlabelプロパティ、valueプロパティ、またはその両方を持つオブジェクトが含まれていることを想定しています。

それを念頭に置いて、次の 2 つのオプションがあります。

  1. AJAX 呼び出しから配列を処理するときに、ラベルまたは値のプロパティをソース オブジェクトに追加します。

    var data_results = $("Entry", xmlResponse).map(function () {
        return {
            var1: $.trim($("Partno", this).text()),
            var2: $.trim($("Description", this).text()),
            var3: $.trim($("SapCode", this).text()),
            var4: $("Title", this).text(),
            var5: $.trim($("File", this).text()),
            var6: $.trim($("ItemID", this).text()),
            value: $.trim($("Description", this).text())
        };
    }).get();
    

    value割り当てた は 、 、および で検索に使用されfocusますselect

  2. 関数を変更しsourceて、カスタム フィルタリング ロジックを実行します。

    $("#searchresults").autocomplete({
        source: function (request, response) {
            var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
    
            response($.grep(data, function (value) {
                return matcher.test(value.var1) || 
                       matcher.test(value.var2);
                /* etc., continue with whatever parts of the object you want */
            }));
        },
        minLength: 3,
        select: function (event, ui) {
            event.preventDefault();
            this.value = ui.var1 + ui.var2;
        },
        focus: function (event, ui) {
            event.preventDefault();
            this.value = ui.var1 + ui.var2;
        }
    }).data( "autocomplete" )._renderItem = function( ul, item ) {
            return $( "<li></li>" ).data("item.autocomplete", item)
                .append( "<a>" + item.var1 + "<br>" + item.var2 + "</a>")
                .appendTo( ul );
    };
    

    この戦略では、カスタムselectfocusロジックを実装する必要があることに注意してください。

于 2013-03-30T00:41:33.727 に答える