6

クイック検索ウィジェットに JQuery UI Autocomplete を使用しています。ホテル、都市、エリアなどのグループ化されたアイテムがいくつかあります。カテゴリをレンダリングできましたが、それらをリンクできませんでした。試してみると、ui オートコンプリート プラグインがアイテムなどのカテゴリを検出します。それは問題ではありませんが、上/下矢印またはマウスを使用してフォーカスすると、次のようなエラーが返されます。

"TypeError: item is undefined. this.liveRegion.text( item.value );"

どうすればこれを修正できますか? JQuery UI Autocomplete の「フォーカス」イベントをいくつかのメソッド (「return falsee.stopPropagationまたはe.preventDefault」など) で使用しようとしましたが、機能しませんでした

これが私のコードです:

$.widget("custom.catcomplete", $.ui.autocomplete, {
        _renderMenu: function (ul, items) {
            var searchkey = "";
            var itemtype = "";
            var searchtype = "";

            var self = this, currentCategory = "";
            $.each(items, function (index, item) {
                if (typeof item.kelime != 'undefined') { searchkey = item.kelime; }
                if (item.category != currentCategory) {
                    if (item.category == "Bölge" || item.category == "Şehir") {
                        itemtype = "cat-bolgeler";
                    } else if (item.category == "Otel") {
                        itemtype = "cat-oteller";
                        searchtype = "otel";
                    } else if (item.category == "Yurt Dışı Tur") {
                        itemtype = "cat-ydtur";
                        searchtype = "yurtdisitur";
                    } else if (item.category == "Yurt İçi Tur") {
                        itemtype = "cat-yitur";
                        searchtype = "yurticitur";
                    } else if (item.category == "Cruise") {
                        itemtype = "cat-cruise";
                        searchtype = "cruise";
                    }
                    if (searchtype != "") {
                        ul.append("<li class='ui-autocomplete-category " + itemtype + "' id='" + item.searchid + "'><a href='/arama/" + searchkey + "?k=" + searchtype + "&q=" + searchkey + "'>" + item.category + "</a></li>");
                    } else {
                        ul.append("<li class='ui-autocomplete-category " + itemtype + "' id='" + item.searchid + "'>" + item.category + "</li>");
                    }
                    currentCategory = item.category;
                }
                self._renderItem(ul, item);
            });
        }
    });

    $(".hizliaratext").catcomplete({
        source: function (request, response) {
            $.ajax({
                url: '/filename.aspx',
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                type: "get",
                data: { kelime: request.term },
                success: function (data) {
                    response($.map(data, function (item) {
                        return {
                            label: item.label,
                            searchid: item.searchid,
                            category: item.category,
                            link: item.link,
                            kelime: item.kelime
                        }
                    }));
                }
            });
        },
        minLength: 3,
        appendTo: "#hizliara",
        select: function (event, ui) {
            window.location = ui.item.link;
        },
        focus: function (event, ui) {
        }
    }).data("catcomplete")._renderItem = function (ul, item) {
        return $("<li>").data("item.autocomplete", item).append("<a>" + item.label + "</a>").appendTo(ul);
    };

「 ?kelime=anka」に対する JSON レスポンスの例を次に示します。

[{"searchid":2001,"label":"Alba Ankara Hotel","category":"Otel","link":"/otel-detay/alba-ankara-hotel","kelime":"anka"},{"searchid":2238,"label":"Ankara Madi İnci Hotel","category":"Otel","link":"/otel-detay/ankara-madi-inci-hotel"},{"searchid":2244,"label":"Madi Hotel Ankara","category":"Otel","link":"/otel-detay/madi-hotel-ankara"},{"searchid":2403,"label":"City Hotel Ankara","category":"Otel","link":"/otel-detay/city-hotel-ankara"},{"searchid":2404,"label":"Doğa Residence Ankara","category":"Otel","link":"/otel-detay/doga-residence-ankara"},{"searchid":6779,"label":"Ankara","category":"Şehir","link":"/ustaramaliste.aspx?y=6779"},{"searchid":6785,"label":"Ankara / Çankaya","category":"Bölge","link":"/ustaramaliste.aspx?y=6785"},{"searchid":14601,"label":"İzmir / Çankaya","category":"Bölge","link":"/ustaramaliste.aspx?y=14601"}]
4

2 に答える 2

3

カテゴリアイテムの/イベントが必要なように聞こえます(そして見えます)(そうでない場合は、回答を更新します)。selectfocus

オートコンプリートウィジェットは、リストアイテムにitem.autocompleteデータが関連付けられていることを内部的に想定しています。エラーを回避するために、適切なデータを使用して「カテゴリ」アイテムを作成できます。これにより、イベントに対応し、selectイベントで発生するエラーを取り除くことができますfocus

更新されたウィジェットコード:

$.widget("custom.catcomplete", $.ui.autocomplete, {
    _renderMenu: function(ul, items) {
        var searchkey = "";
        var itemtype = "";
        var searchtype = "";

        var self = this,
            currentCategory = "";
        $.each(items, function(index, item) {
            if (typeof item.kelime != 'undefined') {
                searchkey = item.kelime;
            }
            if (item.category != currentCategory) {
                if (item.category == "Bölge" || item.category == "Şehir") {
                    itemtype = "cat-bolgeler";
                } else if (item.category == "Otel") {
                    itemtype = "cat-oteller";
                    searchtype = "otel";
                } else if (item.category == "Yurt Dışı Tur") {
                    itemtype = "cat-ydtur";
                    searchtype = "yurtdisitur";
                } else if (item.category == "Yurt İçi Tur") {
                    itemtype = "cat-yitur";
                    searchtype = "yurticitur";
                } else if (item.category == "Cruise") {
                    itemtype = "cat-cruise";
                    searchtype = "cruise";
                }
                if (searchtype != "") {
                    ul.append($("<li class='ui-autocomplete-category " + itemtype + "' id='" + item.searchid + "'><a href='/arama/" + searchkey + "?k=" + searchtype + "&q=" + searchkey + "'>" + item.category + "</a></li>").data("item.autocomplete", {}));
                } else {
                    ul.append($("<li class='ui-autocomplete-category " + itemtype + "' id='" + item.searchid + "'>" + item.category + "</li>").data("item.autocomplete", {}));
                }
                currentCategory = item.category;
            }
            self._renderItem(ul, item);
        });
    }
});

例: http: //jsfiddle.net/J5rVP/20/

于 2012-12-07T17:18:57.777 に答える