【发布时间】:2016-02-12 01:18:20
【问题描述】:
使用 jQuery ComboBox,我有一个 Google Suggests 和 html 下拉菜单之类的组合,在它下面我需要根据所选内容显示和隐藏信息。
Within the dropdown I have US states and when one is selected I need to show it's corresponding city.城市在 html 代码中现在设置为不显示。不知何故,我需要添加 display: block;当用户从下拉列表中选择一个状态时。谁能分享一些关于如何实现这一点的见解?
这是我的代码
(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 = "";
},
_destroy: function() {
this.wrapper.remove();
this.element.show();
}
});
})(jQuery);
$(function() {
$("#combobox").combobox();
$("#toggle").click(function() {
$("#combobox").toggle();
});
});
$(document).ready(function() {
$('.box').hide();
$('#ui-id-1').change(function() {
$('.box').show();
});
});
*:focus {
outline: 0;
}
.custom-combobox {
position: relative;
display: inline-block;
width: 100%;
}
.custom-combobox-toggle {
position: absolute;
top: 0;
bottom: 0;
margin-left: -1px;
padding: 0;
border-radius: 0px 5px 5px 0px;
background-color: #E0E0E0;
}
.custom-combobox-input {
margin: 0;
padding: 5px 10px;
border-radius: 5px 0px 0px 5px;
width: 88%;
}
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<link href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet" />
<div class="ui-widget">
<select id="combobox" name="combobox">
<option value="0">Find your state</option>
<option value="1">Alabama</option>
<option value="2">Alaska</option>-->
<option value="3">Arkansas</option>
<option value="4">Arizona</option>
<option value="5">California</option>
<option value="6">Colorado</option>
<option value="7">Connecticut</option>
<option value="8">Delaware</option>
<option value="9">Florida</option>
<option value="10">Georgia</option>
<option value="11">Hawaii</option>
<option value="12">Idaho</option>
<option value="13">Illinois</option>
<option value="14">Indiana</option>
<option value="15">Iowa</option>
<option value="16">Kansas</option>
<option value="17">Kentucky</option>
<option value="18">Louisiana</option>
<option value="19">Maine</option>
<option value="20">Maryland</option>
<option value="21">Massachusetts</option>
</select>
<ul>
<li id="1" class="box">
Birmingham
</li>
<li id="2" class="box">
Juneau
</li>
<li id="3" class="box">
Little Rock
</li>
<li id="4" class="box">
Flagstaff
</li>
<li id="5" class="box">
Sacremento
</li>
<li id="6" class="box">
Denver
</li>
<li id="7" class="box">
Hartford
</li>
<li id="8" class="box">
Dover
</li>
<li id="9" class="box">
Orlando
</li>
<li id="10" class="box">
Atlanta
</li>
<li id="11" class="box">
Honolulu
</li>
<li id="12" class="box">
Boise
</li>
<li id="13" class="box">
Chicago
</li>
<li id="14" class="box">
Indianapolis
</li>
<li id="15" class="box">
Cedar Rapids
</li>
<li id="16" class="box">
Kansas City
</li>
<li id="17" class="box">
Louisville
</li>
<li id="18" class="box">
New Orleans
</li>
<li id="19" class="box">
Austuga
</li>
<li id="20" class="box">
Annapolis
</li>
<li id="21" class="box">
Boston
</li>
</ul>
</div>
不确定 sn-p 是否正常工作,但我的 Fiddle 是否正常工作。
【问题讨论】:
-
你如何将州映射到城市?
-
当您检查元素时,您会看到组合框的代码通过
- 生成实际的下拉列表,其中每个状态都是它自己的
- 。每个 都有它自己的唯一 id .. 像 id="ui-id-4" , id="ui-id-5," 等等 .. 但是每次你点击下拉列表时,唯一的 id 数字都会改变一个增加了 19。各州只有静态数字 ID,例如
- 、
- 等。每次单击下拉菜单时,jQuery UI 代码都会强制 ui-id- 数字动态更改,这让我感到困惑。
标签: jquery jquery-ui combobox show-hide