(function ($) {
$.widget("custom.combobox", {
_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({
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"
});
},
_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")
.mousedown(function () {
wasOpen = input.autocomplete("widget").is(":visible");
})
.click(function () {
input.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 matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
response(this.element.children("option").map(function () {
var text = $(this).text();
if (this.value && (!request.term || matcher.test(text))) return {
label: text,
value: text,
option: this
};
}));
},
_removeIfInvalid: function (event, ui) {
// Selected an item, nothing to do
if (ui.item) {
return;
}
// Search for a match (case-insensitive)
var value = this.input.val(),
valueLowerCase = value.toLowerCase(),
valid = false;
this.element.children("option").each(function () {
if ($(this).text().toLowerCase() === valueLowerCase) {
this.selected = valid = true;
return false;
}
});
// Found a match, nothing to do
if (valid) {
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 = "";
},
// added- inserted refresh function -BD
refresh: function () {
selected = this.element.children(":selected");
this.input.val(selected.text());
},
_destroy: function () {
this.wrapper.remove();
this.element.show();
}
});
})(jQuery);
$(function () {
$("#one").append($('<option selected></option>').val('1').html('1'));
$("#one").append($('<option></option>').val('2').html('2'));
$("#one").combobox({
select: function (event, ui) {
updateTwo($(this).val());
}
});
// added- update one box value and refresh ui -BD
$("#two").combobox();
$("#one").val("1").combobox("refresh");
updateTwo($("#one").val());
$(".custom-combobox-input:eq(1)").css("width","400px");
});
function updateTwo(arg1) {
$("#two").empty();
if (arg1 == "1") {
$("#two").append($('<option selected></option>').val('1.1').html('1.1'));
$("#two").append($('<option></option>').val('1.2').html('1.2'));
} else if (arg1 == "2") {
$("#two").append($('<option selected></option>').val('2.1').html('2.1'));
$("#two").append($('<option></option>').val('2.2').html('2.2'));
}
// added- update second box value and refresh ui -BD
$("#two").val("").combobox("refresh");
}
.custom-combobox {
position: relative;
display: inline-block;
}
.custom-combobox-toggle {
position: absolute;
top: 0;
bottom: 0;
margin-left: -1px;
padding: 0;
}
.custom-combobox-input {
margin: 0;
padding: 5px 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<div class="ui-widget">
<select id="one"></select>
<br/>
<select id="two"></select>
</div>
About the "combobox" it is actually better to call it
select
or elsedropdown
which is aselect
jQuery custom. Because theselect
is the element responsible for acting this way in HTML. Another thing is that apparently your html is incomplete because you reference the class.custom-combobox-input
but does not use in your html code provided here in your question. Provide a larger fraction of the code so you can get answers.– Paulo Roberto Rosa
However, a way of referencing the second
select
, would be through this selector (based on your question html):select[name=selcidade] { }
or else by id:#cmbcidade { }
– Paulo Roberto Rosa
Using the example code of Jquery-UI is actually used an INPUT field (where values can be entered and which is fetched in JSON) and Jquery lists as if it were a select. I think you can better understand in the following example where I used/
– Junior1967
That way you presented in the fiddle, I believe that using
.custom-combobox-input:nth-child(1)
for the state combo and.custom-combobox-input:nth-child(2)
for the city combo would be an option.– Paulo Roberto Rosa