87,919
社区成员
发帖
与我相关
我的任务
分享
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>下拉选项</title>
<style>
body {
margin: 0;
padding: 0;
background-color: #CCCCCC;
}
.wrapper {
width: 960px;
margin: 20px auto;
padding: 10px;
text-align: center;
background-color: #FFFFFF;
}
.wrapper div[class^='sel-'] {
display: inline;
}
.wrapper select {
font-size: 16px;
margin-right: 10px;
}
</style>
</head>
<script src="http://lib.sinaapp.com/js/jquery/1.8.3/jquery.min.js"></script>
<script>
//模拟JSON数据
var data = "{\"total\":10,\"row\":[{\"option\":\"选项1\",\"value\":\"option1\"},{\"option\":\"选项2\",\"value\":\"option2\"},{\"option\":\"选项3\",\"value\":\"option3\"},{\"option\":\"选项4\",\"value\":\"option4\"},{\"option\":\"选项5\",\"value\":\"option5\"},{\"option\":\"选项6\",\"value\":\"option6\"},{\"option\":\"选项7\",\"value\":\"option7\"},{\"option\":\"选项8\",\"value\":\"option8\"},{\"option\":\"选项9\",\"value\":\"option9\"},{\"option\":\"选项10\",\"value\":\"option10\"}]}";
</script>
<body>
<div class="wrapper">
<div class="sel-0">
<span>第1获奖人:</span>
<select id='sel-0'>
<option value="-1">请选择</option>
</select>
</div>
</div>
</body>
<script>
//IE6 IE7需要兼容JSON,这里没有做
var items = JSON.parse(data),
tempItems = items['row'],
removeItems = [];
//初始化第一个选项
makeOptions(items['row'], $('#sel-0'));
$('body').on('change', 'select', function() {
var selectDom = $(this),
id = selectDom.attr('id').substring(4), //清除前缀'sel-'
selectVal = selectDom.children('option:selected').val(),
nextId = parseInt(id) + 1;
for (var l = 0; l < removeItems.length; l++) {
if (removeItems[l].id == id) {
tempItems.push(removeItems[l].option);
removeItems.splice(l,1);
}
}
//清除选择的select后面的select(如果有),并且更新选项数据tempItems
for (var i = nextId; i < items['row'].length; i++) {
if ($('.sel-' + i).length > 0) {
for (var j = 0; j < removeItems.length; j++) {
if (removeItems[j].id == nextId) {
tempItems.push(removeItems[j].option);
removeItems.splice(j,1);
}
}
$('.sel-' + i).remove();
}
}
tempItems.sort(function(a, b) {
if (parseInt(a.value.substring(6)) > parseInt(b.value.substring(6))) {
return 1;
} else {
return -1
}
return 0;
});
tempItems = removeDataItem(tempItems, selectVal, id);
if (selectVal == -1) {
//不需要创建select
return;
}
//生成下一级select
var newDiv = $('<div></div>').attr('class', 'sel-' + nextId),
newSelect = $('<select></select>').attr('id', 'sel-' + nextId);
$('<span></span>').text('第' + (parseInt(id) + 2) + '获奖人: ').appendTo(newDiv);
$('<option></option>').attr('value', '-1').text('请选择').appendTo(newSelect);
makeOptions(tempItems, newSelect);
newSelect.appendTo(newDiv);
newDiv.appendTo($('.wrapper')[0]);
});
//给定对象下创建option
function makeOptions(data, parent) {
var data = data || {};
$.each(data, function(index, value) {
$('<option></option>').val(value['value']).text(value['option']).appendTo(parent);
});
}
//对应value值在data中清除,并存入removeItems中
function removeDataItem(data, val, id) {
var data = data || {},
k = -1;
$.each(data, function(index,value) {
if(value['value'] == val){
k=index;
}
});
if (k > -1) {
var temp = data.splice(k, 1);
removeItems.push({
id: id,
option: temp[0]
});
}
return data;
}
</script>
</html>
功能是實現了,個人感覺效率不高,說說我的思路吧。
用兩個數組(tempItems,removeItems)分別存未使用的選項,和已經選擇的選項(對應還有哪個selec)。當觸發了下拉選擇,則先把自身的select選項改變(removeItems中清掉當前select的選項),然後逐一清除後面的select(同時將他們的select選項也從removeItems中放到tempItems中),然後從tempItems刪除當前新的選項值並放到removeItems中,生成新的下一級select。