javascript - 依赖多选框
问题描述
我使用的代码主要来自这个答案https://stackoverflow.com/a/29624809/9481131
正在进行的代码:
HTML
<label style="font-weight: bold">Choose the literary genres</label>
<select name="genre" id="genre" multiple>
<option value="all">All genres</option>
<option value="classic">Classic</option>
<option value="romance">Romance</option>
<option value="sciencefiction">Science fiction</option>
</select>
<label style="font-weight: bold">Choose the books</label>
<select disabled="disabled" class="subcat" id="book" name="book" multiple>
<option value>All books</option>
<!-- Classic books -->
<optgroup data-rel="classic">
<option value="classic_book_1">classic book 1</option>
<option value="classic_book_2">classic book 2</option>
<option value="classic_book_3">classic book 3</option>
</optgroup>
<!-- Romance books-->
<optgroup data-rel="romance">
<option value="romance_book_1">romance book 1</option>
<option value="romance_book_2">romance book 2</option>
<option value="romance_book_3">romance book 3</option>
</optgroup>
<!-- Science fiction books-->
<optgroup data-rel="sciencefiction">
<option value="sciencefiction_book_1">science fiction book 1</option>
<option value="sciencefiction_book_2">science fiction book 2</option>
<option value="sciencefiction_book_3">science fiction book 3</option>
</optgroup>
</select>
Javascript
<script>
$(function(){
var $cat = $("#genre"),
$subcat = $("#book");
var optgroups = {};
$subcat.each(function(i,v){
var $e = $(v);
var _id = $e.attr("id");
optgroups[_id] = {};
$e.find("optgroup").each(function(){
var _r = $(this).data("rel");
$(this).find("option").addClass("is-dyn");
optgroups[_id][_r] = $(this).html();
});
});
$subcat.find("optgroup").remove();
var _lastRel;
$cat.on("change",function(){
var _rel = $(this).val();
if(_lastRel === _rel) return true;
_lastRel = _rel;
$subcat.find("option").attr("style","");
$subcat.val("");
$subcat.find(".is-dyn").remove();
if(!_rel) return $subcat.prop("disabled",true);
$subcat.each(function(){
var $el = $(this);
var _id = $el.attr("id");
$el.append(optgroups[_id][_rel]);
});
$subcat.prop("disabled",false);
});
});
</script>
在这里看小提琴:http: //jsfiddle.net/53tL7jhf/
总而言之,我有两个选择框(每个框中都有多选的可能性)。第二个选择框中的数据取决于第一个框中选择的数据。
我想要的是:
- 然后在第一个框中选择“所有流派”,第二个框显示所有书籍。像这样:
|----------------------------|--------------------|
| Choose the literary genres | Choose the books |
|----------------------------|--------------------|
| All genres (SELECTED) | All books |
|----------------------------|--------------------|
| | classic book 1 |
|----------------------------|--------------------|
| | classic book 2 |
|----------------------------|--------------------|
| | classic book 3 |
|----------------------------|--------------------|
| | romance book 1 |
|----------------------------|--------------------|
| | romance book 2 |
|----------------------------|--------------------|
| | romance book 3 |
|----------------------------|--------------------|
| | sci fiction book 1 |
|----------------------------|--------------------|
| | sci fiction book 2 |
|----------------------------|--------------------|
| | etc. |
|----------------------------|--------------------|
- 然后在第一个框中选择了多个流派,第二个框显示所有选定流派的书籍。像这样:
|----------------------------|--------------------|
| Choose the literary genres | Choose the books |
|----------------------------|--------------------|
| Classic (SELECTED) | All books |
|----------------------------|--------------------|
| Science fiction (SELECTED) | classic book 1 |
|----------------------------|--------------------|
| | classic book 2 |
|----------------------------|--------------------|
| | classic book 3 |
|----------------------------|--------------------|
| | sci fiction book 1 |
|----------------------------|--------------------|
| | sci fiction book 2 |
|----------------------------|--------------------|
| | sci fiction book 3 |
|----------------------------|--------------------|
提前感谢您的帮助。
解决方案
因为,你已经mutliple
在你的选择框中使用了,所以返回的值在array
。如果你要console.log($(this).val())
输出进来的是(数组),即:[..]
。所以,目前你的代码只取一个值而不是其他值。相反,你可以each
再次使用循环来也迭代该数组值。
演示代码:
$(function() {
var $cat = $("#genre"),
$subcat = $("#book");
var optgroups = {};
$subcat.each(function(i, v) {
var $e = $(v);
var _id = $e.attr("id");
optgroups[_id] = {};
$e.find("optgroup").each(function() {
var _r = $(this).data("rel");
$(this).find("option").addClass("is-dyn");
optgroups[_id][_r] = $(this).html();
});
});
$subcat.find("optgroup").remove();
var _lastRel;
$cat.on("change", function() {
var _rel = $(this).val();
if (_lastRel === _rel) return true;
_lastRel = _rel;
$subcat.find("option").attr("style", "");
$subcat.val("");
$subcat.find(".is-dyn").remove();
if (!_rel) return $subcat.prop("disabled", true);
$subcat.each(function() {
var $el = $(this);
var _id = $el.attr("id");
//if arrray contains all option
if (_rel.indexOf("all") > -1) {
//loop though options
$("#genre option").each(function() {
//append options in other selects
$el.append(optgroups[_id][$(this).val()]);
})
} else {
//loop through values got from selctbox
$(_rel).each(function(index, value) {
$el.append(optgroups[_id][value]); //passs that value
}) //close
}
});
$subcat.prop("disabled", false);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label style="font-weight: bold">Choose the literary genres</label>
<select name="genre" id="genre" multiple>
<option value="all">All genres</option>
<option value="classic">Classic</option>
<option value="romance">Romance</option>
<option value="sciencefiction">Science fiction</option>
</select>
<label style="font-weight: bold">Choose the books</label>
<select disabled="disabled" class="subcat" id="book" name="book" multiple>
<option value>All books</option>
<!-- Home Ware -->
<optgroup data-rel="classic">
<option value="classic_book_1">classic book 1</option>
<option value="classic_book_2">classic book 2</option>
<option value="classic_book_3">classic book 3</option>
</optgroup>
<!-- Education -->
<optgroup data-rel="romance">
<option value="romance_book_1">romance book 1</option>
<option value="romance_book_2">romance book 2</option>
<option value="romance_book_3">romance book 3</option>
</optgroup>
<!-- Books -->
<optgroup data-rel="sciencefiction">
<option value="sciencefiction_book_1">science fiction book 1</option>
<option value="sciencefiction_book_2">science fiction book 2</option>
<option value="sciencefiction_book_3">science fiction book 3</option>
</optgroup>
</select>
推荐阅读
- java - 在 LineBreakMeasurer 中没有堆栈跟踪的 ClassCastException
- office365 - 如何使用 Onenote Graph API 删除和重命名笔记本名称
- c# - C# - 进程 - 异步 - 读取所有输出
- c++ - 是否可以制作结构节点类型的数组?
- mongodb - 运行 expres 程序时出现加载错误页面
- eclipse - 如何放大 Eclipse 工具栏?
- php - PHP 查询非活动分钟数计入会话超时
- c# - 打包大量大文件以供下载的最佳方法?
- angular - 如何在 Angular 5 中缓存 http 请求?
- android - 在 Oreo 8.0 中解析包错误