Отключение jQuery ComboBox при инициализации страницы. Повторное включение комбинированного списка [StreetName] в зависимости от значения комбинированного списка [Почтовый индекс] - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь разместить 4 ComboBox на своей веб-странице.

Когда страница загружает [Инициализация], должен быть включен только один комбинированный список [Почтовый индекс], а все остальные [StreetName, Suburb, State] должны быть отключены.

Теперь, когда я выбираю действительное значение из выпадающего списка автозаполнения элемента комбинированного списка Postcode, я хочу, чтобы активировался только комбинированный список [Streetname].

Аналогичным образом, когда я выбираю действительное значение в раскрывающемся списке автозаполнения элемента комбинированного списка StreetName, я хочу включить только комбинированный список [Suburb]. Точно так же было бы в случае со списком [State].

Я до сих пор настраивал уже доступный код для AutoComplete ComboBox на веб-сайте jQuery (https://jqueryui.com/autocomplete/#combobox).

Я также вставляюприведенный ниже код для моего файла combobox.js и моего файла cshtml.


combobox.js

$(function () {
    $.widget("custom.combobox", {
        options: {
            source: function (request, response) { console.error('source not defined') },
            select: function (event, ui) { },
            change: function (event, ui) { },
            showTitleForAllItems: true,
            showAllTitleText: 'Show All Items'
        },
        _cache: [],
        _create: function () {
            this.wrapper = $("<span>")
              .addClass("custom-combobox")
              .insertAfter(this.element);

            this.element.hide();
            this._createAutocomplete();
            this._createShowAllButton();
        },

        _createAutocomplete: function () {
            var selected = this.element.children(":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({
                  classes: {
                      "ui-tooltip": "ui-state-highlight"
                  }
              });

            this._on(this.input, {
                autocompleteselect: function (event, ui) {
                    //ui.item.value.selected = true;
                    this._trigger("select", event, {
                        item: ui.item.value
                    });
                },

                autocompletechange: "_removeIfInvalid"
            });
        },

        _createShowAllButton: function () {
            var input = this.input,
              wasOpen = false;

            $("<a>")
              .attr("tabIndex", -1)
              .attr("title", "Show All Items")
              .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")
              .on("mousedown", function () {
                  wasOpen = input.autocomplete("widget").is(":visible");
              })
              .on("click", function () {
                  input.trigger("focus");

                  // Close if already visible
                  if (wasOpen) {
                      return;
                  }

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

        _source: function (request, response) {
            var that = this;
            var data = this.options.source(request, function (data) {

                that._cache = that._cache.concat(data);
                response(data)
            });

        },

        _removeIfInvalid: function (event, ui) {

            // Selected an item, nothing to do
            if (ui.item)
            {
                this.options.change(event, ui);
                return;
            }

            // Search for a match (case-insensitive)
            var value = this.input.val(),
              valueLowerCase = value.toLowerCase(),
              valid = false;
            this._cache.forEach(function (item) {
                if (item.toLowerCase() === valueLowerCase) {
                    this.selected = valid = true;
                    return false;
                }
            });

            // Found a match, nothing to do
            if (valid)
            {
                //this.options.change(event, ui);
                return;
            }

            // Remove invalid value
            this.input
              .val("")
              .attr("title", value + " didn't match any item")
              .tooltip("open");
            this.element.val("");
            this._delay(function () {
                this.input.tooltip("close").attr("title", "");
            }, 2500);
            this.input.autocomplete("instance").term = "";
        },

        _destroy: function () {
            this.wrapper.remove();
            this.element.show();
        }
});

});


cshtml

<div class="shipping-information-block-right">
            <div class="shopping-cart-cehckout-form-left-inner-right">
                Postcode:<br>
                <input type="text" id="Postcode" name="Postcode">
            </div>
            <div class="clearfix"></div>
            <div class="shopping-cart-cehckout-form-left-inner-left">
                @*<label>Street Name<span class="red-star">*</span></label>*@
            </div>
            <div class="shopping-cart-cehckout-form-left-inner-right">
                Street Name:<br>
                <input type="text" id="StreetName" name="StreetName">
                <br><br>
            </div>
            <div class="clearfix"></div>
            <div class="shopping-cart-cehckout-form-left-inner-left">
                @*<label>Suburb<span class="red-star">*</span></label>*@
            </div>
            <div class="shopping-cart-cehckout-form-left-inner-right">
                Suburb<br>
                <input type="text" id="Suburb" name="Suburb">
                <br><br>
            </div>
            <div class="clearfix"></div>

            <div class="shopping-cart-cehckout-form-left-inner-left">
                @*<label>State<span class="red-star">*</span></label>*@
            </div>
            <div class="shopping-cart-cehckout-form-left-inner-right">
                State:<br>
                <input type="text" id="State" name="State">
                <br><br>
            </div>

        </div>

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
    $(document).ready(function () {
        $('#StreetName').attr("disabled", "disabled");
        $('#Suburb').attr("disabled", "disabled");
        $('#State').attr("disabled", "disabled");

        $('#Postcode').combobox({
            source: function (request, response) {
                debugger;
                var data = [];
                $.ajax({
                    url: "/en/B2B/Menu/Online-Shop/Online-Payment/Shipping/GetAddressDetails",
                    dataType: "json",
                    data: {
                        PostCode: request.term
                    },
                    success: function (data) {
                        //$.each(data.Entity, function(index, value) {
                        //    temporary[i++] = value.PostCode;
                        //})
                        //dbData = jQuery.unique(temporary);
                        var data = $.map(data.Entity, function (item) {
                            return item.PostCode;
                        });
                        response(data);
                        debugger;
                    },
                    error: function (error) {
                        debugger;
                    }
                });

            },
            change: function (event, ui) {
                if (ui.item == null) {
                    debugger;
                    $('#StreetName').attr("disabled", "disabled");
                }
                else
                {
                    debugger;
                    $(function () {
                        $('#StreetName').removeAttr("disabled");
                    });
                }
            }
        });
        if ($('#StreetName').attr("disabled", "disabled")) {
            debugger;
            $("#StreetName").closest(".ui-widget").find("input, button").prop("disabled", true);
        }
        else {
            $('#StreetName').combobox({
                disabled: true,
                source: function (request, response) {
                    debugger;
                    var data = [];
                    $.ajax({
                        url: "/en/B2B/Menu/Online-Shop/Online-Payment/Shipping/GetAddressDetails",
                        dataType: "json",
                        data: {
                            StreetName: request.term
                        },
                        success: function (data) {
                            //$.each(data.Entity, function(index, value) {
                            //    temporary[i++] = value.PostCode;
                            //})
                            //dbData = jQuery.unique(temporary);
                            var data = $.map(data.Entity, function (item) {
                                return item.StreetName;
                            });
                            response(data);
                            debugger;
                        },
                        error: function (error) {
                            debugger;
                        }
                    });

                }
            });
        }

        if ($('#Suburb').attr("disabled", "disabled")) {
            debugger;
            $("#Suburb").closest(".ui-widget").find("input, button").prop("disabled", true);
        }
        else {
            $('#Suburb').combobox({
                source: function (request, response) {
                    debugger;
                    var data = [];
                    $.ajax({
                        url: "/en/B2B/Menu/Online-Shop/Online-Payment/Shipping/GetAddressDetails",
                        dataType: "json",
                        data: {
                            Suburb: request.term
                        },
                        success: function (data) {
                            //$.each(data.Entity, function(index, value) {
                            //    temporary[i++] = value.PostCode;
                            //})
                            //dbData = jQuery.unique(temporary);
                            var data = $.map(data.Entity, function (item) {
                                return item.Suburb;
                            });
                            response(data);
                            debugger;
                        },
                        error: function (error) {
                            debugger;
                        }
                    });

                }
            });
        }
        if ($('#State').attr("disabled", "disabled")) {
            debugger;
            $("#State").parent().find("input.ui-autocomplete-input").autocomplete("option", "disabled", true).prop("disabled", true);
            $("#State").parent().find("a.ui-button").button("disable");
        }
        else {
            $('#State').combobox({
                source: function (request, response) {
                    debugger;
                    var data = [];
                    $.ajax({
                        url: "/en/B2B/Menu/Online-Shop/Online-Payment/Shipping/GetAddressDetails",
                        dataType: "json",
                        data: {
                            State: request.term
                        },
                        success: function (data) {
                            //$.each(data.Entity, function(index, value) {
                            //    temporary[i++] = value.PostCode;
                            //})
                            //dbData = jQuery.unique(temporary);
                            var data = $.map(data.Entity, function (item) {
                                return item.State;
                            });
                            response(data);
                            debugger;
                        },
                        error: function (error) {
                            debugger;
                        }
                    });

                }
            });
        }
    });
</script>

1 Ответ

0 голосов
/ 17 октября 2019

Настоящим я упоминаю изменения, которые я внес в мой код в обоих файлах, чтобы сделать функциональность, как и ожидалось. Я надеюсь, что это поможет кому-то, кто ищет такую ​​же функциональность.

cshtml файл

Все поля со списками аналогичны этим, кроме поля со списком почтовых индексов. В почтовом коде Combobox включен true, поскольку это требуется при загрузке страницы.

$('#StreetName').combobox({
            enabled: false,
                source: function (request, response) {
                    debugger;
                    var data = [];
                    $.ajax({
                        url: "/en/B2B/Menu/Online-Shop/Online-Payment/Shipping/GetAddressDetails",
                        dataType: "json",
                        data: {
                            StreetName: request.term
                        },
                        success: function (data) {
                            //$.each(data.Entity, function(index, value) {
                            //    temporary[i++] = value.PostCode;
                            //})
                            //dbData = jQuery.unique(temporary);
                            var data = $.map(data.Entity, function (item) {
                                return item.StreetName;
                            });
                            response(data);
                            debugger;
                        },
                        error: function (error) {
                            debugger;
                        }
                    });

                },
                change: function (event, ui) {

                    if (ui.item == null) {
                        debugger;
                        $("#Suburb").combobox("toggleState", false);
                    }
                    else {
                        debugger;
                        $("#Suburb").combobox("toggleState", true);
                    }
                },
                change: function (valid) {
                    if (valid) {
                        $("#Suburb").combobox("toggleState", true);
                    }
                    else {
                        $("#Suburb").combobox("toggleState", false);
                    }
                }
            });

В файле библиотеки combobox.js я изменил параметры, а также функцию create итакже раздел, где он обрабатывает недопустимое значение, пожалуйста, см. для вашей справки.

combobox.js

$(function () {
    $.widget("custom.combobox", {
        options: {
            source: function (request, response) { console.error('source not defined') },
            select: function (event, ui) { },
            change: function (event, ui) { },
            change: function (valid) { },
            enabled: true, 
            showTitleForAllItems: true,
            showAllTitleText: 'Show All Items',
        },
        toggleState: function (state) {
            if(state)
            {
                this.input.prop('disabled', false);
                this.input.autocomplete("enable");
                this.a.prop("enable");
            }
            else
            {
                this.input.prop('disabled', true);
                this.input.autocomplete("disable");
                this.a.prop("disable");
            }
        },
        _cache: [],
        _create: function () {
            this.wrapper = $("<span>")
              .addClass("custom-combobox")
              .insertAfter(this.element);

            this.element.hide();
            this._createAutocomplete();
            this._createShowAllButton();
            this._enabled();
        },

        _enabled: function ()
        {
            if (this.options.enabled)
            {
                this.toggleState(true);
            }
            else
            {
                this.toggleState(false);
            }
        },

        _createAutocomplete: function () {
            var selected = this.element.children(":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({
                  classes: {
                      "ui-tooltip": "ui-state-highlight"
                  }
              });

            this._on(this.input, {
                autocompleteselect: function (event, ui) {
                    //ui.item.value.selected = true;
                    this._trigger("select", event, {
                        item: ui.item.value
                    });
                },

                autocompletechange: "_removeIfInvalid"
            });
        },

        _createShowAllButton: function () {
            var input = this.input,
              wasOpen = false;
            this.a = $("<a>").attr("tabIndex", -1);
            if (this.options.showTitleForAllItems) {
                btn = $(this.a)
                .attr("title", this.options.showAllTitleText)
              .tooltip()
            }
            $(this.a)
              .appendTo(this.wrapper)
              .button({
                  icons: {
                      primary: "ui-icon-triangle-1-s"
                  },
                  text: false
              })
              .removeClass("ui-corner-all")
              .addClass("custom-combobox-toggle ui-corner-right")
              .on("mousedown", function () {
                  wasOpen = input.autocomplete("widget").is(":visible");
              })
              .on("click", function () {
                  input.trigger("focus");

                  // Close if already visible
                  if (wasOpen) {
                      return;
                  }

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

        _source: function (request, response) {
            var that = this;
            var data = this.options.source(request, function (data) {

                that._cache = that._cache.concat(data);
                response(data)
            });

        },

        _removeIfInvalid: function (event, ui) {

            // Selected an item, nothing to do
            if (ui.item)
            {
                this.options.change(event, ui);
                return;
            }

            // Search for a match (case-insensitive)
            var value = this.input.val(),
              valueLowerCase = value.toLowerCase(),
              valid = false;
            this._cache.forEach(function (item) {
                if (item.toLowerCase() === valueLowerCase) {
                    this.selected = valid = true;
                    return false;
                }
            });

            // Found a match, nothing to do
            if (valid)
            {
                this.options.change(valid);
                return;
            }
            else
            {
                this.options.change(valid);
            }

            // Remove invalid value
            this.input
              .val("")
              .attr("title", value + " didn't match any item")
              .tooltip("open");
            this.element.val("");
            this._delay(function () {
                this.input.tooltip("close").attr("title", "");
            }, 2500);
            this.input.autocomplete("instance").term = "";
        },

        _destroy: function () {
            this.wrapper.remove();
            this.element.show();
        }
    });

});
...